Browse Source

Merge pull request #11 from jackaudio/param-order

Enforced driver/internal parameter order
tags/1.9.9.5
Stéphane Letz 13 years ago
parent
commit
bd9b764545
2 changed files with 104 additions and 72 deletions
  1. +101
    -69
      common/JackControlAPI.cpp
  2. +3
    -3
      linux/alsa/JackAlsaDriver.cpp

+ 101
- 69
common/JackControlAPI.cpp View File

@@ -100,7 +100,6 @@ struct jackctl_driver
{ {
jack_driver_desc_t * desc_ptr; jack_driver_desc_t * desc_ptr;
JSList * parameters; JSList * parameters;
JSList * set_parameters;
JSList * infos; JSList * infos;
}; };


@@ -108,7 +107,6 @@ struct jackctl_internal
{ {
jack_driver_desc_t * desc_ptr; jack_driver_desc_t * desc_ptr;
JSList * parameters; JSList * parameters;
JSList * set_parameters;
int refnum; int refnum;
}; };


@@ -126,7 +124,6 @@ struct jackctl_parameter
union jackctl_parameter_value default_value; union jackctl_parameter_value default_value;
struct jackctl_driver * driver_ptr; struct jackctl_driver * driver_ptr;
char id; char id;
jack_driver_param_t * driver_parameter_ptr;
jack_driver_param_constraint_desc_t * constraint_ptr; jack_driver_param_constraint_desc_t * constraint_ptr;
}; };


@@ -174,7 +171,6 @@ jackctl_add_parameter(
*value_ptr = *default_value_ptr = value; *value_ptr = *default_value_ptr = value;


parameter_ptr->driver_ptr = NULL; parameter_ptr->driver_ptr = NULL;
parameter_ptr->driver_parameter_ptr = NULL;
parameter_ptr->id = 0; parameter_ptr->id = 0;
parameter_ptr->constraint_ptr = constraint_ptr; parameter_ptr->constraint_ptr = constraint_ptr;


@@ -200,14 +196,6 @@ jackctl_free_driver_parameters(
free(driver_ptr->parameters); free(driver_ptr->parameters);
driver_ptr->parameters = next_node_ptr; 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 static
@@ -282,6 +270,86 @@ fail:
return false; 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 static int
jackctl_drivers_load( jackctl_drivers_load(
struct jackctl_server * server_ptr) 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->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data;
driver_ptr->parameters = NULL; driver_ptr->parameters = NULL;
driver_ptr->set_parameters = NULL;
driver_ptr->infos = NULL; driver_ptr->infos = NULL;


if (!jackctl_add_driver_parameters(driver_ptr)) 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->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data;
internal_ptr->parameters = NULL; internal_ptr->parameters = NULL;
internal_ptr->set_parameters = NULL;
internal_ptr->refnum = -1; internal_ptr->refnum = -1;


if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr))
@@ -886,6 +952,8 @@ jackctl_server_open(
jackctl_server *server_ptr, jackctl_server *server_ptr,
jackctl_driver *driver_ptr) jackctl_driver *driver_ptr)
{ {
JSList * paramlist = NULL;

try { try {


if (!server_ptr || !driver_ptr) { if (!server_ptr || !driver_ptr) {
@@ -940,7 +1008,10 @@ jackctl_server_open(
goto fail_unregister; 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) if (rc < 0)
{ {
jack_error("JackServer::Open failed with %d", rc); jack_error("JackServer::Open failed with %d", rc);
@@ -951,6 +1022,7 @@ jackctl_server_open(


} catch (std::exception e) { } catch (std::exception e) {
jack_error("jackctl_server_open error..."); jack_error("jackctl_server_open error...");
jackctl_destroy_param_list(paramlist);
} }


fail_delete: fail_delete:
@@ -1171,57 +1243,6 @@ SERVER_EXPORT bool jackctl_parameter_set_value(jackctl_parameter *parameter_ptr,
return NULL; 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->is_set = true;
*parameter_ptr->value_ptr = *value_ptr; *parameter_ptr->value_ptr = *value_ptr;


@@ -1266,7 +1287,10 @@ SERVER_EXPORT bool jackctl_server_load_internal(


int status; int status;
if (server_ptr->engine != NULL) { 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); return (internal->refnum > 0);
} else { } else {
return false; 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"); jack_error("Cannot add a slave in a running server");
return false; return false;
} else { } 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) { if (info) {
driver_ptr->infos = jack_slist_append(driver_ptr->infos, info); driver_ptr->infos = jack_slist_append(driver_ptr->infos, info);
return true; 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) SERVER_EXPORT bool jackctl_server_switch_master(jackctl_server * server_ptr, jackctl_driver * driver_ptr)
{ {
if (server_ptr && server_ptr->engine) { 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 { } else {
return false; return false;
} }


+ 3
- 3
linux/alsa/JackAlsaDriver.cpp View File

@@ -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); 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"); 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, "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); 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; value.ui = 48000U;
jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL);




Loading…
Cancel
Save