diff options
Diffstat (limited to 'jackd/controlapi.c')
-rw-r--r-- | jackd/controlapi.c | 2000 |
1 files changed, 975 insertions, 1025 deletions
diff --git a/jackd/controlapi.c b/jackd/controlapi.c index 3b14cee..90edc28 100644 --- a/jackd/controlapi.c +++ b/jackd/controlapi.c @@ -1,24 +1,24 @@ // u/* -*- Mode: C++ ; c-basic-offset: 4 -*- */ /* - JACK control API implementation + JACK control API implementation - Copyright (C) 2008 Nedko Arnaudov - Copyright (C) 2008 Grame + Copyright (C) 2008 Nedko Arnaudov + Copyright (C) 2008 Grame - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ + */ #ifndef WIN32 #include <stdint.h> @@ -58,250 +58,238 @@ */ static JSList *drivers = NULL; -struct jackctl_server -{ - JSList * drivers; - JSList * internals; - JSList * parameters; - - jack_engine_t * engine; - - /* string, server name */ - union jackctl_parameter_value name; - union jackctl_parameter_value default_name; - - /* bool, whether to be "realtime" */ - union jackctl_parameter_value realtime; - union jackctl_parameter_value default_realtime; - - /* int32_t */ - union jackctl_parameter_value realtime_priority; - union jackctl_parameter_value default_realtime_priority; - - /* bool, whether to exit once all clients have closed their connections */ - union jackctl_parameter_value temporary; - union jackctl_parameter_value default_temporary; - - /* bool, whether to be verbose */ - union jackctl_parameter_value verbose; - union jackctl_parameter_value default_verbose; - - /* int32_t, msecs; if zero, use period size. */ - union jackctl_parameter_value client_timeout; - union jackctl_parameter_value default_client_timeout; - - /* uint32_t, clock source type */ - union jackctl_parameter_value clock_source; - union jackctl_parameter_value default_clock_source; - - /* uint32_t, max port number */ - union jackctl_parameter_value port_max; - union jackctl_parameter_value default_port_max; - - /* bool */ - union jackctl_parameter_value replace_registry; - union jackctl_parameter_value default_replace_registry; - - /* bool, use mlock */ - union jackctl_parameter_value do_mlock; - union jackctl_parameter_value default_do_mlock; - - /* bool, munlock gui libraries */ - union jackctl_parameter_value do_unlock; - union jackctl_parameter_value default_do_unlock; - - /* bool, dont zombify... */ - union jackctl_parameter_value nozombies; - union jackctl_parameter_value default_nozombies; - - /* int, timeout thres... */ - union jackctl_parameter_value timothres; - union jackctl_parameter_value default_timothres; +struct jackctl_server { + JSList * drivers; + JSList * internals; + JSList * parameters; + + jack_engine_t * engine; + + /* string, server name */ + union jackctl_parameter_value name; + union jackctl_parameter_value default_name; + + /* bool, whether to be "realtime" */ + union jackctl_parameter_value realtime; + union jackctl_parameter_value default_realtime; + + /* int32_t */ + union jackctl_parameter_value realtime_priority; + union jackctl_parameter_value default_realtime_priority; + + /* bool, whether to exit once all clients have closed their connections */ + union jackctl_parameter_value temporary; + union jackctl_parameter_value default_temporary; + + /* bool, whether to be verbose */ + union jackctl_parameter_value verbose; + union jackctl_parameter_value default_verbose; + + /* int32_t, msecs; if zero, use period size. */ + union jackctl_parameter_value client_timeout; + union jackctl_parameter_value default_client_timeout; + + /* uint32_t, clock source type */ + union jackctl_parameter_value clock_source; + union jackctl_parameter_value default_clock_source; + + /* uint32_t, max port number */ + union jackctl_parameter_value port_max; + union jackctl_parameter_value default_port_max; + + /* bool */ + union jackctl_parameter_value replace_registry; + union jackctl_parameter_value default_replace_registry; + + /* bool, use mlock */ + union jackctl_parameter_value do_mlock; + union jackctl_parameter_value default_do_mlock; + + /* bool, munlock gui libraries */ + union jackctl_parameter_value do_unlock; + union jackctl_parameter_value default_do_unlock; + + /* bool, dont zombify... */ + union jackctl_parameter_value nozombies; + union jackctl_parameter_value default_nozombies; + + /* int, timeout thres... */ + union jackctl_parameter_value timothres; + union jackctl_parameter_value default_timothres; }; -struct jackctl_driver -{ - jack_driver_desc_t * desc_ptr; - JSList * parameters; - JSList * set_parameters; +struct jackctl_driver { + jack_driver_desc_t * desc_ptr; + JSList * parameters; + JSList * set_parameters; }; -struct jackctl_internal -{ - jack_driver_desc_t * desc_ptr; - JSList * parameters; - JSList * set_parameters; - int refnum; +struct jackctl_internal { + jack_driver_desc_t * desc_ptr; + JSList * parameters; + JSList * set_parameters; + int refnum; }; -struct jackctl_parameter -{ - const char * name; - const char * short_description; - const char * long_description; - jackctl_param_type_t type; - bool is_set; - union jackctl_parameter_value * value_ptr; - union jackctl_parameter_value * default_value_ptr; - - union jackctl_parameter_value value; - union jackctl_parameter_value default_value; - struct jackctl_driver * driver_ptr; - char id; - jack_driver_param_t * driver_parameter_ptr; - jack_driver_param_constraint_desc_t * constraint_ptr; +struct jackctl_parameter { + const char * name; + const char * short_description; + const char * long_description; + jackctl_param_type_t type; + bool is_set; + union jackctl_parameter_value * value_ptr; + union jackctl_parameter_value * default_value_ptr; + + union jackctl_parameter_value value; + union jackctl_parameter_value default_value; + struct jackctl_driver * driver_ptr; + char id; + jack_driver_param_t * driver_parameter_ptr; + jack_driver_param_constraint_desc_t * constraint_ptr; }; static struct jackctl_parameter * -jackctl_add_parameter( - JSList ** parameters_list_ptr_ptr, - char id, - const char * name, - const char * short_description, - const char * long_description, - jackctl_param_type_t type, - union jackctl_parameter_value * value_ptr, - union jackctl_parameter_value * default_value_ptr, - union jackctl_parameter_value value, - jack_driver_param_constraint_desc_t * constraint_ptr) +jackctl_add_parameter ( + JSList ** parameters_list_ptr_ptr, + char id, + const char * name, + const char * short_description, + const char * long_description, + jackctl_param_type_t type, + union jackctl_parameter_value * value_ptr, + union jackctl_parameter_value * default_value_ptr, + union jackctl_parameter_value value, + jack_driver_param_constraint_desc_t * constraint_ptr) { - struct jackctl_parameter * parameter_ptr; + struct jackctl_parameter * parameter_ptr; - parameter_ptr = (struct jackctl_parameter *)malloc(sizeof(struct jackctl_parameter)); - if (parameter_ptr == NULL) - { - jack_error("Cannot allocate memory for jackctl_parameter structure."); - goto fail; - } + parameter_ptr = (struct jackctl_parameter*)malloc (sizeof(struct jackctl_parameter)); + if (parameter_ptr == NULL) { + jack_error ("Cannot allocate memory for jackctl_parameter structure."); + goto fail; + } - parameter_ptr->name = name; - parameter_ptr->short_description = short_description; - parameter_ptr->long_description = long_description; - parameter_ptr->type = type; - parameter_ptr->is_set = false; + parameter_ptr->name = name; + parameter_ptr->short_description = short_description; + parameter_ptr->long_description = long_description; + parameter_ptr->type = type; + parameter_ptr->is_set = false; - if (value_ptr == NULL) - { - value_ptr = ¶meter_ptr->value; - } + if (value_ptr == NULL) { + value_ptr = ¶meter_ptr->value; + } - if (default_value_ptr == NULL) - { - default_value_ptr = ¶meter_ptr->default_value; - } + if (default_value_ptr == NULL) { + default_value_ptr = ¶meter_ptr->default_value; + } - parameter_ptr->value_ptr = value_ptr; - parameter_ptr->default_value_ptr = default_value_ptr; + parameter_ptr->value_ptr = value_ptr; + parameter_ptr->default_value_ptr = default_value_ptr; - *value_ptr = *default_value_ptr = value; + *value_ptr = *default_value_ptr = value; - parameter_ptr->driver_ptr = NULL; - parameter_ptr->driver_parameter_ptr = NULL; - parameter_ptr->id = id; - parameter_ptr->constraint_ptr = constraint_ptr; + parameter_ptr->driver_ptr = NULL; + parameter_ptr->driver_parameter_ptr = NULL; + parameter_ptr->id = id; + parameter_ptr->constraint_ptr = constraint_ptr; - *parameters_list_ptr_ptr = jack_slist_append(*parameters_list_ptr_ptr, parameter_ptr); + *parameters_list_ptr_ptr = jack_slist_append (*parameters_list_ptr_ptr, parameter_ptr); - return parameter_ptr; + return parameter_ptr; fail: - return NULL; + return NULL; } static void -jackctl_free_driver_parameters( - struct jackctl_driver * driver_ptr) +jackctl_free_driver_parameters ( + struct jackctl_driver * driver_ptr) { - JSList * next_node_ptr; - - while (driver_ptr->parameters) - { - next_node_ptr = driver_ptr->parameters->next; - free(driver_ptr->parameters->data); - free(driver_ptr->parameters); - driver_ptr->parameters = next_node_ptr; - } - - while (driver_ptr->set_parameters) - { - next_node_ptr = driver_ptr->set_parameters->next; - free(driver_ptr->set_parameters->data); - free(driver_ptr->set_parameters); - driver_ptr->set_parameters = next_node_ptr; - } + JSList * next_node_ptr; + + while (driver_ptr->parameters) { + next_node_ptr = driver_ptr->parameters->next; + free (driver_ptr->parameters->data); + free (driver_ptr->parameters); + driver_ptr->parameters = next_node_ptr; + } + + while (driver_ptr->set_parameters) { + next_node_ptr = driver_ptr->set_parameters->next; + free (driver_ptr->set_parameters->data); + free (driver_ptr->set_parameters); + driver_ptr->set_parameters = next_node_ptr; + } } static bool -jackctl_add_driver_parameters( - struct jackctl_driver * driver_ptr) +jackctl_add_driver_parameters ( + struct jackctl_driver * driver_ptr) { - uint32_t i; - union jackctl_parameter_value jackctl_value; - jackctl_param_type_t jackctl_type; - struct jackctl_parameter * parameter_ptr; - jack_driver_param_desc_t * descriptor_ptr; - - for (i = 0 ; i < driver_ptr->desc_ptr->nparams ; i++) - { - descriptor_ptr = driver_ptr->desc_ptr->params + i; - - switch (descriptor_ptr->type) - { - case JackDriverParamInt: - jackctl_type = JackParamInt; - jackctl_value.i = descriptor_ptr->value.i; - break; - case JackDriverParamUInt: - jackctl_type = JackParamUInt; - jackctl_value.ui = descriptor_ptr->value.ui; - break; - case JackDriverParamChar: - jackctl_type = JackParamChar; - jackctl_value.c = descriptor_ptr->value.c; - break; - case JackDriverParamString: - jackctl_type = JackParamString; - strcpy(jackctl_value.str, descriptor_ptr->value.str); - break; - case JackDriverParamBool: - jackctl_type = JackParamBool; - jackctl_value.b = descriptor_ptr->value.i; - break; - default: - jack_error("unknown driver parameter type %i", (int)descriptor_ptr->type); - assert(0); - goto fail; - } - - parameter_ptr = jackctl_add_parameter( - &driver_ptr->parameters, - descriptor_ptr->character, - descriptor_ptr->name, - descriptor_ptr->short_desc, - descriptor_ptr->long_desc, - jackctl_type, - NULL, - NULL, - jackctl_value, - descriptor_ptr->constraint); - - if (parameter_ptr == NULL) - { - goto fail; - } - - parameter_ptr->driver_ptr = driver_ptr; - } - - return true; + uint32_t i; + union jackctl_parameter_value jackctl_value; + jackctl_param_type_t jackctl_type; + struct jackctl_parameter * parameter_ptr; + jack_driver_param_desc_t * descriptor_ptr; + + for (i = 0; i < driver_ptr->desc_ptr->nparams; i++) { + descriptor_ptr = driver_ptr->desc_ptr->params + i; + + switch (descriptor_ptr->type) { + case JackDriverParamInt: + jackctl_type = JackParamInt; + jackctl_value.i = descriptor_ptr->value.i; + break; + case JackDriverParamUInt: + jackctl_type = JackParamUInt; + jackctl_value.ui = descriptor_ptr->value.ui; + break; + case JackDriverParamChar: + jackctl_type = JackParamChar; + jackctl_value.c = descriptor_ptr->value.c; + break; + case JackDriverParamString: + jackctl_type = JackParamString; + strcpy (jackctl_value.str, descriptor_ptr->value.str); + break; + case JackDriverParamBool: + jackctl_type = JackParamBool; + jackctl_value.b = descriptor_ptr->value.i; + break; + default: + jack_error ("unknown driver parameter type %i", (int)descriptor_ptr->type); + assert (0); + goto fail; + } + + parameter_ptr = jackctl_add_parameter ( + &driver_ptr->parameters, + descriptor_ptr->character, + descriptor_ptr->name, + descriptor_ptr->short_desc, + descriptor_ptr->long_desc, + jackctl_type, + NULL, + NULL, + jackctl_value, + descriptor_ptr->constraint); + + if (parameter_ptr == NULL) { + goto fail; + } + + parameter_ptr->driver_ptr = driver_ptr; + } + + return true; fail: - jackctl_free_driver_parameters(driver_ptr); + jackctl_free_driver_parameters (driver_ptr); - return false; + return false; } static jack_driver_desc_t * @@ -316,7 +304,7 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) int err; char* driver_dir; - if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { + if ((driver_dir = getenv ("JACK_DRIVER_DIR")) == 0) { driver_dir = ADDON_DIR; } filename = malloc (strlen (driver_dir) + 1 + strlen (sofile) + 1); @@ -326,17 +314,17 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) // jack_info ("getting driver descriptor from %s", filename); // } - if ((dlhandle = dlopen (filename, RTLD_NOW|RTLD_GLOBAL)) == NULL) { + if ((dlhandle = dlopen (filename, RTLD_NOW | RTLD_GLOBAL)) == NULL) { jack_error ("could not open driver .so '%s': %s\n", filename, dlerror ()); free (filename); return NULL; } so_get_descriptor = (JackDriverDescFunction) - dlsym (dlhandle, "driver_get_descriptor"); + dlsym (dlhandle, "driver_get_descriptor"); if ((dlerr = dlerror ()) != NULL) { - jack_error("%s", dlerr); + jack_error ("%s", dlerr); dlclose (dlhandle); free (filename); return NULL; @@ -355,7 +343,7 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) /* check it doesn't exist already */ for (node = drivers; node; node = jack_slist_next (node)) { - other_descriptor = (jack_driver_desc_t *) node->data; + other_descriptor = (jack_driver_desc_t*)node->data; if (strcmp (descriptor->name, other_descriptor->name) == 0) { jack_error ("the drivers in '%s' and '%s' both have the name '%s'; using the first\n", @@ -383,7 +371,7 @@ jack_drivers_load () jack_driver_desc_t * desc; char* driver_dir; - if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { + if ((driver_dir = getenv ("JACK_DRIVER_DIR")) == 0) { driver_dir = ADDON_DIR; } @@ -395,7 +383,7 @@ jack_drivers_load () driver_dir, strerror (errno)); return NULL; } - + while ( (dir_entry = readdir (dir_stream)) ) { /* check the filename is of the right format */ if (strncmp ("jack_", dir_entry->d_name, 5) != 0) { @@ -436,8 +424,9 @@ jack_cleanup_files (const char *server_name) { DIR *dir; struct dirent *dirent; - char dir_name[PATH_MAX+1] = ""; - jack_server_dir (server_name, dir_name); + char dir_name[PATH_MAX + 1] = ""; + + jack_server_dir (server_name, dir_name); /* On termination, we remove all files that jackd creates so * subsequent attempts to start jackd will not believe that an @@ -463,27 +452,27 @@ jack_cleanup_files (const char *server_name) /* unlink all the files in this directory, they are mine */ while ((dirent = readdir (dir)) != NULL) { - char fullpath[PATH_MAX+1]; + char fullpath[PATH_MAX + 1]; if ((strcmp (dirent->d_name, ".") == 0) || (strcmp (dirent->d_name, "..") == 0)) { continue; } - snprintf (fullpath, sizeof (fullpath), "%s/%s", + snprintf (fullpath, sizeof(fullpath), "%s/%s", dir_name, dirent->d_name); if (unlink (fullpath)) { jack_error ("cannot unlink `%s' (%s)", fullpath, strerror (errno)); } - } + } closedir (dir); /* now, delete the per-server subdirectory, itself */ if (rmdir (dir_name)) { - jack_error ("cannot remove `%s' (%s)", dir_name, + jack_error ("cannot remove `%s' (%s)", dir_name, strerror (errno)); } @@ -497,1040 +486,1001 @@ jack_cleanup_files (const char *server_name) } static int -jackctl_drivers_load( - struct jackctl_server * server_ptr) +jackctl_drivers_load ( + struct jackctl_server * server_ptr) { - struct jackctl_driver * driver_ptr; - JSList *node_ptr; - JSList *descriptor_node_ptr; - - descriptor_node_ptr = jack_drivers_load(); - if (descriptor_node_ptr == NULL) - { - jack_error("could not find any drivers in driver directory!"); - return false; - } - - while (descriptor_node_ptr != NULL) - { - driver_ptr = (struct jackctl_driver *)malloc(sizeof(struct jackctl_driver)); - if (driver_ptr == NULL) - { - jack_error("memory allocation of jackctl_driver structure failed."); - goto next; - } - - driver_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; - driver_ptr->parameters = NULL; - driver_ptr->set_parameters = NULL; - - if (!jackctl_add_driver_parameters(driver_ptr)) - { - assert(driver_ptr->parameters == NULL); - free(driver_ptr); - goto next; - } - - server_ptr->drivers = jack_slist_append(server_ptr->drivers, driver_ptr); - - next: - node_ptr = descriptor_node_ptr; - descriptor_node_ptr = descriptor_node_ptr->next; - free(node_ptr); - } - - return true; + struct jackctl_driver * driver_ptr; + JSList *node_ptr; + JSList *descriptor_node_ptr; + + descriptor_node_ptr = jack_drivers_load (); + if (descriptor_node_ptr == NULL) { + jack_error ("could not find any drivers in driver directory!"); + return false; + } + + while (descriptor_node_ptr != NULL) { + driver_ptr = (struct jackctl_driver*)malloc (sizeof(struct jackctl_driver)); + if (driver_ptr == NULL) { + jack_error ("memory allocation of jackctl_driver structure failed."); + goto next; + } + + driver_ptr->desc_ptr = (jack_driver_desc_t*)descriptor_node_ptr->data; + driver_ptr->parameters = NULL; + driver_ptr->set_parameters = NULL; + + if (!jackctl_add_driver_parameters (driver_ptr)) { + assert (driver_ptr->parameters == NULL); + free (driver_ptr); + goto next; + } + + server_ptr->drivers = jack_slist_append (server_ptr->drivers, driver_ptr); + +next: + node_ptr = descriptor_node_ptr; + descriptor_node_ptr = descriptor_node_ptr->next; + free (node_ptr); + } + + return true; } static void -jackctl_server_free_drivers( - struct jackctl_server * server_ptr) +jackctl_server_free_drivers ( + struct jackctl_server * server_ptr) { - JSList * next_node_ptr; - struct jackctl_driver * driver_ptr; - - while (server_ptr->drivers) - { - next_node_ptr = server_ptr->drivers->next; - driver_ptr = (struct jackctl_driver *)server_ptr->drivers->data; - - jackctl_free_driver_parameters(driver_ptr); - free(driver_ptr->desc_ptr->params); - free(driver_ptr->desc_ptr); - free(driver_ptr); - - free(server_ptr->drivers); - server_ptr->drivers = next_node_ptr; - } + JSList * next_node_ptr; + struct jackctl_driver * driver_ptr; + + while (server_ptr->drivers) { + next_node_ptr = server_ptr->drivers->next; + driver_ptr = (struct jackctl_driver*)server_ptr->drivers->data; + + jackctl_free_driver_parameters (driver_ptr); + free (driver_ptr->desc_ptr->params); + free (driver_ptr->desc_ptr); + free (driver_ptr); + + free (server_ptr->drivers); + server_ptr->drivers = next_node_ptr; + } } static int -jackctl_internals_load( - struct jackctl_server * server_ptr) +jackctl_internals_load ( + struct jackctl_server * server_ptr) { - struct jackctl_internal * internal_ptr; - JSList *node_ptr; - JSList *descriptor_node_ptr = NULL; - - //XXX: jack1 doesnt support internals enumeration. - //descriptor_node_ptr = jack_internals_load(NULL); - if (descriptor_node_ptr == NULL) - { - return false; - } - - while (descriptor_node_ptr != NULL) - { - internal_ptr = (struct jackctl_internal *)malloc(sizeof(struct jackctl_internal)); - if (internal_ptr == NULL) - { - jack_error("memory allocation of jackctl_driver structure failed."); - goto next; - } - - internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; - internal_ptr->parameters = NULL; - internal_ptr->set_parameters = NULL; - - if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) - { - assert(internal_ptr->parameters == NULL); - free(internal_ptr); - goto next; - } - - server_ptr->internals = jack_slist_append(server_ptr->internals, internal_ptr); - - next: - node_ptr = descriptor_node_ptr; - descriptor_node_ptr = descriptor_node_ptr->next; - free(node_ptr); - } - - return true; + struct jackctl_internal * internal_ptr; + JSList *node_ptr; + JSList *descriptor_node_ptr = NULL; + + //XXX: jack1 doesnt support internals enumeration. + //descriptor_node_ptr = jack_internals_load(NULL); + if (descriptor_node_ptr == NULL) { + return false; + } + + while (descriptor_node_ptr != NULL) { + internal_ptr = (struct jackctl_internal*)malloc (sizeof(struct jackctl_internal)); + if (internal_ptr == NULL) { + jack_error ("memory allocation of jackctl_driver structure failed."); + goto next; + } + + internal_ptr->desc_ptr = (jack_driver_desc_t*)descriptor_node_ptr->data; + internal_ptr->parameters = NULL; + internal_ptr->set_parameters = NULL; + + if (!jackctl_add_driver_parameters ((struct jackctl_driver*)internal_ptr)) { + assert (internal_ptr->parameters == NULL); + free (internal_ptr); + goto next; + } + + server_ptr->internals = jack_slist_append (server_ptr->internals, internal_ptr); + +next: + node_ptr = descriptor_node_ptr; + descriptor_node_ptr = descriptor_node_ptr->next; + free (node_ptr); + } + + return true; } static void -jackctl_server_free_internals( - struct jackctl_server * server_ptr) +jackctl_server_free_internals ( + struct jackctl_server * server_ptr) { - JSList * next_node_ptr; - struct jackctl_internal * internal_ptr; - - while (server_ptr->internals) - { - next_node_ptr = server_ptr->internals->next; - internal_ptr = (struct jackctl_internal *)server_ptr->internals->data; - - jackctl_free_driver_parameters((struct jackctl_driver *)internal_ptr); - free(internal_ptr->desc_ptr->params); - free(internal_ptr->desc_ptr); - free(internal_ptr); - - free(server_ptr->internals); - server_ptr->internals = next_node_ptr; - } + JSList * next_node_ptr; + struct jackctl_internal * internal_ptr; + + while (server_ptr->internals) { + next_node_ptr = server_ptr->internals->next; + internal_ptr = (struct jackctl_internal*)server_ptr->internals->data; + + jackctl_free_driver_parameters ((struct jackctl_driver*)internal_ptr); + free (internal_ptr->desc_ptr->params); + free (internal_ptr->desc_ptr); + free (internal_ptr); + + free (server_ptr->internals); + server_ptr->internals = next_node_ptr; + } } static void -jackctl_server_free_parameters( - struct jackctl_server * server_ptr) +jackctl_server_free_parameters ( + struct jackctl_server * server_ptr) { - JSList * next_node_ptr; - - while (server_ptr->parameters) - { - next_node_ptr = server_ptr->parameters->next; - free(server_ptr->parameters->data); - free(server_ptr->parameters); - server_ptr->parameters = next_node_ptr; - } + JSList * next_node_ptr; + + while (server_ptr->parameters) { + next_node_ptr = server_ptr->parameters->next; + free (server_ptr->parameters->data); + free (server_ptr->parameters); + server_ptr->parameters = next_node_ptr; + } } #ifdef WIN32 static HANDLE waitEvent; -static void do_nothing_handler(int signum) +static void do_nothing_handler (int signum) { - printf("jack main caught signal %d\n", signum); - (void) signal(SIGINT, SIG_DFL); - SetEvent(waitEvent); + printf ("jack main caught signal %d\n", signum); + (void)signal (SIGINT, SIG_DFL); + SetEvent (waitEvent); } sigset_t -jackctl_setup_signals( - unsigned int flags) +jackctl_setup_signals ( + unsigned int flags) { - if ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) { - jack_error("CreateEvent fails err = %ld", GetLastError()); - return 0; - } + if ((waitEvent = CreateEvent (NULL, FALSE, FALSE, NULL)) == NULL) { + jack_error ("CreateEvent fails err = %ld", GetLastError ()); + return 0; + } - (void) signal(SIGINT, do_nothing_handler); - (void) signal(SIGABRT, do_nothing_handler); - (void) signal(SIGTERM, do_nothing_handler); + (void)signal (SIGINT, do_nothing_handler); + (void)signal (SIGABRT, do_nothing_handler); + (void)signal (SIGTERM, do_nothing_handler); - return (sigset_t)waitEvent; + return (sigset_t)waitEvent; } -void jackctl_wait_signals(sigset_t signals) +void jackctl_wait_signals (sigset_t signals) { - if (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) { - jack_error("WaitForSingleObject fails err = %ld", GetLastError()); - } + if (WaitForSingleObject (waitEvent, INFINITE) != WAIT_OBJECT_0) { + jack_error ("WaitForSingleObject fails err = %ld", GetLastError ()); + } } #else static void -do_nothing_handler(int sig) +do_nothing_handler (int sig) { - /* this is used by the child (active) process, but it never - gets called unless we are already shutting down after - another signal. - */ - char buf[64]; - snprintf (buf, sizeof(buf), "received signal %d during shutdown (ignored)\n", sig); + /* this is used by the child (active) process, but it never + gets called unless we are already shutting down after + another signal. + */ + char buf[64]; + + snprintf (buf, sizeof(buf), "received signal %d during shutdown (ignored)\n", sig); } sigset_t -jackctl_setup_signals( - unsigned int flags) +jackctl_setup_signals ( + unsigned int flags) { - sigset_t signals; - sigset_t allsignals; - struct sigaction action; - int i; - - /* ensure that we are in our own process group so that - kill (SIG, -pgrp) does the right thing. - */ - - setsid(); - - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - - /* what's this for? - - POSIX says that signals are delivered like this: - - * if a thread has blocked that signal, it is not - a candidate to receive the signal. - * of all threads not blocking the signal, pick - one at random, and deliver the signal. - - this means that a simple-minded multi-threaded program can - expect to get POSIX signals delivered randomly to any one - of its threads, - - here, we block all signals that we think we might receive - and want to catch. all "child" threads will inherit this - setting. if we create a thread that calls sigwait() on the - same set of signals, implicitly unblocking all those - signals. any of those signals that are delivered to the - process will be delivered to that thread, and that thread - alone. this makes cleanup for a signal-driven exit much - easier, since we know which thread is doing it and more - importantly, we are free to call async-unsafe functions, - because the code is executing in normal thread context - after a return from sigwait(). - */ - - sigemptyset(&signals); - sigaddset(&signals, SIGHUP); - sigaddset(&signals, SIGINT); - sigaddset(&signals, SIGQUIT); - sigaddset(&signals, SIGPIPE); - sigaddset(&signals, SIGTERM); - sigaddset(&signals, SIGUSR1); - sigaddset(&signals, SIGUSR2); - - /* all child threads will inherit this mask unless they - * explicitly reset it - */ - - pthread_sigmask(SIG_BLOCK, &signals, 0); - - /* install a do-nothing handler because otherwise pthreads - behaviour is undefined when we enter sigwait. - */ - - sigfillset(&allsignals); - action.sa_handler = do_nothing_handler; - action.sa_mask = allsignals; - action.sa_flags = SA_RESTART|SA_RESETHAND; - - for (i = 1; i < NSIG; i++) - { - if (sigismember (&signals, i)) - { - sigaction(i, &action, 0); - } - } - - return signals; + sigset_t signals; + sigset_t allsignals; + struct sigaction action; + int i; + + /* ensure that we are in our own process group so that + kill (SIG, -pgrp) does the right thing. + */ + + setsid (); + + pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + + /* what's this for? + + POSIX says that signals are delivered like this: + + * if a thread has blocked that signal, it is not + a candidate to receive the signal. + * of all threads not blocking the signal, pick + one at random, and deliver the signal. + + this means that a simple-minded multi-threaded program can + expect to get POSIX signals delivered randomly to any one + of its threads, + + here, we block all signals that we think we might receive + and want to catch. all "child" threads will inherit this + setting. if we create a thread that calls sigwait() on the + same set of signals, implicitly unblocking all those + signals. any of those signals that are delivered to the + process will be delivered to that thread, and that thread + alone. this makes cleanup for a signal-driven exit much + easier, since we know which thread is doing it and more + importantly, we are free to call async-unsafe functions, + because the code is executing in normal thread context + after a return from sigwait(). + */ + + sigemptyset (&signals); + sigaddset (&signals, SIGHUP); + sigaddset (&signals, SIGINT); + sigaddset (&signals, SIGQUIT); + sigaddset (&signals, SIGPIPE); + sigaddset (&signals, SIGTERM); + sigaddset (&signals, SIGUSR1); + sigaddset (&signals, SIGUSR2); + + /* all child threads will inherit this mask unless they + * explicitly reset it + */ + + pthread_sigmask (SIG_BLOCK, &signals, 0); + + /* install a do-nothing handler because otherwise pthreads + behaviour is undefined when we enter sigwait. + */ + + sigfillset (&allsignals); + action.sa_handler = do_nothing_handler; + action.sa_mask = allsignals; + action.sa_flags = SA_RESTART | SA_RESETHAND; + + for (i = 1; i < NSIG; i++) { + if (sigismember (&signals, i)) { + sigaction (i, &action, 0); + } + } + + return signals; } void -jackctl_wait_signals(sigset_t signals) +jackctl_wait_signals (sigset_t signals) { - int sig; - bool waiting = true; + int sig; + bool waiting = true; - while (waiting) { + while (waiting) { #if defined(sun) && !defined(__sun__) // SUN compiler only, to check - sigwait(&signals); + sigwait (&signals); #else - sigwait(&signals, &sig); + sigwait (&signals, &sig); #endif - fprintf(stderr, "jack main caught signal %d\n", sig); - - switch (sig) { - case SIGUSR1: - //jack_dump_configuration(engine, 1); - break; - case SIGUSR2: - // driver exit - waiting = false; - break; - case SIGTTOU: - break; - default: - waiting = false; - break; - } - } - - if (sig != SIGSEGV) { - // unblock signals so we can see them during shutdown. - // this will help prod developers not to lose sight of - // bugs that cause segfaults etc. during shutdown. - sigprocmask(SIG_UNBLOCK, &signals, 0); - } + fprintf (stderr, "jack main caught signal %d\n", sig); + + switch (sig) { + case SIGUSR1: + //jack_dump_configuration(engine, 1); + break; + case SIGUSR2: + // driver exit + waiting = false; + break; + case SIGTTOU: + break; + default: + waiting = false; + break; + } + } + + if (sig != SIGSEGV) { + // unblock signals so we can see them during shutdown. + // this will help prod developers not to lose sight of + // bugs that cause segfaults etc. during shutdown. + sigprocmask (SIG_UNBLOCK, &signals, 0); + } } #endif static sigset_t -jackctl_block_signals() +jackctl_block_signals () { - sigset_t signals; - sigset_t oldsignals; + sigset_t signals; + sigset_t oldsignals; - sigemptyset(&signals); - sigaddset(&signals, SIGHUP); - sigaddset(&signals, SIGINT); - sigaddset(&signals, SIGQUIT); - sigaddset(&signals, SIGPIPE); - sigaddset(&signals, SIGTERM); - sigaddset(&signals, SIGUSR1); - sigaddset(&signals, SIGUSR2); + sigemptyset (&signals); + sigaddset (&signals, SIGHUP); + sigaddset (&signals, SIGINT); + sigaddset (&signals, SIGQUIT); + sigaddset (&signals, SIGPIPE); + sigaddset (&signals, SIGTERM); + sigaddset (&signals, SIGUSR1); + sigaddset (&signals, SIGUSR2); - pthread_sigmask(SIG_BLOCK, &signals, &oldsignals); + pthread_sigmask (SIG_BLOCK, &signals, &oldsignals); - return oldsignals; + return oldsignals; } static void -jackctl_unblock_signals(sigset_t oldsignals) +jackctl_unblock_signals (sigset_t oldsignals) { - pthread_sigmask(SIG_SETMASK, &oldsignals, 0); + pthread_sigmask (SIG_SETMASK, &oldsignals, 0); } static jack_driver_param_constraint_desc_t * -get_realtime_priority_constraint() +get_realtime_priority_constraint () { #ifndef __OpenBSD__ - jack_driver_param_constraint_desc_t * constraint_ptr; + jack_driver_param_constraint_desc_t * constraint_ptr; - int max = sched_get_priority_max (SCHED_FIFO); - int min = sched_get_priority_min (SCHED_FIFO); + int max = sched_get_priority_max (SCHED_FIFO); + int min = sched_get_priority_min (SCHED_FIFO); - //jack_info("realtime priority range is (%d,%d)", min, max); + //jack_info("realtime priority range is (%d,%d)", min, max); - constraint_ptr = (jack_driver_param_constraint_desc_t *)calloc(1, sizeof(jack_driver_param_value_enum_t)); - if (constraint_ptr == NULL) - { - jack_error("Cannot allocate memory for jack_driver_param_constraint_desc_t structure."); - return NULL; - } - constraint_ptr->flags = JACK_CONSTRAINT_FLAG_RANGE; + constraint_ptr = (jack_driver_param_constraint_desc_t*)calloc (1, sizeof(jack_driver_param_value_enum_t)); + if (constraint_ptr == NULL) { + jack_error ("Cannot allocate memory for jack_driver_param_constraint_desc_t structure."); + return NULL; + } + constraint_ptr->flags = JACK_CONSTRAINT_FLAG_RANGE; - constraint_ptr->constraint.range.min.i = min; - constraint_ptr->constraint.range.max.i = max; + constraint_ptr->constraint.range.min.i = min; + constraint_ptr->constraint.range.max.i = max; - return constraint_ptr; + return constraint_ptr; #else - return NULL + return NULL #endif } -jackctl_server_t * jackctl_server_create( - bool (* on_device_acquire)(const char * device_name), - void (* on_device_release)(const char * device_name)) +jackctl_server_t * jackctl_server_create ( + bool (* on_device_acquire)(const char * device_name), + void (* on_device_release)(const char * device_name)) { - struct jackctl_server * server_ptr; - union jackctl_parameter_value value; - - server_ptr = (struct jackctl_server *)malloc(sizeof(struct jackctl_server)); - if (server_ptr == NULL) - { - jack_error("Cannot allocate memory for jackctl_server structure."); - goto fail; - } - - server_ptr->drivers = NULL; - server_ptr->internals = NULL; - server_ptr->parameters = NULL; - server_ptr->engine = NULL; - - strcpy(value.str, jack_default_server_name() ); - if (jackctl_add_parameter( - &server_ptr->parameters, - 'n', - "name", - "Server name to use.", - "", - JackParamString, - &server_ptr->name, - &server_ptr->default_name, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'R', - "realtime", - "Whether to use realtime mode.", - "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.", - JackParamBool, - &server_ptr->realtime, - &server_ptr->default_realtime, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.i = 10; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'P', - "realtime-priority", - "Scheduler priority when running in realtime mode.", - "", - JackParamInt, - &server_ptr->realtime_priority, - &server_ptr->default_realtime_priority, - value, - get_realtime_priority_constraint() - ) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'T', - "temporary", - "Exit once all clients have closed their connections.", - "", - JackParamBool, - &server_ptr->temporary, - &server_ptr->default_temporary, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'v', - "verbose", - "Verbose mode.", - "", - JackParamBool, - &server_ptr->verbose, - &server_ptr->default_verbose, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.i = 0; - if (jackctl_add_parameter( - &server_ptr->parameters, - 't', - "client-timeout", - "Client timeout limit in milliseconds.", - "", - JackParamInt, - &server_ptr->client_timeout, - &server_ptr->default_client_timeout, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.ui = 0; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'c', - "clock-source", - "Clocksource type : c(ycle) | h(pet) | s(ystem).", - "", - JackParamUInt, - &server_ptr->clock_source, - &server_ptr->default_clock_source, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.ui = 128; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'p', - "port-max", - "Maximum number of ports.", - "", - JackParamUInt, - &server_ptr->port_max, - &server_ptr->default_port_max, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - '\0', - "replace-registry", - "Replace shared memory registry.", - "", - JackParamBool, - &server_ptr->replace_registry, - &server_ptr->default_replace_registry, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'm', - "mlock", - "Use mlock.", - "", - JackParamBool, - &server_ptr->do_mlock, - &server_ptr->default_do_mlock, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'u', - "unlock", - "munlock memory for big libraries", - "", - JackParamBool, - &server_ptr->do_unlock, - &server_ptr->default_do_unlock, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.b = false; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'Z', - "nozombies", - "dont zombifiy offending clients", - "", - JackParamBool, - &server_ptr->nozombies, - &server_ptr->default_nozombies, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - value.ui = 0; - if (jackctl_add_parameter( - &server_ptr->parameters, - 'C', - "timeout-threshold", - "threshold for suspending processing", - "", - JackParamUInt, - &server_ptr->timothres, - &server_ptr->default_timothres, - value, NULL) == NULL) - { - goto fail_free_parameters; - } - - //TODO: need - //JackServerGlobals::on_device_acquire = on_device_acquire; - //JackServerGlobals::on_device_release = on_device_release; - - if (!jackctl_drivers_load(server_ptr)) - { - goto fail_free_parameters; - } - - /* Allowed to fail */ - jackctl_internals_load(server_ptr); - - return server_ptr; + struct jackctl_server * server_ptr; + union jackctl_parameter_value value; + + server_ptr = (struct jackctl_server*)malloc (sizeof(struct jackctl_server)); + if (server_ptr == NULL) { + jack_error ("Cannot allocate memory for jackctl_server structure."); + goto fail; + } + + server_ptr->drivers = NULL; + server_ptr->internals = NULL; + server_ptr->parameters = NULL; + server_ptr->engine = NULL; + + strcpy (value.str, jack_default_server_name () ); + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'n', + "name", + "Server name to use.", + "", + JackParamString, + &server_ptr->name, + &server_ptr->default_name, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'R', + "realtime", + "Whether to use realtime mode.", + "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.", + JackParamBool, + &server_ptr->realtime, + &server_ptr->default_realtime, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.i = 10; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'P', + "realtime-priority", + "Scheduler priority when running in realtime mode.", + "", + JackParamInt, + &server_ptr->realtime_priority, + &server_ptr->default_realtime_priority, + value, + get_realtime_priority_constraint () + ) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'T', + "temporary", + "Exit once all clients have closed their connections.", + "", + JackParamBool, + &server_ptr->temporary, + &server_ptr->default_temporary, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'v', + "verbose", + "Verbose mode.", + "", + JackParamBool, + &server_ptr->verbose, + &server_ptr->default_verbose, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.i = 0; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 't', + "client-timeout", + "Client timeout limit in milliseconds.", + "", + JackParamInt, + &server_ptr->client_timeout, + &server_ptr->default_client_timeout, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.ui = 0; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'c', + "clock-source", + "Clocksource type : c(ycle) | h(pet) | s(ystem).", + "", + JackParamUInt, + &server_ptr->clock_source, + &server_ptr->default_clock_source, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.ui = 128; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'p', + "port-max", + "Maximum number of ports.", + "", + JackParamUInt, + &server_ptr->port_max, + &server_ptr->default_port_max, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + '\0', + "replace-registry", + "Replace shared memory registry.", + "", + JackParamBool, + &server_ptr->replace_registry, + &server_ptr->default_replace_registry, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'm', + "mlock", + "Use mlock.", + "", + JackParamBool, + &server_ptr->do_mlock, + &server_ptr->default_do_mlock, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'u', + "unlock", + "munlock memory for big libraries", + "", + JackParamBool, + &server_ptr->do_unlock, + &server_ptr->default_do_unlock, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.b = false; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'Z', + "nozombies", + "dont zombifiy offending clients", + "", + JackParamBool, + &server_ptr->nozombies, + &server_ptr->default_nozombies, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + value.ui = 0; + if (jackctl_add_parameter ( + &server_ptr->parameters, + 'C', + "timeout-threshold", + "threshold for suspending processing", + "", + JackParamUInt, + &server_ptr->timothres, + &server_ptr->default_timothres, + value, NULL) == NULL) { + goto fail_free_parameters; + } + + //TODO: need + //JackServerGlobals::on_device_acquire = on_device_acquire; + //JackServerGlobals::on_device_release = on_device_release; + + if (!jackctl_drivers_load (server_ptr)) { + goto fail_free_parameters; + } + + /* Allowed to fail */ + jackctl_internals_load (server_ptr); + + return server_ptr; fail_free_parameters: - jackctl_server_free_parameters(server_ptr); + jackctl_server_free_parameters (server_ptr); - free(server_ptr); + free (server_ptr); fail: - return NULL; + return NULL; } -void jackctl_server_destroy(jackctl_server_t *server_ptr) +void jackctl_server_destroy (jackctl_server_t *server_ptr) { - jackctl_server_free_drivers(server_ptr); - jackctl_server_free_internals(server_ptr); - jackctl_server_free_parameters(server_ptr); - free(server_ptr); + jackctl_server_free_drivers (server_ptr); + jackctl_server_free_internals (server_ptr); + jackctl_server_free_parameters (server_ptr); + free (server_ptr); } -const JSList * jackctl_server_get_drivers_list(jackctl_server_t *server_ptr) +const JSList * jackctl_server_get_drivers_list (jackctl_server_t *server_ptr) { - return server_ptr->drivers; + return server_ptr->drivers; } -bool jackctl_server_stop(jackctl_server_t *server_ptr) +bool jackctl_server_stop (jackctl_server_t *server_ptr) { //jack_engine_driver_exit (server_ptr->engine); jack_engine_delete (server_ptr->engine); - /* clean up shared memory and files from this server instance */ - //jack_log("cleaning up shared memory"); + /* clean up shared memory and files from this server instance */ + //jack_log("cleaning up shared memory"); - jack_cleanup_shm(); + jack_cleanup_shm (); - //jack_log("cleaning up files"); + //jack_log("cleaning up files"); - jack_cleanup_files (server_ptr->name.str); + jack_cleanup_files (server_ptr->name.str); - //jack_log("unregistering server `%s'", server_ptr->name.str); + //jack_log("unregistering server `%s'", server_ptr->name.str); - jack_unregister_server(server_ptr->name.str); + jack_unregister_server (server_ptr->name.str); - server_ptr->engine = NULL; + server_ptr->engine = NULL; - return true; + return true; } -const JSList * jackctl_server_get_parameters(jackctl_server_t *server_ptr) +const JSList * jackctl_server_get_parameters (jackctl_server_t *server_ptr) { - return server_ptr->parameters; + return server_ptr->parameters; } bool -jackctl_server_start( - jackctl_server_t *server_ptr, - jackctl_driver_t *driver_ptr) +jackctl_server_start ( + jackctl_server_t *server_ptr, + jackctl_driver_t *driver_ptr) { - int rc; - sigset_t oldsignals; - - - // TODO: - int frame_time_offset = 0; - - rc = jack_register_server (server_ptr->name.str, server_ptr->replace_registry.b); - switch (rc) - { - case EEXIST: - jack_error("`%s' server already active", server_ptr->name.str); - goto fail; - case ENOSPC: - jack_error("too many servers already active"); - goto fail; - case ENOMEM: - jack_error("no access to shm registry"); - goto fail; - } - - //jack_log("server `%s' registered", server_ptr->name.str); - - /* clean up shared memory and files from any previous - * instance of this server name */ - jack_cleanup_shm (); - jack_cleanup_files (server_ptr->name.str); - - if (!server_ptr->realtime.b && server_ptr->client_timeout.i == 0) - server_ptr->client_timeout.i = 500; /* 0.5 sec; usable when non realtime. */ - - oldsignals = jackctl_block_signals(); - - if ((server_ptr->engine = jack_engine_new (server_ptr->realtime.b, server_ptr->realtime_priority.i, - server_ptr->do_mlock.b, server_ptr->do_unlock.b, server_ptr->name.str, - server_ptr->temporary.b, server_ptr->verbose.b, server_ptr->client_timeout.i, - server_ptr->port_max.i, getpid(), frame_time_offset, - server_ptr->nozombies.b, server_ptr->timothres.ui, drivers)) == 0) { - jack_error ("cannot create engine"); - goto fail_unregister; - } - - if (jack_engine_load_driver (server_ptr->engine, driver_ptr->desc_ptr, driver_ptr->set_parameters)) - { + int rc; + sigset_t oldsignals; + + + // TODO: + int frame_time_offset = 0; + + rc = jack_register_server (server_ptr->name.str, server_ptr->replace_registry.b); + switch (rc) { + case EEXIST: + jack_error ("`%s' server already active", server_ptr->name.str); + goto fail; + case ENOSPC: + jack_error ("too many servers already active"); + goto fail; + case ENOMEM: + jack_error ("no access to shm registry"); + goto fail; + } + + //jack_log("server `%s' registered", server_ptr->name.str); + + /* clean up shared memory and files from any previous + * instance of this server name */ + jack_cleanup_shm (); + jack_cleanup_files (server_ptr->name.str); + + if (!server_ptr->realtime.b && server_ptr->client_timeout.i == 0) { + server_ptr->client_timeout.i = 500; /* 0.5 sec; usable when non realtime. */ + + } + oldsignals = jackctl_block_signals (); + + if ((server_ptr->engine = jack_engine_new (server_ptr->realtime.b, server_ptr->realtime_priority.i, + server_ptr->do_mlock.b, server_ptr->do_unlock.b, server_ptr->name.str, + server_ptr->temporary.b, server_ptr->verbose.b, server_ptr->client_timeout.i, + server_ptr->port_max.i, getpid (), frame_time_offset, + server_ptr->nozombies.b, server_ptr->timothres.ui, drivers)) == 0) { + jack_error ("cannot create engine"); + goto fail_unregister; + } + + if (jack_engine_load_driver (server_ptr->engine, driver_ptr->desc_ptr, driver_ptr->set_parameters)) { jack_error ("cannot load driver module %s", driver_ptr->desc_ptr->name); goto fail_delete; - } + } - if (server_ptr->engine->driver->start (server_ptr->engine->driver) != 0) { - jack_error ("cannot start driver"); - goto fail_close; - } + if (server_ptr->engine->driver->start (server_ptr->engine->driver) != 0) { + jack_error ("cannot start driver"); + goto fail_close; + } - jackctl_unblock_signals( oldsignals ); - return true; + jackctl_unblock_signals ( oldsignals ); + return true; fail_close: fail_delete: - jack_engine_delete (server_ptr->engine); - server_ptr->engine = NULL; + jack_engine_delete (server_ptr->engine); + server_ptr->engine = NULL; fail_unregister: - //jack_log("cleaning up shared memory"); + //jack_log("cleaning up shared memory"); - jack_cleanup_shm(); + jack_cleanup_shm (); - //jack_log("cleaning up files"); + //jack_log("cleaning up files"); - jack_cleanup_files(server_ptr->name.str); + jack_cleanup_files (server_ptr->name.str); - //jack_log("unregistering server `%s'", server_ptr->name.str); + //jack_log("unregistering server `%s'", server_ptr->name.str); - jack_unregister_server(server_ptr->name.str); - jackctl_unblock_signals( oldsignals ); + jack_unregister_server (server_ptr->name.str); + jackctl_unblock_signals ( oldsignals ); fail: - return false; + return false; } -const char * jackctl_driver_get_name(jackctl_driver_t *driver_ptr) +const char * jackctl_driver_get_name (jackctl_driver_t *driver_ptr) { - return driver_ptr->desc_ptr->name; + return driver_ptr->desc_ptr->name; } -const JSList * jackctl_driver_get_parameters(jackctl_driver_t *driver_ptr) +const JSList * jackctl_driver_get_parameters (jackctl_driver_t *driver_ptr) { - return driver_ptr->parameters; + return driver_ptr->parameters; } -jack_driver_desc_t * jackctl_driver_get_desc(jackctl_driver_t *driver_ptr) +jack_driver_desc_t * jackctl_driver_get_desc (jackctl_driver_t *driver_ptr) { - return driver_ptr->desc_ptr; + return driver_ptr->desc_ptr; } -const char * jackctl_parameter_get_name(jackctl_parameter_t *parameter_ptr) +const char * jackctl_parameter_get_name (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->name; + return parameter_ptr->name; } -const char * jackctl_parameter_get_short_description(jackctl_parameter_t *parameter_ptr) +const char * jackctl_parameter_get_short_description (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->short_description; + return parameter_ptr->short_description; } -const char * jackctl_parameter_get_long_description(jackctl_parameter_t *parameter_ptr) +const char * jackctl_parameter_get_long_description (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->long_description; + return parameter_ptr->long_description; } -bool jackctl_parameter_has_range_constraint(jackctl_parameter_t *parameter_ptr) +bool jackctl_parameter_has_range_constraint (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_RANGE) != 0; + return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_RANGE) != 0; } -bool jackctl_parameter_has_enum_constraint(jackctl_parameter_t *parameter_ptr) +bool jackctl_parameter_has_enum_constraint (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_RANGE) == 0; + return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_RANGE) == 0; } -uint32_t jackctl_parameter_get_enum_constraints_count(jackctl_parameter_t *parameter_ptr) +uint32_t jackctl_parameter_get_enum_constraints_count (jackctl_parameter_t *parameter_ptr) { - if (!jackctl_parameter_has_enum_constraint(parameter_ptr)) - { - return 0; - } + if (!jackctl_parameter_has_enum_constraint (parameter_ptr)) { + return 0; + } - return parameter_ptr->constraint_ptr->constraint.enumeration.count; + return parameter_ptr->constraint_ptr->constraint.enumeration.count; } -union jackctl_parameter_value jackctl_parameter_get_enum_constraint_value(jackctl_parameter_t *parameter_ptr, uint32_t index) +union jackctl_parameter_value jackctl_parameter_get_enum_constraint_value (jackctl_parameter_t *parameter_ptr, uint32_t index) { - jack_driver_param_value_t * value_ptr; - union jackctl_parameter_value jackctl_value; - - value_ptr = ¶meter_ptr->constraint_ptr->constraint.enumeration.possible_values_array[index].value; - - switch (parameter_ptr->type) - { - case JackParamInt: - jackctl_value.i = value_ptr->i; - break; - case JackParamUInt: - jackctl_value.ui = value_ptr->ui; - break; - case JackParamChar: - jackctl_value.c = value_ptr->c; - break; - case JackParamString: - strcpy(jackctl_value.str, value_ptr->str); - break; - default: - jack_error("bad driver parameter type %i (enum constraint)", (int)parameter_ptr->type); - assert(0); - } - - return jackctl_value; + jack_driver_param_value_t * value_ptr; + union jackctl_parameter_value jackctl_value; + + value_ptr = ¶meter_ptr->constraint_ptr->constraint.enumeration.possible_values_array[index].value; + + switch (parameter_ptr->type) { + case JackParamInt: + jackctl_value.i = value_ptr->i; + break; + case JackParamUInt: + jackctl_value.ui = value_ptr->ui; + break; + case JackParamChar: + jackctl_value.c = value_ptr->c; + break; + case JackParamString: + strcpy (jackctl_value.str, value_ptr->str); + break; + default: + jack_error ("bad driver parameter type %i (enum constraint)", (int)parameter_ptr->type); + assert (0); + } + + return jackctl_value; } -const char * jackctl_parameter_get_enum_constraint_description(jackctl_parameter_t *parameter_ptr, uint32_t index) +const char * jackctl_parameter_get_enum_constraint_description (jackctl_parameter_t *parameter_ptr, uint32_t index) { - return parameter_ptr->constraint_ptr->constraint.enumeration.possible_values_array[index].short_desc; + return parameter_ptr->constraint_ptr->constraint.enumeration.possible_values_array[index].short_desc; } -void jackctl_parameter_get_range_constraint(jackctl_parameter_t *parameter_ptr, union jackctl_parameter_value * min_ptr, union jackctl_parameter_value * max_ptr) +void jackctl_parameter_get_range_constraint (jackctl_parameter_t *parameter_ptr, union jackctl_parameter_value * min_ptr, union jackctl_parameter_value * max_ptr) { - switch (parameter_ptr->type) - { - case JackParamInt: - min_ptr->i = parameter_ptr->constraint_ptr->constraint.range.min.i; - max_ptr->i = parameter_ptr->constraint_ptr->constraint.range.max.i; - return; - case JackParamUInt: - min_ptr->ui = parameter_ptr->constraint_ptr->constraint.range.min.ui; - max_ptr->ui = parameter_ptr->constraint_ptr->constraint.range.max.ui; - return; - default: - jack_error("bad driver parameter type %i (range constraint)", (int)parameter_ptr->type); - assert(0); - } + switch (parameter_ptr->type) { + case JackParamInt: + min_ptr->i = parameter_ptr->constraint_ptr->constraint.range.min.i; + max_ptr->i = parameter_ptr->constraint_ptr->constraint.range.max.i; + return; + case JackParamUInt: + min_ptr->ui = parameter_ptr->constraint_ptr->constraint.range.min.ui; + max_ptr->ui = parameter_ptr->constraint_ptr->constraint.range.max.ui; + return; + default: + jack_error ("bad driver parameter type %i (range constraint)", (int)parameter_ptr->type); + assert (0); + } } -bool jackctl_parameter_constraint_is_strict(jackctl_parameter_t * parameter_ptr) +bool jackctl_parameter_constraint_is_strict (jackctl_parameter_t * parameter_ptr) { - return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_STRICT) != 0; + return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_STRICT) != 0; } -bool jackctl_parameter_constraint_is_fake_value(jackctl_parameter_t * parameter_ptr) +bool jackctl_parameter_constraint_is_fake_value (jackctl_parameter_t * parameter_ptr) { - return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_FAKE_VALUE) != 0; + return parameter_ptr->constraint_ptr != NULL && (parameter_ptr->constraint_ptr->flags & JACK_CONSTRAINT_FLAG_FAKE_VALUE) != 0; } -jackctl_param_type_t jackctl_parameter_get_type(jackctl_parameter_t *parameter_ptr) +jackctl_param_type_t jackctl_parameter_get_type (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->type; + return parameter_ptr->type; } -char jackctl_parameter_get_id(jackctl_parameter_t * parameter_ptr) +char jackctl_parameter_get_id (jackctl_parameter_t * parameter_ptr) { - return parameter_ptr->id; + return parameter_ptr->id; } -bool jackctl_parameter_is_set(jackctl_parameter_t *parameter_ptr) +bool jackctl_parameter_is_set (jackctl_parameter_t *parameter_ptr) { - return parameter_ptr->is_set; + return parameter_ptr->is_set; } -union jackctl_parameter_value jackctl_parameter_get_value(jackctl_parameter_t *parameter_ptr) +union jackctl_parameter_value jackctl_parameter_get_value (jackctl_parameter_t *parameter_ptr) { - return *(parameter_ptr->value_ptr); + return *(parameter_ptr->value_ptr); } -bool jackctl_parameter_reset(jackctl_parameter_t *parameter_ptr) +bool jackctl_parameter_reset (jackctl_parameter_t *parameter_ptr) { - if (!parameter_ptr->is_set) - { - return true; - } + if (!parameter_ptr->is_set) { + return true; + } - parameter_ptr->is_set = false; + parameter_ptr->is_set = false; - *parameter_ptr->value_ptr = *parameter_ptr->default_value_ptr; + *parameter_ptr->value_ptr = *parameter_ptr->default_value_ptr; - return true; + return true; } -bool jackctl_parameter_set_value(jackctl_parameter_t *parameter_ptr, const union jackctl_parameter_value * value_ptr) +bool jackctl_parameter_set_value (jackctl_parameter_t *parameter_ptr, const union jackctl_parameter_value * value_ptr) { - bool new_driver_parameter; + bool new_driver_parameter; - /* for driver parameters, set the parameter by adding jack_driver_param_t in the set_parameters list */ - if (parameter_ptr->driver_ptr != NULL) - { + /* for driver parameters, set the parameter by adding jack_driver_param_t in the set_parameters list */ + if (parameter_ptr->driver_ptr != NULL) { /* jack_info("setting driver parameter %p ...", parameter_ptr); */ - new_driver_parameter = parameter_ptr->driver_parameter_ptr == NULL; - if (new_driver_parameter) - { + new_driver_parameter = parameter_ptr->driver_parameter_ptr == NULL; + if (new_driver_parameter) { /* jack_info("new driver parameter..."); */ - parameter_ptr->driver_parameter_ptr = (jack_driver_param_t *)malloc(sizeof(jack_driver_param_t)); - if (parameter_ptr->driver_parameter_ptr == NULL) - { - jack_error ("Allocation of jack_driver_param_t structure failed"); - return false; - } - - parameter_ptr->driver_parameter_ptr->character = parameter_ptr->id; - parameter_ptr->driver_ptr->set_parameters = jack_slist_append(parameter_ptr->driver_ptr->set_parameters, parameter_ptr->driver_parameter_ptr); - } - - switch (parameter_ptr->type) - { - case JackParamInt: - parameter_ptr->driver_parameter_ptr->value.i = value_ptr->i; - break; - case JackParamUInt: - parameter_ptr->driver_parameter_ptr->value.ui = value_ptr->ui; - break; - case JackParamChar: - parameter_ptr->driver_parameter_ptr->value.c = value_ptr->c; - break; - case JackParamString: - strcpy(parameter_ptr->driver_parameter_ptr->value.str, value_ptr->str); - break; - case JackParamBool: - parameter_ptr->driver_parameter_ptr->value.i = value_ptr->b; - break; - default: - jack_error("unknown parameter type %i", (int)parameter_ptr->type); - assert(0); - - if (new_driver_parameter) - { - parameter_ptr->driver_ptr->set_parameters = jack_slist_remove(parameter_ptr->driver_ptr->set_parameters, parameter_ptr->driver_parameter_ptr); - } - - return false; - } - } - - parameter_ptr->is_set = true; - *parameter_ptr->value_ptr = *value_ptr; - - return true; + parameter_ptr->driver_parameter_ptr = (jack_driver_param_t*)malloc (sizeof(jack_driver_param_t)); + if (parameter_ptr->driver_parameter_ptr == NULL) { + jack_error ("Allocation of jack_driver_param_t structure failed"); + return false; + } + + parameter_ptr->driver_parameter_ptr->character = parameter_ptr->id; + parameter_ptr->driver_ptr->set_parameters = jack_slist_append (parameter_ptr->driver_ptr->set_parameters, parameter_ptr->driver_parameter_ptr); + } + + switch (parameter_ptr->type) { + case JackParamInt: + parameter_ptr->driver_parameter_ptr->value.i = value_ptr->i; + break; + case JackParamUInt: + parameter_ptr->driver_parameter_ptr->value.ui = value_ptr->ui; + break; + case JackParamChar: + parameter_ptr->driver_parameter_ptr->value.c = value_ptr->c; + break; + case JackParamString: + strcpy (parameter_ptr->driver_parameter_ptr->value.str, value_ptr->str); + break; + case JackParamBool: + parameter_ptr->driver_parameter_ptr->value.i = value_ptr->b; + break; + default: + jack_error ("unknown parameter type %i", (int)parameter_ptr->type); + assert (0); + + if (new_driver_parameter) { + parameter_ptr->driver_ptr->set_parameters = jack_slist_remove (parameter_ptr->driver_ptr->set_parameters, parameter_ptr->driver_parameter_ptr); + } + + return false; + } + } + + parameter_ptr->is_set = true; + *parameter_ptr->value_ptr = *value_ptr; + + return true; } -union jackctl_parameter_value jackctl_parameter_get_default_value(jackctl_parameter_t *parameter_ptr) +union jackctl_parameter_value jackctl_parameter_get_default_value (jackctl_parameter_t *parameter_ptr) { - return *(parameter_ptr->default_value_ptr); + return *(parameter_ptr->default_value_ptr); } // Internals clients -const JSList * jackctl_server_get_internals_list(jackctl_server_t *server_ptr) +const JSList * jackctl_server_get_internals_list (jackctl_server_t *server_ptr) { - return server_ptr->internals; + return server_ptr->internals; } -const char * jackctl_internal_get_name(jackctl_internal_t *internal_ptr) +const char * jackctl_internal_get_name (jackctl_internal_t *internal_ptr) { - return internal_ptr->desc_ptr->name; + return internal_ptr->desc_ptr->name; } -const JSList * jackctl_internal_get_parameters(jackctl_internal_t *internal_ptr) +const JSList * jackctl_internal_get_parameters (jackctl_internal_t *internal_ptr) { - return internal_ptr->parameters; + return internal_ptr->parameters; } -bool jackctl_server_load_internal( - jackctl_server_t * server_ptr, - jackctl_internal_t * internal) +bool jackctl_server_load_internal ( + jackctl_server_t * server_ptr, + jackctl_internal_t * internal) { return false; } -bool jackctl_server_unload_internal( - jackctl_server_t * server_ptr, - jackctl_internal_t * internal) +bool jackctl_server_unload_internal ( + jackctl_server_t * server_ptr, + jackctl_internal_t * internal) { return false; } -bool jackctl_server_add_slave(jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr) +bool jackctl_server_add_slave (jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr) { return false; } -bool jackctl_server_remove_slave(jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr) +bool jackctl_server_remove_slave (jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr) { return false; } -bool jackctl_server_switch_master(jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr) +bool jackctl_server_switch_master (jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr) { - jack_driver_t *old_driver; + jack_driver_t *old_driver; - if (server_ptr->engine == NULL) - goto fail_nostart; + if (server_ptr->engine == NULL) { + goto fail_nostart; + } - old_driver = server_ptr->engine->driver; + old_driver = server_ptr->engine->driver; - if (old_driver) - { - old_driver->stop (old_driver ); - old_driver->detach (old_driver, server_ptr->engine); + if (old_driver) { + old_driver->stop (old_driver ); + old_driver->detach (old_driver, server_ptr->engine); - pthread_mutex_lock (&server_ptr->engine->request_lock); - jack_lock_graph (server_ptr->engine); - jack_remove_client (server_ptr->engine, old_driver->internal_client); - jack_unlock_graph (server_ptr->engine); - pthread_mutex_unlock (&server_ptr->engine->request_lock); + pthread_mutex_lock (&server_ptr->engine->request_lock); + jack_lock_graph (server_ptr->engine); + jack_remove_client (server_ptr->engine, old_driver->internal_client); + jack_unlock_graph (server_ptr->engine); + pthread_mutex_unlock (&server_ptr->engine->request_lock); - server_ptr->engine->driver = NULL; + server_ptr->engine->driver = NULL; - jack_driver_unload (old_driver); - } + jack_driver_unload (old_driver); + } - if (jack_engine_load_driver (server_ptr->engine, driver_ptr->desc_ptr, driver_ptr->set_parameters)) - { - jack_error ("cannot load driver module %s", driver_ptr->desc_ptr->name); - goto fail_nodriver; - } + if (jack_engine_load_driver (server_ptr->engine, driver_ptr->desc_ptr, driver_ptr->set_parameters)) { + jack_error ("cannot load driver module %s", driver_ptr->desc_ptr->name); + goto fail_nodriver; + } - if (server_ptr->engine->driver->start (server_ptr->engine->driver) != 0) { - jack_error ("cannot start driver"); - jack_use_driver(server_ptr->engine, NULL); - goto fail_nodriver; - } + if (server_ptr->engine->driver->start (server_ptr->engine->driver) != 0) { + jack_error ("cannot start driver"); + jack_use_driver (server_ptr->engine, NULL); + goto fail_nodriver; + } - return true; + return true; fail_nodriver: - jack_error ("could not initialise new driver, leaving without driver"); + jack_error ("could not initialise new driver, leaving without driver"); fail_nostart: - return false; + return false; } |