diff --git a/common/JackControlAPI.cpp b/common/JackControlAPI.cpp index bccb1492..a2e94fe8 100644 --- a/common/JackControlAPI.cpp +++ b/common/JackControlAPI.cpp @@ -100,7 +100,6 @@ struct jackctl_driver { jack_driver_desc_t * desc_ptr; JSList * parameters; - JSList * set_parameters; JSList * infos; }; @@ -108,7 +107,6 @@ struct jackctl_internal { jack_driver_desc_t * desc_ptr; JSList * parameters; - JSList * set_parameters; int refnum; }; @@ -126,7 +124,6 @@ struct jackctl_parameter 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; }; @@ -174,7 +171,6 @@ jackctl_add_parameter( *value_ptr = *default_value_ptr = value; parameter_ptr->driver_ptr = NULL; - parameter_ptr->driver_parameter_ptr = NULL; parameter_ptr->id = 0; parameter_ptr->constraint_ptr = constraint_ptr; @@ -200,14 +196,6 @@ jackctl_free_driver_parameters( 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 @@ -282,6 +270,86 @@ fail: return false; } +/* destroy jack_driver_param_desc_t list created by jackctl_create_param_list() */ +static void +jackctl_destroy_param_list( + JSList * params) +{ + JSList * next; + + while (params) + { + next = params->next; + free(params->data); + free(params); + params = next; + } +} + +/* for drivers and internals are configured through jack_driver_param_t JSList */ +/* this function creates such list from a jackctl_parameter list */ +static JSList * +jackctl_create_param_list( + const JSList * paramlist) +{ + jackctl_parameter * param_ptr; + jack_driver_param_t * retparam_ptr; + JSList * retparamlist; + + retparamlist = NULL; + while (paramlist != NULL) + { + param_ptr = (jackctl_parameter *)paramlist->data; + if (param_ptr->is_set) + { + /* jack_info("setting driver parameter %p ...", parameter_ptr); */ + retparam_ptr = (jack_driver_param_t *)malloc(sizeof(jack_driver_param_t)); + if (retparam_ptr == NULL) + { + jack_error ("Allocation of jack_driver_param_t structure failed"); + goto destroy; + } + + retparam_ptr->character = param_ptr->id; + + switch (param_ptr->type) + { + case JackParamInt: + retparam_ptr->value.i = param_ptr->value_ptr->i; + break; + case JackParamUInt: + retparam_ptr->value.ui = param_ptr->value_ptr->ui; + break; + case JackParamChar: + retparam_ptr->value.c = param_ptr->value_ptr->c; + break; + case JackParamString: + strcpy(retparam_ptr->value.str, param_ptr->value_ptr->str); + break; + case JackParamBool: + retparam_ptr->value.i = param_ptr->value_ptr->b; + break; + default: + jack_error("Unknown parameter type %i", (int)param_ptr->type); + assert(0); + goto free; + } + + retparamlist = jack_slist_append(retparamlist, retparam_ptr); + } + + paramlist = paramlist->next; + } + + return retparamlist; + +free: + free(retparam_ptr); +destroy: + jackctl_destroy_param_list(retparamlist); + return NULL; +} + static int jackctl_drivers_load( struct jackctl_server * server_ptr) @@ -308,7 +376,6 @@ jackctl_drivers_load( driver_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; driver_ptr->parameters = NULL; - driver_ptr->set_parameters = NULL; driver_ptr->infos = NULL; if (!jackctl_add_driver_parameters(driver_ptr)) @@ -378,7 +445,6 @@ jackctl_internals_load( internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; internal_ptr->parameters = NULL; - internal_ptr->set_parameters = NULL; internal_ptr->refnum = -1; if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) @@ -886,6 +952,8 @@ jackctl_server_open( jackctl_server *server_ptr, jackctl_driver *driver_ptr) { + JSList * paramlist = NULL; + try { if (!server_ptr || !driver_ptr) { @@ -940,7 +1008,10 @@ jackctl_server_open( goto fail_unregister; } - rc = server_ptr->engine->Open(driver_ptr->desc_ptr, driver_ptr->set_parameters); + paramlist = jackctl_create_param_list(driver_ptr->parameters); + if (paramlist == NULL) goto fail_delete; + rc = server_ptr->engine->Open(driver_ptr->desc_ptr, paramlist); + jackctl_destroy_param_list(paramlist); if (rc < 0) { jack_error("JackServer::Open failed with %d", rc); @@ -951,6 +1022,7 @@ jackctl_server_open( } catch (std::exception e) { jack_error("jackctl_server_open error..."); + jackctl_destroy_param_list(paramlist); } fail_delete: @@ -1171,57 +1243,6 @@ SERVER_EXPORT bool jackctl_parameter_set_value(jackctl_parameter *parameter_ptr, return NULL; } - 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) - { -/* jack_info("setting driver parameter %p ...", parameter_ptr); */ - 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; @@ -1266,7 +1287,10 @@ SERVER_EXPORT bool jackctl_server_load_internal( int status; if (server_ptr->engine != NULL) { - server_ptr->engine->InternalClientLoad2(internal->desc_ptr->name, internal->desc_ptr->name, internal->set_parameters, JackNullOption, &internal->refnum, -1, &status); + JSList * paramlist = jackctl_create_param_list(internal->parameters); + if (paramlist == NULL) return false; + server_ptr->engine->InternalClientLoad2(internal->desc_ptr->name, internal->desc_ptr->name, paramlist, JackNullOption, &internal->refnum, -1, &status); + jackctl_destroy_param_list(paramlist); return (internal->refnum > 0); } else { return false; @@ -1297,7 +1321,10 @@ SERVER_EXPORT bool jackctl_server_add_slave(jackctl_server * server_ptr, jackctl jack_error("Cannot add a slave in a running server"); return false; } else { - JackDriverInfo* info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, driver_ptr->set_parameters); + JSList * paramlist = jackctl_create_param_list(driver_ptr->parameters); + if (paramlist == NULL) return false; + JackDriverInfo* info = server_ptr->engine->AddSlave(driver_ptr->desc_ptr, paramlist); + jackctl_destroy_param_list(paramlist); if (info) { driver_ptr->infos = jack_slist_append(driver_ptr->infos, info); return true; @@ -1336,7 +1363,12 @@ SERVER_EXPORT bool jackctl_server_remove_slave(jackctl_server * server_ptr, jack SERVER_EXPORT bool jackctl_server_switch_master(jackctl_server * server_ptr, jackctl_driver * driver_ptr) { if (server_ptr && server_ptr->engine) { - return (server_ptr->engine->SwitchMaster(driver_ptr->desc_ptr, driver_ptr->set_parameters) == 0); + JSList * paramlist = jackctl_create_param_list(driver_ptr->parameters); + if (paramlist == NULL) return false; + jackctl_destroy_param_list(paramlist); + bool ret = (server_ptr->engine->SwitchMaster(driver_ptr->desc_ptr, paramlist) == 0); + jackctl_destroy_param_list(paramlist); + return ret; } else { return false; } diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index a79772f2..897594b9 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -731,13 +731,13 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () desc = jack_driver_descriptor_construct("alsa", JackDriverMaster, "Linux ALSA API based audio backend", &filler); + strcpy(value.str, "hw:0"); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, enum_alsa_devices(), "ALSA device name", NULL); + strcpy(value.str, "none"); jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Provide playback ports. Optionally set device", NULL); - strcpy(value.str, "hw:0"); - jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, enum_alsa_devices(), "ALSA device name", NULL); - value.ui = 48000U; jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL);