37 #include "driver_interface.h"
38 #include "JackError.h"
39 #include "JackServer.h"
41 #include "JackTools.h"
42 #include "JackControlAPI.h"
43 #include "JackLockedEngine.h"
44 #include "JackConstants.h"
45 #include "JackDriverLoader.h"
46 #include "JackServerGlobals.h"
53 {
' ',
"Don't restrict self connect requests" },
54 {
'E',
"Fail self connect requests to external ports only" },
55 {
'e',
"Ignore self connect requests to external ports only" },
56 {
'A',
"Fail all self connect requests" },
57 {
'a',
"Ignore all self connect requests" },
131 const char * short_description;
132 const char * long_description;
133 jackctl_param_type_t type;
145 const char * jack_get_self_connect_mode_description(
char mode)
149 for (descr_ptr = self_connect_mode_constraint_descr_array;
152 if (descr_ptr->value == mode)
return descr_ptr->short_desc;
159 jackctl_add_parameter(
160 JSList ** parameters_list_ptr_ptr,
162 const char * short_description,
163 const char * long_description,
164 jackctl_param_type_t type,
173 if (parameter_ptr == NULL)
175 jack_error(
"Cannot allocate memory for jackctl_parameter structure.");
179 parameter_ptr->name = name;
180 parameter_ptr->short_description = short_description;
181 parameter_ptr->long_description = long_description;
182 parameter_ptr->type = type;
183 parameter_ptr->is_set =
false;
185 if (value_ptr == NULL)
187 value_ptr = ¶meter_ptr->value;
190 if (default_value_ptr == NULL)
192 default_value_ptr = ¶meter_ptr->default_value;
195 parameter_ptr->value_ptr = value_ptr;
196 parameter_ptr->default_value_ptr = default_value_ptr;
198 *value_ptr = *default_value_ptr = value;
200 parameter_ptr->driver_ptr = NULL;
201 parameter_ptr->id = 0;
202 parameter_ptr->constraint_ptr = constraint_ptr;
204 *parameters_list_ptr_ptr = jack_slist_append(*parameters_list_ptr_ptr, parameter_ptr);
206 return parameter_ptr;
214 jackctl_free_driver_parameters(
219 while (driver_ptr->parameters)
221 next_node_ptr = driver_ptr->parameters->next;
222 jack_constraint_free(((
jackctl_parameter *)driver_ptr->parameters->data)->constraint_ptr);
223 free(driver_ptr->parameters->data);
224 free(driver_ptr->parameters);
225 driver_ptr->parameters = next_node_ptr;
231 jackctl_add_driver_parameters(
237 jackctl_param_type_t jackctl_type;
241 for (i = 0 ; i < driver_ptr->desc_ptr->
nparams ; i++)
243 descriptor_ptr = driver_ptr->desc_ptr->
params + i;
245 switch (descriptor_ptr->
type)
247 case JackDriverParamInt:
249 jackctl_value.i = descriptor_ptr->
value.i;
251 case JackDriverParamUInt:
253 jackctl_value.ui = descriptor_ptr->
value.ui;
255 case JackDriverParamChar:
257 jackctl_value.c = descriptor_ptr->
value.c;
259 case JackDriverParamString:
261 strcpy(jackctl_value.str, descriptor_ptr->
value.str);
263 case JackDriverParamBool:
265 jackctl_value.b = descriptor_ptr->
value.i;
268 jack_error(
"Unknown driver parameter type %i", (
int)descriptor_ptr->
type);
273 parameter_ptr = jackctl_add_parameter(
274 &driver_ptr->parameters,
275 descriptor_ptr->
name,
284 if (parameter_ptr == NULL)
289 parameter_ptr->driver_ptr = driver_ptr;
290 parameter_ptr->id = descriptor_ptr->
character;
296 jackctl_free_driver_parameters(driver_ptr);
303 jackctl_destroy_param_list(
321 jackctl_create_param_list(
328 *retparamlist = NULL;
329 while (paramlist != NULL)
332 if (param_ptr->is_set)
336 if (retparam_ptr == NULL)
338 jack_error (
"Allocation of jack_driver_param_t structure failed");
342 retparam_ptr->character = param_ptr->id;
344 switch (param_ptr->type)
347 retparam_ptr->value.i = param_ptr->value_ptr->
i;
350 retparam_ptr->value.ui = param_ptr->value_ptr->
ui;
353 retparam_ptr->value.c = param_ptr->value_ptr->
c;
356 strcpy(retparam_ptr->value.str, param_ptr->value_ptr->
str);
359 retparam_ptr->value.i = param_ptr->value_ptr->
b;
362 jack_error(
"Unknown parameter type %i", (
int)param_ptr->type);
367 *retparamlist = jack_slist_append(*retparamlist, retparam_ptr);
370 paramlist = paramlist->next;
378 jackctl_destroy_param_list(*retparamlist);
383 jackctl_drivers_load(
388 JSList *descriptor_node_ptr;
390 descriptor_node_ptr = jack_drivers_load(NULL);
391 if (descriptor_node_ptr == NULL)
393 jack_error(
"Could not find any drivers in driver directory!");
397 while (descriptor_node_ptr != NULL)
400 if (driver_ptr == NULL)
402 jack_error(
"Memory allocation of jackctl_driver structure failed.");
407 driver_ptr->parameters = NULL;
408 driver_ptr->infos = NULL;
410 if (!jackctl_add_driver_parameters(driver_ptr))
412 assert(driver_ptr->parameters == NULL);
417 server_ptr->drivers = jack_slist_append(server_ptr->drivers, driver_ptr);
420 node_ptr = descriptor_node_ptr;
421 descriptor_node_ptr = descriptor_node_ptr->next;
430 jackctl_server_free_drivers(
436 while (server_ptr->drivers)
438 next_node_ptr = server_ptr->drivers->next;
441 jackctl_free_driver_parameters(driver_ptr);
442 free(driver_ptr->desc_ptr->
params);
443 free(driver_ptr->desc_ptr);
446 free(server_ptr->drivers);
447 server_ptr->drivers = next_node_ptr;
452 jackctl_internals_load(
457 JSList *descriptor_node_ptr;
459 descriptor_node_ptr = jack_internals_load(NULL);
460 if (descriptor_node_ptr == NULL)
462 jack_error(
"Could not find any internals in driver directory!");
466 while (descriptor_node_ptr != NULL)
469 if (internal_ptr == NULL)
471 jack_error(
"Memory allocation of jackctl_driver structure failed.");
476 internal_ptr->parameters = NULL;
477 internal_ptr->refnum = -1;
479 if (!jackctl_add_driver_parameters((
struct jackctl_driver *)internal_ptr))
481 assert(internal_ptr->parameters == NULL);
486 server_ptr->internals = jack_slist_append(server_ptr->internals, internal_ptr);
489 node_ptr = descriptor_node_ptr;
490 descriptor_node_ptr = descriptor_node_ptr->next;
499 jackctl_server_free_internals(
505 while (server_ptr->internals)
507 next_node_ptr = server_ptr->internals->next;
510 jackctl_free_driver_parameters((
struct jackctl_driver *)internal_ptr);
511 free(internal_ptr->desc_ptr->
params);
512 free(internal_ptr->desc_ptr);
515 free(server_ptr->internals);
516 server_ptr->internals = next_node_ptr;
522 jackctl_server_free_parameters(
527 while (server_ptr->parameters)
529 next_node_ptr = server_ptr->parameters->next;
530 jack_constraint_free(((
jackctl_parameter *)server_ptr->parameters->data)->constraint_ptr);
531 free(server_ptr->parameters->data);
532 free(server_ptr->parameters);
533 server_ptr->parameters = next_node_ptr;
546 static void signal_handler(
int signum)
548 printf(
"Jack main caught signal %d\n", signum);
549 (void) signal(SIGINT, SIG_DFL);
550 SetEvent(sigmask.wait_event);
557 if ((sigmask.wait_event = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
558 jack_error(
"CreateEvent fails err = %ld", GetLastError());
562 (void) signal(SIGINT, signal_handler);
563 (void) signal(SIGABRT, signal_handler);
564 (void) signal(SIGTERM, signal_handler);
571 if (WaitForSingleObject(signals->wait_event, INFINITE) != WAIT_OBJECT_0) {
572 jack_error(
"WaitForSingleObject fails err = %ld", GetLastError());
587 signal_handler(
int sig)
594 snprintf(buf,
sizeof(buf),
"Received signal %d during shutdown (ignored)\n", sig);
602 struct sigaction action;
611 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
639 sigemptyset(&sigmask.signals);
640 sigaddset(&sigmask.signals, SIGHUP);
641 sigaddset(&sigmask.signals, SIGINT);
642 sigaddset(&sigmask.signals, SIGQUIT);
643 sigaddset(&sigmask.signals, SIGPIPE);
644 sigaddset(&sigmask.signals, SIGTERM);
649 sigaddset(&sigmask.signals, SIGUSR1);
651 sigaddset(&sigmask.signals, SIGUSR2);
657 pthread_sigmask(SIG_BLOCK, &sigmask.signals, 0);
663 sigfillset(&allsignals);
664 action.sa_handler = signal_handler;
665 action.sa_mask = allsignals;
666 action.sa_flags = SA_RESTART|SA_RESETHAND;
668 for (i = 1; i < NSIG; i++)
670 if (sigismember (&sigmask.signals, i))
672 sigaction(i, &action, 0);
686 #if defined(sun) && !defined(__sun__) // SUN compiler only, to check
687 sigwait(&sigmask->signals);
689 sigwait(&sigmask->signals, &sig);
691 fprintf(stderr,
"Jack main caught signal %d\n", sig);
709 if (sig != SIGSEGV) {
713 sigprocmask(SIG_UNBLOCK, &sigmask->signals, 0);
720 get_realtime_priority_constraint()
725 if (!jack_get_thread_realtime_priority_range(&min, &max))
733 if (constraint_ptr == NULL)
735 jack_error(
"Cannot allocate memory for jack_driver_param_constraint_desc_t structure.");
738 constraint_ptr->
flags = JACK_CONSTRAINT_FLAG_RANGE;
740 constraint_ptr->constraint.
range.min.i = min;
741 constraint_ptr->constraint.
range.max.i = max;
743 return constraint_ptr;
747 bool (* on_device_acquire)(
const char * device_name),
748 void (* on_device_release)(
const char * device_name))
754 if (server_ptr == NULL)
756 jack_error(
"Cannot allocate memory for jackctl_server structure.");
760 server_ptr->drivers = NULL;
761 server_ptr->internals = NULL;
762 server_ptr->parameters = NULL;
763 server_ptr->engine = NULL;
765 strcpy(value.
str, JackTools::DefaultServerName());
766 if (jackctl_add_parameter(
767 &server_ptr->parameters,
769 "Server name to use.",
773 &server_ptr->default_name,
776 goto fail_free_parameters;
780 if (jackctl_add_parameter(
781 &server_ptr->parameters,
783 "Whether to use realtime mode.",
784 "Use realtime scheduling. This is needed for reliable low-latency performance. On most systems, it requires JACK to run with special scheduler and memory allocation privileges, which may be obtained in several ways. On Linux you should use PAM.",
786 &server_ptr->realtime,
787 &server_ptr->default_realtime,
790 goto fail_free_parameters;
794 if (jackctl_add_parameter(
795 &server_ptr->parameters,
797 "Scheduler priority when running in realtime mode.",
800 &server_ptr->realtime_priority,
801 &server_ptr->default_realtime_priority,
803 get_realtime_priority_constraint()) == NULL)
805 goto fail_free_parameters;
809 if (jackctl_add_parameter(
810 &server_ptr->parameters,
812 "Exit once all clients have closed their connections.",
815 &server_ptr->temporary,
816 &server_ptr->default_temporary,
819 goto fail_free_parameters;
823 if (jackctl_add_parameter(
824 &server_ptr->parameters,
829 &server_ptr->verbose,
830 &server_ptr->default_verbose,
833 goto fail_free_parameters;
837 if (jackctl_add_parameter(
838 &server_ptr->parameters,
840 "Client timeout limit in milliseconds.",
843 &server_ptr->client_timeout,
844 &server_ptr->default_client_timeout,
847 goto fail_free_parameters;
851 if (jackctl_add_parameter(
852 &server_ptr->parameters,
854 "Clocksource type : c(ycle) | h(pet) | s(ystem).",
857 &server_ptr->clock_source,
858 &server_ptr->default_clock_source,
861 goto fail_free_parameters;
865 if (jackctl_add_parameter(
866 &server_ptr->parameters,
868 "Maximum number of ports.",
871 &server_ptr->port_max,
872 &server_ptr->default_port_max,
875 goto fail_free_parameters;
879 if (jackctl_add_parameter(
880 &server_ptr->parameters,
882 "Replace shared memory registry.",
885 &server_ptr->replace_registry,
886 &server_ptr->default_replace_registry,
889 goto fail_free_parameters;
893 if (jackctl_add_parameter(
894 &server_ptr->parameters,
896 "Use server synchronous mode.",
900 &server_ptr->default_sync,
903 goto fail_free_parameters;
906 value.
c = JACK_DEFAULT_SELF_CONNECT_MODE;
907 if (jackctl_add_parameter(
908 &server_ptr->parameters,
910 "Self connect mode.",
911 "Whether JACK clients are allowed to connect their own ports",
913 &server_ptr->self_connect_mode,
914 &server_ptr->default_self_connect_mode,
916 jack_constraint_compose_enum_char(
917 JACK_CONSTRAINT_FLAG_STRICT | JACK_CONSTRAINT_FLAG_FAKE_VALUE,
918 self_connect_mode_constraint_descr_array)) == NULL)
920 goto fail_free_parameters;
923 JackServerGlobals::on_device_acquire = on_device_acquire;
924 JackServerGlobals::on_device_release = on_device_release;
926 if (!jackctl_drivers_load(server_ptr))
928 goto fail_free_parameters;
932 jackctl_internals_load(server_ptr);
936 fail_free_parameters:
937 jackctl_server_free_parameters(server_ptr);
948 jackctl_server_free_drivers(server_ptr);
949 jackctl_server_free_internals(server_ptr);
950 jackctl_server_free_parameters(server_ptr);
957 return (server_ptr) ? server_ptr->drivers : NULL;
963 server_ptr->engine->Stop();
973 server_ptr->engine->Close();
974 delete server_ptr->engine;
977 jack_log(
"Cleaning up shared memory");
983 JackTools::CleanupFiles(server_ptr->name.
str);
985 jack_log(
"Unregistering server `%s'", server_ptr->name.
str);
987 jack_unregister_server(server_ptr->name.
str);
989 server_ptr->engine = NULL;
999 return (server_ptr) ? server_ptr->parameters : NULL;
1007 JSList * paramlist = NULL;
1011 if (!server_ptr || !driver_ptr) {
1015 int rc = jack_register_server(server_ptr->name.
str, server_ptr->replace_registry.
b);
1019 jack_error(
"`%s' server already active", server_ptr->name.
str);
1022 jack_error(
"Too many servers already active");
1029 jack_log(
"Server `%s' registered", server_ptr->name.
str);
1034 JackTools::CleanupFiles(server_ptr->name.
str);
1036 if (!server_ptr->realtime.
b && server_ptr->client_timeout.
i == 0) {
1037 server_ptr->client_timeout.
i = 500;
1041 if (server_ptr->port_max.
ui > PORT_NUM_MAX) {
1042 jack_error(
"Jack server started with too much ports %d (when port max can be %d)", server_ptr->port_max.
ui, PORT_NUM_MAX);
1049 server_ptr->temporary.
b,
1050 server_ptr->client_timeout.
i,
1051 server_ptr->realtime.
b,
1052 server_ptr->realtime_priority.
i,
1053 server_ptr->port_max.
ui,
1054 server_ptr->verbose.
b,
1055 (jack_timer_type_t)server_ptr->clock_source.
ui,
1056 server_ptr->self_connect_mode.
c,
1057 server_ptr->name.
str);
1058 if (server_ptr->engine == NULL)
1060 jack_error(
"Failed to create new JackServer object");
1061 goto fail_unregister;
1064 if (!jackctl_create_param_list(driver_ptr->parameters, ¶mlist))
goto fail_delete;
1065 rc = server_ptr->engine->Open(driver_ptr->desc_ptr, paramlist);
1066 jackctl_destroy_param_list(paramlist);
1069 jack_error(
"JackServer::Open failed with %d", rc);
1075 }
catch (std::exception&) {
1077 jackctl_destroy_param_list(paramlist);
1081 delete server_ptr->engine;
1082 server_ptr->engine = NULL;
1085 jack_log(
"Cleaning up shared memory");
1091 JackTools::CleanupFiles(server_ptr->name.
str);
1093 jack_log(
"Unregistering server `%s'", server_ptr->name.
str);
1095 jack_unregister_server(server_ptr->name.
str);
1108 int rc = server_ptr->engine->Start();
1109 bool result = rc >= 0;
1112 jack_error(
"JackServer::Start() failed with %d", rc);
1120 return (driver_ptr) ? driver_ptr->desc_ptr->
name : NULL;
1130 return (driver_ptr) ? driver_ptr->parameters : NULL;
1135 return (driver_ptr) ? driver_ptr->desc_ptr : NULL;
1140 return (parameter_ptr) ? parameter_ptr->name : NULL;
1145 return (parameter_ptr) ? parameter_ptr->short_description : NULL;
1150 return (parameter_ptr) ? parameter_ptr->long_description : NULL;
1155 return (parameter_ptr) ? (parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->
flags & JACK_CONSTRAINT_FLAG_RANGE) != 0) :
false;
1160 return (parameter_ptr) ? (parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->
flags & JACK_CONSTRAINT_FLAG_RANGE) == 0):
false;
1165 if (!parameter_ptr) {
1174 return parameter_ptr->constraint_ptr->constraint.
enumeration.count;
1182 if (!parameter_ptr) {
1183 memset(&jackctl_value, 0,
sizeof(jackctl_value));
1184 return jackctl_value;
1187 value_ptr = ¶meter_ptr->constraint_ptr->constraint.
enumeration.possible_values_array[index].value;
1189 switch (parameter_ptr->type)
1192 jackctl_value.
i = value_ptr->i;
1195 jackctl_value.
ui = value_ptr->ui;
1198 jackctl_value.
c = value_ptr->c;
1201 strcpy(jackctl_value.
str, value_ptr->str);
1204 jack_error(
"Bad driver parameter type %i (enum constraint)", (
int)parameter_ptr->type);
1208 return jackctl_value;
1213 return (parameter_ptr) ? parameter_ptr->constraint_ptr->constraint.
enumeration.possible_values_array[index].short_desc : NULL;
1218 if (!parameter_ptr || !min_ptr || !max_ptr) {
1222 switch (parameter_ptr->type)
1225 min_ptr->
i = parameter_ptr->constraint_ptr->constraint.
range.min.i;
1226 max_ptr->
i = parameter_ptr->constraint_ptr->constraint.
range.max.i;
1229 min_ptr->
ui = parameter_ptr->constraint_ptr->constraint.
range.min.ui;
1230 max_ptr->
ui = parameter_ptr->constraint_ptr->constraint.
range.max.ui;
1233 jack_error(
"Bad driver parameter type %i (range constraint)", (
int)parameter_ptr->type);
1240 return (parameter_ptr) ? (parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->
flags & JACK_CONSTRAINT_FLAG_STRICT) != 0) :
false;
1245 return (parameter_ptr) ? (parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->
flags & JACK_CONSTRAINT_FLAG_FAKE_VALUE) != 0) :
false;
1255 return (parameter_ptr) ? parameter_ptr->id : 0;
1260 return (parameter_ptr) ? parameter_ptr->is_set :
false;
1265 if (parameter_ptr) {
1266 return *parameter_ptr->value_ptr;
1269 memset(&jackctl_value, 0,
sizeof(jackctl_value));
1270 return jackctl_value;
1276 if (!parameter_ptr) {
1280 if (!parameter_ptr->is_set)
1285 parameter_ptr->is_set =
false;
1287 *parameter_ptr->value_ptr = *parameter_ptr->default_value_ptr;
1294 if (!parameter_ptr || !value_ptr) {
1298 parameter_ptr->is_set =
true;
1299 *parameter_ptr->value_ptr = *value_ptr;
1306 if (parameter_ptr) {
1307 return *parameter_ptr->default_value_ptr;
1310 memset(&jackctl_value, 0,
sizeof(jackctl_value));
1311 return jackctl_value;
1319 return (server_ptr) ? server_ptr->internals : NULL;
1324 return (internal_ptr) ? internal_ptr->desc_ptr->
name : NULL;
1329 return (internal_ptr) ? internal_ptr->parameters : NULL;
1336 if (!server_ptr || !
internal) {
1341 if (server_ptr->engine != NULL) {
1343 if (!jackctl_create_param_list(internal->parameters, ¶mlist))
return false;
1344 server_ptr->engine->InternalClientLoad2(internal->desc_ptr->name, internal->desc_ptr->name, paramlist, JackNullOption, &internal->refnum, -1, &status);
1345 jackctl_destroy_param_list(paramlist);
1346 return (internal->refnum > 0);
1356 if (!server_ptr || !
internal) {
1361 if (server_ptr->engine != NULL && internal->refnum > 0) {
1363 return ((server_ptr->engine->GetEngine()->InternalClientUnload(internal->refnum, &status)) == 0);
1373 if (!server_ptr || !file || !server_ptr->engine) {
1377 return (server_ptr->engine->LoadInternalSessionFile(file) >= 0);
1382 if (server_ptr && server_ptr->engine) {
1383 if (server_ptr->engine->IsRunning()) {
1384 jack_error(
"Cannot add a slave in a running server");
1388 if (!jackctl_create_param_list(driver_ptr->parameters, ¶mlist))
return false;
1389 JackDriverInfo* info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, paramlist);
1390 jackctl_destroy_param_list(paramlist);
1392 driver_ptr->infos = jack_slist_append(driver_ptr->infos, info);
1405 if (server_ptr && server_ptr->engine) {
1406 if (server_ptr->engine->IsRunning()) {
1407 jack_error(
"Cannot remove a slave from a running server");
1410 if (driver_ptr->infos) {
1413 driver_ptr->infos = jack_slist_remove(driver_ptr->infos, info);
1414 server_ptr->engine->RemoveSlave(info);
1428 if (server_ptr && server_ptr->engine) {
1430 if (!jackctl_create_param_list(driver_ptr->parameters, ¶mlist))
return false;
1431 bool ret = (server_ptr->engine->SwitchMaster(driver_ptr->desc_ptr, paramlist) == 0);
1432 jackctl_destroy_param_list(paramlist);
SERVER_EXPORT const char * jackctl_parameter_get_long_description(jackctl_parameter *parameter_ptr)
value type is a signed integer
SERVER_EXPORT bool jackctl_parameter_is_set(jackctl_parameter *parameter_ptr)
SERVER_EXPORT union jackctl_parameter_value jackctl_parameter_get_value(jackctl_parameter *parameter_ptr)
SERVER_EXPORT jackctl_sigmask_t * jackctl_setup_signals(unsigned int flags)
char str[JACK_PARAM_STRING_MAX+1]
member used for JackParamString
SERVER_EXPORT union jackctl_parameter_value jackctl_parameter_get_default_value(jackctl_parameter *parameter_ptr)
value type is an unsigned integer
SERVER_EXPORT bool jackctl_server_open(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
SERVER_EXPORT void jackctl_parameter_get_range_constraint(jackctl_parameter *parameter_ptr, union jackctl_parameter_value *min_ptr, union jackctl_parameter_value *max_ptr)
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT jackctl_server_t * jackctl_server_create(bool(*on_device_acquire)(const char *device_name), void(*on_device_release)(const char *device_name))
SERVER_EXPORT bool jackctl_parameter_reset(jackctl_parameter *parameter_ptr)
uint32_t ui
member used for JackParamUInt
jack_driver_param_value_t value
SERVER_EXPORT bool jackctl_server_switch_master(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
SERVER_EXPORT const char * jackctl_internal_get_name(jackctl_internal *internal_ptr)
int32_t i
member used for JackParamInt
SERVER_EXPORT const char * jackctl_parameter_get_name(jackctl_parameter *parameter_ptr)
SERVER_EXPORT bool jackctl_server_stop(jackctl_server *server_ptr)
bool b
member used for JackParamBool
Type for parameter value.
SERVER_EXPORT const JSList * jackctl_driver_get_parameters(jackctl_driver *driver_ptr)
value type is a string with max size of JACK_PARAM_STRING_MAX+1 chars
SERVER_EXPORT bool jackctl_parameter_has_range_constraint(jackctl_parameter *parameter_ptr)
SERVER_EXPORT bool jackctl_server_close(jackctl_server *server_ptr)
SERVER_EXPORT bool jackctl_server_remove_slave(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
SERVER_EXPORT const char * jackctl_parameter_get_enum_constraint_description(jackctl_parameter *parameter_ptr, uint32_t index)
SERVER_EXPORT const JSList * jackctl_server_get_internals_list(jackctl_server *server_ptr)
jack_driver_param_constraint_desc_t * constraint
SERVER_EXPORT const char * jackctl_parameter_get_short_description(jackctl_parameter *parameter_ptr)
SERVER_EXPORT bool jackctl_parameter_constraint_is_fake_value(jackctl_parameter_t *parameter_ptr)
struct jack_driver_param_constraint_desc_t::@0::@1 range
SERVER_EXPORT jackctl_param_type_t jackctl_parameter_get_type(jackctl_parameter *parameter_ptr)
SERVER_EXPORT const JSList * jackctl_server_get_drivers_list(jackctl_server *server_ptr)
char name[JACK_DRIVER_NAME_MAX+1]
char name[JACK_DRIVER_NAME_MAX+1]
SERVER_EXPORT bool jackctl_server_start(jackctl_server *server_ptr)
SERVER_EXPORT bool jackctl_parameter_constraint_is_strict(jackctl_parameter_t *parameter_ptr)
SERVER_EXPORT uint32_t jackctl_parameter_get_enum_constraints_count(jackctl_parameter *parameter_ptr)
SERVER_EXPORT bool jackctl_parameter_set_value(jackctl_parameter *parameter_ptr, const union jackctl_parameter_value *value_ptr)
SERVER_EXPORT bool jackctl_server_add_slave(jackctl_server *server_ptr, jackctl_driver *driver_ptr)
SERVER_EXPORT bool jackctl_server_load_session_file(jackctl_server *server_ptr, const char *file)
SERVER_EXPORT const char * jackctl_driver_get_name(jackctl_driver *driver_ptr)
SERVER_EXPORT union jackctl_parameter_value jackctl_parameter_get_enum_constraint_value(jackctl_parameter *parameter_ptr, uint32_t index)
SERVER_EXPORT bool jackctl_server_unload_internal(jackctl_server *server_ptr, jackctl_internal *internal)
jack_driver_param_type_t type
SERVER_EXPORT char jackctl_parameter_get_id(jackctl_parameter_t *parameter_ptr)
SERVER_EXPORT const JSList * jackctl_internal_get_parameters(jackctl_internal *internal_ptr)
struct jack_driver_param_constraint_desc_t::@0::@2 enumeration
SERVER_EXPORT void jackctl_server_destroy(jackctl_server *server_ptr)
SERVER_EXPORT jackctl_driver_type_t jackctl_driver_get_type(jackctl_driver *driver_ptr)
char c
member used for JackParamChar
SERVER_EXPORT const JSList * jackctl_server_get_parameters(jackctl_server *server_ptr)
SERVER_EXPORT bool jackctl_parameter_has_enum_constraint(jackctl_parameter *parameter_ptr)
SERVER_EXPORT void jackctl_wait_signals(jackctl_sigmask_t *sigmask)
SERVER_EXPORT void jack_log(const char *fmt,...)
SERVER_EXPORT bool jackctl_server_load_internal(jackctl_server *server_ptr, jackctl_internal *internal)
jack_driver_param_desc_t * params