48
48
using namespace Jack;
50
#define SELF_CONNECT_MODE_ALLOW_CHAR ' '
51
#define SELF_CONNECT_MODE_FAIL_EXTERNAL_ONLY_CHAR 'E'
52
#define SELF_CONNECT_MODE_IGNORE_EXTERNAL_ONLY_CHAR 'e'
53
#define SELF_CONNECT_MODE_FAIL_ALL_CHAR 'A'
54
#define SELF_CONNECT_MODE_IGNORE_ALL_CHAR 'a'
55
#define SELF_CONNECT_MODES_COUNT 5
50
57
struct jackctl_server
78
85
/* int32_t, msecs; if zero, use period size. */
79
86
union jackctl_parameter_value client_timeout;
80
87
union jackctl_parameter_value default_client_timeout;
82
89
/* uint32_t, clock source type */
83
90
union jackctl_parameter_value clock_source;
84
91
union jackctl_parameter_value default_clock_source;
86
93
/* uint32_t, max port number */
87
94
union jackctl_parameter_value port_max;
88
95
union jackctl_parameter_value default_port_max;
91
98
union jackctl_parameter_value replace_registry;
92
99
union jackctl_parameter_value default_replace_registry;
94
101
/* bool, synchronous or asynchronous engine mode */
95
102
union jackctl_parameter_value sync;
96
103
union jackctl_parameter_value default_sync;
105
/* char enum, self connect mode mode */
106
union jackctl_parameter_value self_connect_mode;
107
union jackctl_parameter_value default_self_connect_mode;
108
jack_driver_param_value_enum_t self_connect_mode_possible_values[SELF_CONNECT_MODES_COUNT];
109
jack_driver_param_constraint_desc_t self_connect_mode_constraint;
99
112
struct jackctl_driver
450
463
jackctl_setup_signals(
451
464
unsigned int flags)
453
if ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
466
if ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
454
467
jack_error("CreateEvent fails err = %ld", GetLastError());
458
(void) signal(SIGINT, do_nothing_handler);
471
(void) signal(SIGINT, do_nothing_handler);
459
472
(void) signal(SIGABRT, do_nothing_handler);
460
473
(void) signal(SIGTERM, do_nothing_handler);
462
return (sigset_t)waitEvent;
475
return (sigset_t)waitEvent;
465
478
void jackctl_wait_signals(sigset_t signals)
467
if (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) {
480
if (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) {
468
481
jack_error("WaitForSingleObject fails err = %ld", GetLastError());
539
552
* explicitly reset it
542
pthread_sigmask(SIG_BLOCK, &signals, 0);
555
pthread_sigmask(SIG_BLOCK, &signals, 0);
544
557
/* install a do-nothing handler because otherwise pthreads
545
558
behaviour is undefined when we enter sigwait.
788
801
goto fail_free_parameters;
804
server_ptr->self_connect_mode_constraint.flags = JACK_CONSTRAINT_FLAG_STRICT | JACK_CONSTRAINT_FLAG_FAKE_VALUE;
805
server_ptr->self_connect_mode_constraint.constraint.enumeration.count = SELF_CONNECT_MODES_COUNT;
806
server_ptr->self_connect_mode_constraint.constraint.enumeration.possible_values_array = server_ptr->self_connect_mode_possible_values;
808
server_ptr->self_connect_mode_possible_values[0].value.c = SELF_CONNECT_MODE_ALLOW_CHAR;
809
strcpy(server_ptr->self_connect_mode_possible_values[0].short_desc, "Don't restrict self connect requests");
811
server_ptr->self_connect_mode_possible_values[1].value.c = SELF_CONNECT_MODE_FAIL_EXTERNAL_ONLY_CHAR ;
812
strcpy(server_ptr->self_connect_mode_possible_values[1].short_desc, "Fail self connect requests to external ports only");
814
server_ptr->self_connect_mode_possible_values[2].value.c = SELF_CONNECT_MODE_IGNORE_EXTERNAL_ONLY_CHAR;
815
strcpy(server_ptr->self_connect_mode_possible_values[2].short_desc, "Ignore self connect requests to external ports only");
817
server_ptr->self_connect_mode_possible_values[3].value.c = SELF_CONNECT_MODE_FAIL_ALL_CHAR;
818
strcpy(server_ptr->self_connect_mode_possible_values[3].short_desc, "Fail all self connect requests");
820
server_ptr->self_connect_mode_possible_values[4].value.c = SELF_CONNECT_MODE_IGNORE_ALL_CHAR;
821
strcpy(server_ptr->self_connect_mode_possible_values[4].short_desc, "Ignore all self connect requests");
823
value.c = SELF_CONNECT_MODE_ALLOW_CHAR;
824
if (jackctl_add_parameter(
825
&server_ptr->parameters,
827
"Self connect mode.",
828
"Whether JACK clients are allowed to connect their own ports",
830
&server_ptr->self_connect_mode,
831
&server_ptr->default_self_connect_mode,
833
&server_ptr->self_connect_mode_constraint) == NULL)
835
goto fail_free_parameters;
791
838
JackServerGlobals::on_device_acquire = on_device_acquire;
792
839
JackServerGlobals::on_device_release = on_device_release;
826
873
EXPORT bool jackctl_server_stop(jackctl_server *server_ptr)
828
875
server_ptr->engine->Stop();
879
EXPORT bool jackctl_server_close(jackctl_server *server_ptr)
829
881
server_ptr->engine->Close();
830
882
delete server_ptr->engine;
856
jackctl_server_start(
857
909
jackctl_server *server_ptr,
858
910
jackctl_driver *driver_ptr)
913
JackSelfConnectMode self_connect_mode;
862
915
rc = jack_register_server(server_ptr->name.str, server_ptr->replace_registry.b);
883
936
if (!server_ptr->realtime.b && server_ptr->client_timeout.i == 0)
884
937
server_ptr->client_timeout.i = 500; /* 0.5 sec; usable when non realtime. */
886
939
/* check port max value before allocating server */
887
940
if (server_ptr->port_max.ui > PORT_NUM_MAX) {
888
941
jack_error("JACK server started with too much ports %d (when port max can be %d)", server_ptr->port_max.ui, PORT_NUM_MAX);
945
switch (server_ptr->self_connect_mode.c)
947
case SELF_CONNECT_MODE_ALLOW_CHAR:
948
self_connect_mode = JackSelfConnectAllow;
950
case SELF_CONNECT_MODE_FAIL_EXTERNAL_ONLY_CHAR:
951
self_connect_mode = JackSelfConnectFailExternalOnly;
953
case SELF_CONNECT_MODE_IGNORE_EXTERNAL_ONLY_CHAR:
954
self_connect_mode = JackSelfConnectIgnoreExternalOnly;
956
case SELF_CONNECT_MODE_FAIL_ALL_CHAR:
957
self_connect_mode = JackSelfConnectFailAll;
959
case SELF_CONNECT_MODE_IGNORE_ALL_CHAR:
960
self_connect_mode = JackSelfConnectIgnoreAll;
963
self_connect_mode = JACK_DEFAULT_SELF_CONNECT_MODE;
892
966
/* get the engine/driver started */
893
967
server_ptr->engine = new JackServer(
894
968
server_ptr->sync.b,
896
970
server_ptr->client_timeout.i,
897
971
server_ptr->realtime.b,
898
972
server_ptr->realtime_priority.i,
899
server_ptr->port_max.ui,
973
server_ptr->port_max.ui,
900
974
server_ptr->verbose.b,
901
975
(jack_timer_type_t)server_ptr->clock_source.ui,
902
977
server_ptr->name.str);
903
978
if (server_ptr->engine == NULL)
913
988
goto fail_delete;
916
rc = server_ptr->engine->Start();
919
jack_error("JackServer::Start() failed with %d", rc);
926
server_ptr->engine->Close();
929
994
delete server_ptr->engine;
930
995
server_ptr->engine = NULL;
1015
jackctl_server_start(
1016
jackctl_server *server_ptr)
1018
int rc = server_ptr->engine->Start();
1019
bool result = rc >= 0;
1022
jack_error("JackServer::Start() failed with %d", rc);
949
1027
EXPORT const char * jackctl_driver_get_name(jackctl_driver *driver_ptr)
951
1029
return driver_ptr->desc_ptr->name;
1181
1259
if (server_ptr->engine != NULL) {
1182
server_ptr->engine->InternalClientLoad(internal->desc_ptr->name, internal->desc_ptr->name, internal->set_parameters, JackNullOption, &internal->refnum, &status);
1260
server_ptr->engine->InternalClientLoad2(internal->desc_ptr->name, internal->desc_ptr->name, internal->set_parameters, JackNullOption, &internal->refnum, -1, &status);
1183
1261
return (internal->refnum > 0);
1194
1272
if (server_ptr->engine != NULL && internal->refnum > 0) {
1273
// Client object is internally kept in JackEngine, and will be desallocated in InternalClientUnload
1195
1274
return ((server_ptr->engine->GetEngine()->InternalClientUnload(internal->refnum, &status)) == 0);
1201
1280
EXPORT bool jackctl_server_add_slave(jackctl_server * server_ptr, jackctl_driver * driver_ptr)
1203
1282
if (server_ptr->engine != NULL) {
1204
driver_ptr->info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, driver_ptr->set_parameters);
1205
return (driver_ptr->info != 0);
1283
if (server_ptr->engine->IsRunning()) {
1284
jack_error("cannot add a slave in a running server");
1287
driver_ptr->info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, driver_ptr->set_parameters);
1288
return (driver_ptr->info != 0);
1211
1295
EXPORT bool jackctl_server_remove_slave(jackctl_server * server_ptr, jackctl_driver * driver_ptr)
1213
1297
if (server_ptr->engine != NULL) {
1214
server_ptr->engine->RemoveSlave(driver_ptr->info);
1215
delete driver_ptr->info;
1298
if (server_ptr->engine->IsRunning()) {
1299
jack_error("cannot remove a slave from a running server");
1302
server_ptr->engine->RemoveSlave(driver_ptr->info);
1303
delete driver_ptr->info;