From a9e4628340a0fe4d36cc0e684c71af16a4e3717d Mon Sep 17 00:00:00 2001 From: Nedko Arnaudov Date: Fri, 22 Apr 2011 22:14:31 +0300 Subject: [PATCH] helper functions for jack_driver_desc_t construction The main goal is to reduce risk of mismatch between allocated and initialized parameter numbers. --- common/JackDriverLoader.cpp | 101 ++++++++ common/JackDummyDriver.cpp | 77 ++---- common/JackLoopbackDriver.cpp | 23 +- common/JackNetAdapter.cpp | 139 +++-------- common/JackNetDriver.cpp | 126 +++------- common/JackNetManager.cpp | 46 ++-- common/JackNetOneDriver.cpp | 218 +++++------------ common/JackProfiler.cpp | 41 +--- common/driver_interface.h | 23 ++ linux/alsa/JackAlsaAdapter.cpp | 136 +++-------- linux/alsa/JackAlsaDriver.cpp | 251 ++++++-------------- linux/alsarawmidi/JackALSARawMidiDriver.cpp | 18 +- linux/firewire/JackFFADODriver.cpp | 162 ++++--------- linux/freebob/JackFreebobDriver.cpp | 131 +++------- macosx/coreaudio/JackCoreAudioAdapter.cpp | 148 +++--------- macosx/coreaudio/JackCoreAudioDriver.cpp | 190 ++++----------- macosx/coremidi/JackCoreMidiDriver.cpp | 32 +-- solaris/oss/JackBoomerDriver.cpp | 151 +++--------- solaris/oss/JackBoomerDriver.h | 1 - solaris/oss/JackOSSAdapter.cpp | 145 +++-------- solaris/oss/JackOSSAdapter.h | 1 - solaris/oss/JackOSSDriver.cpp | 151 +++--------- solaris/oss/JackOSSDriver.h | 1 - windows/portaudio/JackPortAudioAdapter.cpp | 123 +++------- windows/portaudio/JackPortAudioDriver.cpp | 151 +++--------- windows/winmme/JackWinMMEDriver.cpp | 10 +- 26 files changed, 769 insertions(+), 1827 deletions(-) diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index 84a97a54..2fcd6dce 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -834,3 +834,104 @@ JackDriverInfo::~JackDriverInfo() if (fHandle) UnloadDriverModule(fHandle); } + +EXPORT +jack_driver_desc_t * +jack_driver_descriptor_construct( + const char * name, + const char * description, + jack_driver_desc_filler_t * filler_ptr) +{ + size_t name_len; + size_t description_len; + jack_driver_desc_t * desc_ptr; + + name_len = strlen(name); + description_len = strlen(description); + + if (name_len > sizeof(desc_ptr->name) - 1 || + description_len > sizeof(desc_ptr->desc) - 1) { + assert(false); + return 0; + } + + desc_ptr = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); + if (desc_ptr == NULL) { + jack_error("calloc() failed to allocate memory for driver descriptor struct"); + return 0; + } + + memcpy(desc_ptr->name, name, name_len + 1); + memcpy(desc_ptr->desc, description, description_len + 1); + + desc_ptr->nparams = 0; + + if (filler_ptr != NULL) { + filler_ptr->size = 0; + } + + return desc_ptr; +} + +EXPORT +int +jack_driver_descriptor_add_parameter( + jack_driver_desc_t * desc_ptr, + jack_driver_desc_filler_t * filler_ptr, + const char * name, + char character, + jack_driver_param_type_t type, + const jack_driver_param_value_t * value_ptr, + jack_driver_param_constraint_desc_t * constraint, + const char * short_desc, + const char * long_desc) +{ + size_t name_len; + size_t short_desc_len; + size_t long_desc_len; + jack_driver_param_desc_t * param_ptr; + size_t newsize; + + name_len = strlen(name); + short_desc_len = strlen(short_desc); + + if (long_desc != NULL) { + long_desc_len = strlen(long_desc); + } else { + long_desc = short_desc; + long_desc_len = short_desc_len; + } + + if (name_len > sizeof(param_ptr->name) - 1 || + short_desc_len > sizeof(param_ptr->short_desc) - 1 || + long_desc_len > sizeof(param_ptr->long_desc) - 1) { + assert(false); + return 0; + } + + if (desc_ptr->nparams == filler_ptr->size) { + newsize = filler_ptr->size + 20; // most drivers have less than 20 parameters + param_ptr = (jack_driver_param_desc_t*)realloc (desc_ptr->params, newsize * sizeof (jack_driver_param_desc_t)); + if (param_ptr == NULL) { + jack_error("realloc() failed for parameter array of %zu elements", newsize); + return false; + } + filler_ptr->size = newsize; + desc_ptr->params = param_ptr; + } + + assert(desc_ptr->nparams < filler_ptr->size); + param_ptr = desc_ptr->params + desc_ptr->nparams; + + memcpy(param_ptr->name, name, name_len + 1); + param_ptr->character = character; + param_ptr->type = type; + param_ptr->value = *value_ptr; + param_ptr->constraint = constraint; + memcpy(param_ptr->short_desc, short_desc, short_desc_len + 1); + memcpy(param_ptr->long_desc, long_desc, long_desc_len + 1); + + desc_ptr->nparams++; + + return true; +} diff --git a/common/JackDummyDriver.cpp b/common/JackDummyDriver.cpp index 4c084f06..98c5227e 100644 --- a/common/JackDummyDriver.cpp +++ b/common/JackDummyDriver.cpp @@ -93,63 +93,26 @@ extern "C" SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor () { jack_driver_desc_t * desc; - unsigned int i; - - desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); - strcpy(desc->name, "dummy"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Timer based backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 6; - desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 2U; - strcpy(desc->params[i].short_desc, "Number of capture ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamUInt; - desc->params[1].value.ui = 2U; - strcpy(desc->params[i].short_desc, "Number of playback ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 48000U; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "monitor"); - desc->params[i].character = 'm'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = 0; - strcpy(desc->params[i].short_desc, "Provide monitor ports for the output"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 1024U; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "wait"); - desc->params[i].character = 'w'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 21333U; - strcpy(desc->params[i].short_desc, - "Number of usecs to wait between engine processes"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("dummy", "Timer based backend", &filler); + + value.ui = 2U; + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamUInt, &value, NULL, "Number of capture ports", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamUInt, &value, NULL, "Number of playback ports", NULL); + + value.ui = 48000U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL); + + value.ui = 1024U; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = 21333U; + jack_driver_descriptor_add_parameter(desc, &filler, "wait", 'w', JackDriverParamUInt, &value, NULL, "Number of usecs to wait between engine processes", NULL); return desc; } diff --git a/common/JackLoopbackDriver.cpp b/common/JackLoopbackDriver.cpp index 07778417..acb68e98 100644 --- a/common/JackLoopbackDriver.cpp +++ b/common/JackLoopbackDriver.cpp @@ -98,22 +98,13 @@ extern "C" SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { jack_driver_desc_t * desc; - unsigned int i; - - desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); - strcpy(desc->name, "loopback"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Loopback backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 1; - desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "channels"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Maximum number of loopback ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("loopback", "Loopback backend", &filler); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of loopback ports", NULL); return desc; } diff --git a/common/JackNetAdapter.cpp b/common/JackNetAdapter.cpp index c48e0fc1..3e985752 100644 --- a/common/JackNetAdapter.cpp +++ b/common/JackNetAdapter.cpp @@ -403,112 +403,47 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t* desc = (jack_driver_desc_t*) calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "netadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "netjack net <==> audio backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->params = (jack_driver_param_desc_t*) calloc(12, sizeof(jack_driver_param_desc_t)); - - int i = 0; - strcpy(desc->params[i].name, "multicast_ip"); - desc->params[i].character = 'a'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, DEFAULT_MULTICAST_IP); - strcpy(desc->params[i].short_desc, "Multicast Address"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "udp_net_port"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = DEFAULT_PORT; - strcpy(desc->params[i].short_desc, "UDP port"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "mtu"); - desc->params[i].character = 'M'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = DEFAULT_MTU; - strcpy(desc->params[i].short_desc, "MTU to the master"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "input-ports"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = 2; - strcpy(desc->params[i].short_desc, "Number of audio input ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "output-ports"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = 2; - strcpy(desc->params[i].short_desc, "Number of audio output ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("netadapter", "netjack net <==> audio backend adapter", &filler); + + strcpy(value.str, DEFAULT_MULTICAST_IP); + jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); + + value.i = DEFAULT_PORT; + jack_driver_descriptor_add_parameter(desc, &filler, "udp_net_port", 'p', JackDriverParamInt, &value, NULL, "UDP port", NULL); + + value.i = DEFAULT_MTU; + jack_driver_descriptor_add_parameter(desc, &filler, "mtu", 'M', JackDriverParamInt, &value, NULL, "MTU to the master", NULL); + + value.i = 2; + jack_driver_descriptor_add_parameter(desc, &filler, "input-ports", 'C', JackDriverParamInt, &value, NULL, "Number of audio input ports", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-ports", 'C', JackDriverParamInt, &value, NULL, "Number of audio output ports", NULL); #if HAVE_CELT - i++; - strcpy(desc->params[i].name, "celt"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Set CELT encoding and number of kBits per channel"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + value.i = -1; + jack_driver_descriptor_add_parameter(desc, &filler, "celt", 'c', JackDriverParamInt, &value, NULL, "Set CELT encoding and number of kBits per channel", NULL); #endif - i++; - strcpy(desc->params[i].name, "client-name"); - desc->params[i].character = 'n'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "'hostname'"); - strcpy(desc->params[i].short_desc, "Name of the jack client"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "transport-sync"); - desc->params[i].character = 't'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 1U; - strcpy(desc->params[i].short_desc, "Sync transport with master's"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "mode"); - desc->params[i].character = 'm'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "slow"); - strcpy(desc->params[i].short_desc, "Slow, Normal or Fast mode."); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "quality"); - desc->params[i].character = 'q'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "ring-buffer"); - desc->params[i].character = 'g'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 32768; - strcpy(desc->params[i].short_desc, "Fixed ringbuffer size"); - strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); - - i++; - strcpy (desc->params[i].name, "auto-connect"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy (desc->params[i].short_desc, "Auto connect netmaster to system ports"); - strcpy (desc->params[i].long_desc, desc->params[i].short_desc); - - desc->nparams = i + 1; + strcpy(value.str, "'hostname'"); + jack_driver_descriptor_add_parameter(desc, &filler, "client-name", 'n', JackDriverParamString, &value, NULL, "Name of the jack client", NULL); + + value.ui = 1U; + jack_driver_descriptor_add_parameter(desc, &filler, "transport-sync", 't', JackDriverParamUInt, &value, NULL, "Sync transport with master's", NULL); + + strcpy(value.str, "slow"); + jack_driver_descriptor_add_parameter(desc, &filler, "mode", 'm', JackDriverParamString, &value, NULL, "Slow, Normal or Fast mode.", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); + + value.i = 32768; + jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "auto-connect", 'c', JackDriverParamBool, &value, NULL, "Auto connect netmaster to system ports", ""); return desc; } diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index 33d8c42d..21a5bede 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -599,103 +599,41 @@ namespace Jack #endif SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() { - jack_driver_desc_t* desc = (jack_driver_desc_t*) calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "net"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "netjack slave backend component"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->params = (jack_driver_param_desc_t*) calloc(11, sizeof(jack_driver_param_desc_t)); - - int i = 0; - strcpy(desc->params[i].name, "multicast_ip"); - desc->params[i].character = 'a'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, DEFAULT_MULTICAST_IP); - strcpy(desc->params[i].short_desc, "Multicast Address"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "udp_net_port"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = DEFAULT_PORT; - strcpy(desc->params[i].short_desc, "UDP port"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "mtu"); - desc->params[i].character = 'M'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = DEFAULT_MTU; - strcpy(desc->params[i].short_desc, "MTU to the master"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "input_ports"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Number of audio input ports"); - strcpy(desc->params[i].long_desc, "Number of audio input ports. If -1, audio physical input from the master"); - - i++; - strcpy(desc->params[i].name, "output_ports"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Number of audio output ports"); - strcpy(desc->params[i].long_desc, "Number of audio output ports. If -1, audio physical output from the master"); - - i++; - strcpy(desc->params[i].name, "midi_in_ports"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = 0; - strcpy(desc->params[i].short_desc, "Number of midi input ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "midi_out_ports"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = 0; - strcpy(desc->params[i].short_desc, "Number of midi output ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("net", "netjack slave backend component", &filler); + + strcpy(value.str, DEFAULT_MULTICAST_IP); + jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); + + value.i = DEFAULT_PORT; + jack_driver_descriptor_add_parameter(desc, &filler, "udp_net_port", 'p', JackDriverParamInt, &value, NULL, "UDP port", NULL); + + value.i = DEFAULT_MTU; + jack_driver_descriptor_add_parameter(desc, &filler, "mtu", 'M', JackDriverParamInt, &value, NULL, "MTU to the master", NULL); + + value.i = -1; + jack_driver_descriptor_add_parameter(desc, &filler, "input_ports", 'C', JackDriverParamInt, &value, NULL, "Number of audio input ports", "Number of audio input ports. If -1, audio physical input from the master"); + jack_driver_descriptor_add_parameter(desc, &filler, "output_ports", 'P', JackDriverParamInt, &value, NULL, "Number of audio output ports", "Number of audio output ports. If -1, audio physical output from the master"); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "midi_in_ports", 'i', JackDriverParamInt, &value, NULL, "Number of midi input ports", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "midi_out_ports", 'o', JackDriverParamInt, &value, NULL, "Number of midi output ports", NULL); #if HAVE_CELT - i++; - strcpy(desc->params[i].name, "celt"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Set CELT encoding and number of kBits per channel"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + value.i = -1; + jack_driver_descriptor_add_parameter(desc, &filler, "celt", 'c', JackDriverParamInt, &value, NULL, "Set CELT encoding and number of kBits per channel", NULL); #endif - i++; - strcpy(desc->params[i].name, "client_name"); - desc->params[i].character = 'n'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "'hostname'"); - strcpy(desc->params[i].short_desc, "Name of the jack client"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "transport_sync"); - desc->params[i].character = 't'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 1U; - strcpy(desc->params[i].short_desc, "Sync transport with master's"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "mode"); - desc->params[i].character = 'm'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "slow"); - strcpy(desc->params[i].short_desc, "Slow, Normal or Fast mode."); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - desc->nparams = i + 1; + strcpy(value.str, "'hostname'"); + jack_driver_descriptor_add_parameter(desc, &filler, "client_name", 'n', JackDriverParamString, &value, NULL, "Name of the jack client", NULL); + + value.ui = 1U; + jack_driver_descriptor_add_parameter(desc, &filler, "transport_sync", 't', JackDriverParamUInt, &value, NULL, "Sync transport with master's", NULL); + + strcpy(value.str, "slow"); + jack_driver_descriptor_add_parameter(desc, &filler, "mode", 'm', JackDriverParamString, &value, NULL, "Slow, Normal or Fast mode.", NULL); return desc; } diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 9324ce26..5f5277a9 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -751,38 +751,20 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t *desc; - desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); - - strcpy ( desc->name, "netmanager" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy ( desc->desc, "netjack multi-cast master component" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 3; - desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); - - int i = 0; - strcpy ( desc->params[i].name, "multicast_ip" ); - desc->params[i].character = 'a'; - desc->params[i].type = JackDriverParamString; - strcpy ( desc->params[i].value.str, DEFAULT_MULTICAST_IP ); - strcpy ( desc->params[i].short_desc, "Multicast Address" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "udp_net_port" ); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = DEFAULT_PORT; - strcpy ( desc->params[i].short_desc, "UDP port" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "auto_connect" ); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy ( desc->params[i].short_desc, "Auto connect netmaster to system ports" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("netmanager", "netjack multi-cast master component", &filler); + + strcpy(value.str, DEFAULT_MULTICAST_IP ); + jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); + + value.i = DEFAULT_PORT; + jack_driver_descriptor_add_parameter(desc, &filler, "udp_net_port", 'p', JackDriverParamInt, &value, NULL, "UDP port", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "auto_connect", 'c', JackDriverParamBool, &value, NULL, "Auto connect netmaster to system ports", NULL); return desc; } diff --git a/common/JackNetOneDriver.cpp b/common/JackNetOneDriver.cpp index 832a373a..3a61ba55 100644 --- a/common/JackNetOneDriver.cpp +++ b/common/JackNetOneDriver.cpp @@ -778,174 +778,62 @@ extern "C" #endif SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor () { - jack_driver_desc_t* desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); - jack_driver_param_desc_t * params; - - strcpy ( desc->name, "netone" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy ( desc->desc, "netjack one slave backend component" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - params = ( jack_driver_param_desc_t* ) calloc ( 18, sizeof ( jack_driver_param_desc_t ) ); - - int i = 0; - strcpy (params[i].name, "audio-ins"); - params[i].character = 'i'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 2U; - strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "audio-outs"); - params[i].character = 'o'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 2U; - strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "midi-ins"); - params[i].character = 'I'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1U; - strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "midi-outs"); - params[i].character = 'O'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1U; - strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "rate"); - params[i].character = 'r'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 48000U; - strcpy (params[i].short_desc, "Sample rate"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "period"); - params[i].character = 'p'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1024U; - strcpy (params[i].short_desc, "Frames per period"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "num-periods"); - params[i].character = 'n'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 5U; - strcpy (params[i].short_desc, - "Network latency setting in no. of periods"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "listen-port"); - params[i].character = 'l'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 3000U; - strcpy (params[i].short_desc, - "The socket port we are listening on for sync packets"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "factor"); - params[i].character = 'f'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1U; - strcpy (params[i].short_desc, - "Factor for sample rate reduction"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "upstream-factor"); - params[i].character = 'u'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0U; - strcpy (params[i].short_desc, - "Factor for sample rate reduction on the upstream"); - strcpy (params[i].long_desc, params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("netone", "netjack one slave backend component", &filler); + + value.ui = 2U; + jack_driver_descriptor_add_parameter(desc, &filler, "audio-ins", 'i', JackDriverParamUInt, &value, NULL, "Number of capture channels (defaults to 2)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "audio-outs", 'o', JackDriverParamUInt, &value, NULL, "Number of playback channels (defaults to 2)", NULL); + + value.ui = 1U; + jack_driver_descriptor_add_parameter(desc, &filler, "midi-ins", 'I', JackDriverParamUInt, &value, NULL, "Number of midi capture channels (defaults to 1)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "midi-outs", 'O', JackDriverParamUInt, &value, NULL, "Number of midi playback channels (defaults to 1)", NULL); + + value.ui = 48000U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = 1024U; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = 5U; + jack_driver_descriptor_add_parameter(desc, &filler, "num-periods", 'n', JackDriverParamUInt, &value, NULL, "Network latency setting in no. of periods", NULL); + + value.ui = 3000U; + jack_driver_descriptor_add_parameter(desc, &filler, "listen-port", 'l', JackDriverParamUInt, &value, NULL, "The socket port we are listening on for sync packets", NULL); + + value.ui = 1U; + jack_driver_descriptor_add_parameter(desc, &filler, "factor", 'f', JackDriverParamUInt, &value, NULL, "Factor for sample rate reduction", NULL); + + value.ui = 0U; + jack_driver_descriptor_add_parameter(desc, &filler, "upstream-factor", 'u', JackDriverParamUInt, &value, NULL, "Factor for sample rate reduction on the upstream", NULL); #if HAVE_CELT - i++; - strcpy (params[i].name, "celt"); - params[i].character = 'c'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0U; - strcpy (params[i].short_desc, - "sets celt encoding and number of kbits per channel"); - strcpy (params[i].long_desc, params[i].short_desc); + value.ui = 0U; + jack_driver_descriptor_add_parameter(desc, &filler, "celt", 'c', JackDriverParamUInt, &value, NULL, "sets celt encoding and number of kbits per channel", NULL); #endif - i++; - strcpy (params[i].name, "bit-depth"); - params[i].character = 'b'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0U; - strcpy (params[i].short_desc, - "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "transport-sync"); - params[i].character = 't'; - params[i].type = JackDriverParamBool; - params[i].value.ui = 1U; - strcpy (params[i].short_desc, - "Whether to slave the transport to the master transport"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "autoconf"); - params[i].character = 'a'; - params[i].type = JackDriverParamBool; - params[i].value.ui = 1U; - strcpy (params[i].short_desc, - "Whether to use Autoconfig, or just start."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "redundancy"); - params[i].character = 'R'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1U; - strcpy (params[i].short_desc, - "Send packets N times"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "native-endian"); - params[i].character = 'e'; - params[i].type = JackDriverParamBool; - params[i].value.ui = 0U; - strcpy (params[i].short_desc, - "Dont convert samples to network byte order."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "jitterval"); - params[i].character = 'J'; - params[i].type = JackDriverParamInt; - params[i].value.i = 0; - strcpy (params[i].short_desc, - "attempted jitterbuffer microseconds on master"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "always-deadline"); - params[i].character = 'D'; - params[i].type = JackDriverParamBool; - params[i].value.ui = 0U; - strcpy (params[i].short_desc, - "always use deadline"); - strcpy (params[i].long_desc, params[i].short_desc); - - desc->nparams = i + 1; - - desc->params = params; + value.ui = 0U; + jack_driver_descriptor_add_parameter(desc, &filler, "bit-depth", 'b', JackDriverParamUInt, &value, NULL, "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)", NULL); + + value.i = true; + jack_driver_descriptor_add_parameter(desc, &filler, "transport-sync", 't', JackDriverParamBool, &value, NULL, "Whether to slave the transport to the master transport", NULL); + + value.ui = true; + jack_driver_descriptor_add_parameter(desc, &filler, "autoconf", 'a', JackDriverParamBool, &value, NULL, "Whether to use Autoconfig, or just start.", NULL); + + value.ui = 1U; + jack_driver_descriptor_add_parameter(desc, &filler, "redundancy", 'R', JackDriverParamUInt, &value, NULL, "Send packets N times", NULL); + + value.ui = false; + jack_driver_descriptor_add_parameter(desc, &filler, "native-endian", 'e', JackDriverParamBool, &value, NULL, "Dont convert samples to network byte order.", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "jitterval", 'J', JackDriverParamInt, &value, NULL, "attempted jitterbuffer microseconds on master", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "always-deadline", 'D', JackDriverParamBool, &value, NULL, "always use deadline", NULL); return desc; } diff --git a/common/JackProfiler.cpp b/common/JackProfiler.cpp index b74abc13..a64494de 100644 --- a/common/JackProfiler.cpp +++ b/common/JackProfiler.cpp @@ -206,37 +206,16 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t* desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "profiler"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "real-time server profiling"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 3; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - int i = 0; - strcpy(desc->params[i].name, "cpu-load"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Show DSP CPU load"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "driver-period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Show driver period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "driver-end-time"); - desc->params[i].character = 'e'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Show driver end time"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("profiler", "real-time server profiling", &filler); + + value.i = FALSE; + jack_driver_descriptor_add_parameter(desc, &filler, "cpu-load", 'c', JackDriverParamBool, &value, NULL, "Show DSP CPU load", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "driver-period", 'p', JackDriverParamBool, &value, NULL, "Show driver period", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "driver-end-time", 'e', JackDriverParamBool, &value, NULL, "Show driver end time", NULL); return desc; } diff --git a/common/driver_interface.h b/common/driver_interface.h index 6c97099c..42d9b51a 100644 --- a/common/driver_interface.h +++ b/common/driver_interface.h @@ -111,9 +111,32 @@ extern "C" } jack_driver_desc_t; + typedef struct { + uint32_t size; /* size of the param array, in elements */ + } + jack_driver_desc_filler_t; SERVER_EXPORT int jack_parse_driver_params (jack_driver_desc_t * desc, int argc, char* argv[], JSList ** param_ptr); +jack_driver_desc_t * /* newlly allocated driver descriptor, NULL on failure */ +jack_driver_descriptor_construct( + const char * name, /* driver name */ + const char * description, /* driver description */ + jack_driver_desc_filler_t * filler); /* Pointer to stack var to be supplied to jack_driver_descriptor_add_parameter() as well. + Can be NULL for drivers that have no parameters. */ + +int /* 0 on failure */ +jack_driver_descriptor_add_parameter( + jack_driver_desc_t * driver_descr, /* pointer to driver descriptor as returned by jack_driver_descriptor_construct() */ + jack_driver_desc_filler_t * filler, /* Pointer to the stack var that was supplied to jack_driver_descriptor_add_parameter(). */ + const char * name, /* parameter's name */ + char character, /* parameter's character (for getopt, etc) */ + jack_driver_param_type_t type, /* The parameter's type */ + const jack_driver_param_value_t * value_ptr, /* Pointer to parameter's (default) value */ + jack_driver_param_constraint_desc_t * constraint, /* Pointer to parameter constraint descriptor. NULL if there is no constraint */ + const char * short_desc, /* A short (~30 chars) description for the user */ + const char * long_desc); /* A longer description for the user, if NULL short_desc will be used */ + #ifdef __cplusplus } #endif diff --git a/linux/alsa/JackAlsaAdapter.cpp b/linux/alsa/JackAlsaAdapter.cpp index 070dacd4..b214dc9f 100644 --- a/linux/alsa/JackAlsaAdapter.cpp +++ b/linux/alsa/JackAlsaAdapter.cpp @@ -187,108 +187,40 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); - - strcpy ( desc->name, "audioadapter" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy ( desc->desc, "netjack audio <==> net backend adapter" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 11; - desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); - - i = 0; - strcpy ( desc->params[i].name, "capture" ); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy ( desc->params[i].value.str, "none" ); - strcpy ( desc->params[i].short_desc, - "Provide capture ports. Optionally set device" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "playback" ); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy ( desc->params[i].value.str, "none" ); - strcpy ( desc->params[i].short_desc, - "Provide playback ports. Optionally set device" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "device" ); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy ( desc->params[i].value.str, "hw:0" ); - strcpy ( desc->params[i].short_desc, "ALSA device name" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "rate" ); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 48000U; - strcpy ( desc->params[i].short_desc, "Sample rate" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "periodsize" ); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 512U; - strcpy ( desc->params[i].short_desc, "Period size" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "nperiods" ); - desc->params[i].character = 'n'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 2U; - strcpy ( desc->params[i].short_desc, "Number of periods of playback latency" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "duplex" ); - desc->params[i].character = 'D'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = true; - strcpy ( desc->params[i].short_desc, - "Provide both capture and playback ports" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "inchannels" ); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = 0; - strcpy ( desc->params[i].short_desc, - "Number of capture channels (defaults to hardware max)" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy ( desc->params[i].name, "outchannels" ); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = 0; - strcpy ( desc->params[i].short_desc, - "Number of playback channels (defaults to hardware max)" ); - strcpy ( desc->params[i].long_desc, desc->params[i].short_desc ); - - i++; - strcpy(desc->params[i].name, "quality"); - desc->params[i].character = 'q'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "ring-buffer"); - desc->params[i].character = 'g'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 32768; - strcpy(desc->params[i].short_desc, "Fixed ringbuffer size"); - strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); + + 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, NULL, "ALSA device name", NULL); + + value.ui = 48000U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = 512U; + jack_driver_descriptor_add_parameter(desc, &filler, "periodsize", 'p', JackDriverParamUInt, &value, NULL, "Period size", NULL); + + value.ui = 2U; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods of playback latency", NULL); + + value.i = true; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Number of capture channels (defaults to hardware max)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamInt, &value, NULL, "Number of playback channels (defaults to hardware max)", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamUInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); + + value.ui = 32768; + jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamUInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); return desc; } diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index 470d46df..87338000 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -725,179 +725,84 @@ dither_opt (char c, DitherAlgorithm* dither) SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () { jack_driver_desc_t * desc; - jack_driver_param_desc_t * params; - unsigned int i; - - desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); - - strcpy(desc->name, "alsa"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Linux ALSA API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 18; - params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - - i = 0; - strcpy (params[i].name, "capture"); - params[i].character = 'C'; - params[i].type = JackDriverParamString; - strcpy (params[i].value.str, "none"); - strcpy (params[i].short_desc, - "Provide capture ports. Optionally set device"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "playback"); - params[i].character = 'P'; - params[i].type = JackDriverParamString; - strcpy (params[i].value.str, "none"); - strcpy (params[i].short_desc, - "Provide playback ports. Optionally set device"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "device"); - params[i].character = 'd'; - params[i].type = JackDriverParamString; - strcpy (params[i].value.str, "hw:0"); - strcpy (params[i].short_desc, "ALSA device name"); - strcpy (params[i].long_desc, params[i].short_desc); - params[i].constraint = enum_alsa_devices(); - - i++; - strcpy (params[i].name, "rate"); - params[i].character = 'r'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 48000U; - strcpy (params[i].short_desc, "Sample rate"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "period"); - params[i].character = 'p'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1024U; - strcpy (params[i].short_desc, "Frames per period"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "nperiods"); - params[i].character = 'n'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 2U; - strcpy (params[i].short_desc, "Number of periods of playback latency"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "hwmon"); - params[i].character = 'H'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Hardware monitoring, if available"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "hwmeter"); - params[i].character = 'M'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Hardware metering, if available"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "duplex"); - params[i].character = 'D'; - params[i].type = JackDriverParamBool; - params[i].value.i = 1; - strcpy (params[i].short_desc, - "Provide both capture and playback ports"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "softmode"); - params[i].character = 's'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Soft-mode, no xrun handling"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "monitor"); - params[i].character = 'm'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Provide monitor ports for the output"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "dither"); - params[i].character = 'z'; - params[i].type = JackDriverParamChar; - params[i].value.c = 'n'; - strcpy (params[i].short_desc, "Dithering mode"); - strcpy (params[i].long_desc, - "Dithering mode:\n" - " n - none\n" - " r - rectangular\n" - " s - shaped\n" - " t - triangular"); - params[i].constraint = get_dither_constraint(); - - i++; - strcpy (params[i].name, "inchannels"); - params[i].character = 'i'; - params[i].type = JackDriverParamInt; - params[i].value.i = 0; - strcpy (params[i].short_desc, - "Number of capture channels (defaults to hardware max)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "outchannels"); - params[i].character = 'o'; - params[i].type = JackDriverParamInt; - params[i].value.i = 0; - strcpy (params[i].short_desc, - "Number of playback channels (defaults to hardware max)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "shorts"); - params[i].character = 'S'; - params[i].type = JackDriverParamBool; - params[i].value.i = FALSE; - strcpy (params[i].short_desc, "Try 16-bit samples before 32-bit"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "input-latency"); - params[i].character = 'I'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Extra input latency (frames)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "output-latency"); - params[i].character = 'O'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Extra output latency (frames)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "midi-driver"); - params[i].character = 'X'; - params[i].type = JackDriverParamString; - strcpy (params[i].value.str, "none"); - strcpy (params[i].short_desc, "ALSA MIDI driver name (seq|raw)"); - strcpy (params[i].long_desc, - "ALSA MIDI driver:\n" - " none - no MIDI driver\n" - " seq - ALSA Sequencer driver\n" - " raw - ALSA RawMIDI driver\n"); - params[i].constraint = get_midi_driver_constraint(); - - desc->params = params; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("alsa", "Linux ALSA API based audio backend", &filler); + + 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); + + value.ui = 1024U; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = 2U; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods of playback latency", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "hwmon", 'H', JackDriverParamBool, &value, NULL, "Hardware monitoring, if available", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "hwmeter", 'M', JackDriverParamBool, &value, NULL, "Hardware metering, if available", NULL); + + value.i = 1; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "softmode", 's', JackDriverParamBool, &value, NULL, "Soft-mode, no xrun handling", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL); + + value.c = 'n'; + jack_driver_descriptor_add_parameter( + desc, + &filler, + "dither", + 'z', + JackDriverParamChar, + &value, + get_dither_constraint(), + "Dithering mode", + "Dithering mode:\n" + " n - none\n" + " r - rectangular\n" + " s - shaped\n" + " t - triangular"); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Number of capture channels (defaults to hardware max)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamInt, &value, NULL, "Number of playback channels (defaults to hardware max)", NULL); + + value.i = FALSE; + jack_driver_descriptor_add_parameter(desc, &filler, "shorts", 'S', JackDriverParamBool, &value, NULL, "Try 16-bit samples before 32-bit", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency (frames)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency (frames)", NULL); + + strcpy(value.str, "none"); + jack_driver_descriptor_add_parameter( + desc, + &filler, + "midi-driver", + 'X', + JackDriverParamString, + &value, + get_midi_driver_constraint(), + "ALSA device name", + "ALSA MIDI driver:\n" + " none - no MIDI driver\n" + " seq - ALSA Sequencer driver\n" + " raw - ALSA RawMIDI driver\n"); + return desc; } diff --git a/linux/alsarawmidi/JackALSARawMidiDriver.cpp b/linux/alsarawmidi/JackALSARawMidiDriver.cpp index d077c160..6eabd866 100644 --- a/linux/alsarawmidi/JackALSARawMidiDriver.cpp +++ b/linux/alsarawmidi/JackALSARawMidiDriver.cpp @@ -630,19 +630,11 @@ extern "C" { SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { - jack_driver_desc_t *desc = - (jack_driver_desc_t *) malloc(sizeof(jack_driver_desc_t)); - if (desc) { - strcpy(desc->desc, "Alternative ALSA raw MIDI backend."); - strcpy(desc->name, "alsarawmidi"); - - // X: There could be parameters here regarding setting I/O buffer - // sizes. I don't think MIDI drivers can accept parameters right - // now without being set as the main driver. - desc->nparams = 0; - desc->params = 0; - } - return desc; + // X: There could be parameters here regarding setting I/O buffer + // sizes. I don't think MIDI drivers can accept parameters right + // now without being set as the main driver. + + return jack_driver_descriptor_construct("alsarawmidi", "Alternative ALSA raw MIDI backend.", NULL); } SERVER_EXPORT Jack::JackDriverClientInterface * diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp index 62f10ad1..96e0c37c 100644 --- a/linux/firewire/JackFFADODriver.cpp +++ b/linux/firewire/JackFFADODriver.cpp @@ -751,122 +751,52 @@ extern "C" SERVER_EXPORT const jack_driver_desc_t * driver_get_descriptor () { jack_driver_desc_t * desc; - jack_driver_param_desc_t * params; - unsigned int i; - - desc = (jack_driver_desc_t *)calloc (1, sizeof (jack_driver_desc_t)); - - strcpy (desc->name, "firewire"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Linux FFADO API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 13; - - params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - desc->params = params; - - i = 0; - strcpy (params[i].name, "device"); - params[i].character = 'd'; - params[i].type = JackDriverParamString; - strcpy (params[i].value.str, "hw:0"); - strcpy (params[i].short_desc, "The FireWire device to use."); - strcpy (params[i].long_desc, "The FireWire device to use. Please consult the FFADO documentation for more info."); - - i++; - strcpy (params[i].name, "period"); - params[i].character = 'p'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1024; - strcpy (params[i].short_desc, "Frames per period"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "nperiods"); - params[i].character = 'n'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 3; - strcpy (params[i].short_desc, "Number of periods of playback latency"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "rate"); - params[i].character = 'r'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 48000U; - strcpy (params[i].short_desc, "Sample rate"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "capture"); - params[i].character = 'C'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Provide capture ports."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "playback"); - params[i].character = 'P'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Provide playback ports."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "duplex"); - params[i].character = 'D'; - params[i].type = JackDriverParamBool; - params[i].value.i = 1; - strcpy (params[i].short_desc, "Provide both capture and playback ports."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "input-latency"); - params[i].character = 'I'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Extra input latency (frames)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "output-latency"); - params[i].character = 'O'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Extra output latency (frames)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "inchannels"); - params[i].character = 'i'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Number of input channels to provide (note: currently ignored)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "outchannels"); - params[i].character = 'o'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Number of output channels to provide (note: currently ignored)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "verbose"); - params[i].character = 'v'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 3; - strcpy (params[i].short_desc, "libffado verbose level"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "snoop"); - params[i].character = 'X'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Snoop firewire traffic"); - strcpy (params[i].long_desc, params[i].short_desc); + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("firewire", "Linux FFADO API based audio backend", &filler); + + strcpy(value.str, "hw:0"); + jack_driver_descriptor_add_parameter( + desc, + &filler, + "device", + 'd', + JackDriverParamString, + &value, + NULL, + "The FireWire device to use.", + "The FireWire device to use. Please consult the FFADO documentation for more info."); + + value.ui = 1024; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = 3; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods of playback latency", NULL); + + value.ui = 48000U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamBool, &value, NULL, "Provide capture ports.", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamBool, &value, NULL, "Provide playback ports.", NULL); + + value.i = 1; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports.", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency (frames)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency (frames)", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Number of input channels to provide (note: currently ignored)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Number of output channels to provide (note: currently ignored)", NULL); + + value.ui = 3; + jack_driver_descriptor_add_parameter(desc, &filler, "verbose", 'v', JackDriverParamUInt, &value, NULL, "libffado verbose level", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "snoop", 'X', JackDriverParamBool, &value, NULL, "Snoop firewire traffic", NULL); return desc; } diff --git a/linux/freebob/JackFreebobDriver.cpp b/linux/freebob/JackFreebobDriver.cpp index 03a26893..bf6f3fd8 100644 --- a/linux/freebob/JackFreebobDriver.cpp +++ b/linux/freebob/JackFreebobDriver.cpp @@ -952,106 +952,37 @@ extern "C" const jack_driver_desc_t * driver_get_descriptor () { jack_driver_desc_t * desc; - jack_driver_param_desc_t * params; - unsigned int i; - - desc = (jack_driver_desc_t *)calloc (1, sizeof (jack_driver_desc_t)); - - strcpy (desc->name, "freebob"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Linux FreeBob API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 11; - - params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - desc->params = params; - - i = 0; - strcpy (params[i].name, "device"); - params[i].character = 'd'; - params[i].type = JackDriverParamString; - strcpy (params[i].value.str, "hw:0"); - strcpy (params[i].short_desc, "The FireWire device to use. Format is: 'hw:port[,node]'."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "period"); - params[i].character = 'p'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 1024; - strcpy (params[i].short_desc, "Frames per period"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "nperiods"); - params[i].character = 'n'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 3; - strcpy (params[i].short_desc, "Number of periods of playback latency"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "rate"); - params[i].character = 'r'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 48000U; - strcpy (params[i].short_desc, "Sample rate"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "capture"); - params[i].character = 'C'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Provide capture ports."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "playback"); - params[i].character = 'P'; - params[i].type = JackDriverParamBool; - params[i].value.i = 0; - strcpy (params[i].short_desc, "Provide playback ports."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "duplex"); - params[i].character = 'D'; - params[i].type = JackDriverParamBool; - params[i].value.i = 1; - strcpy (params[i].short_desc, "Provide both capture and playback ports."); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "input-latency"); - params[i].character = 'I'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Extra input latency (frames)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "output-latency"); - params[i].character = 'O'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Extra output latency (frames)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "inchannels"); - params[i].character = 'i'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Number of input channels to provide (note: currently ignored)"); - strcpy (params[i].long_desc, params[i].short_desc); - - i++; - strcpy (params[i].name, "outchannels"); - params[i].character = 'o'; - params[i].type = JackDriverParamUInt; - params[i].value.ui = 0; - strcpy (params[i].short_desc, "Number of output channels to provide (note: currently ignored)"); - strcpy (params[i].long_desc, params[i].short_desc); + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("freebob", "Linux FreeBob API based audio backend", &filler); + + strcpy(value.str, "hw:0"); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "The FireWire device to use. Format is: 'hw:port[,node]'.", NULL); + + value.ui = 1024; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = 3; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods of playback latency", NULL); + + value.ui = 48000U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamBool, &value, NULL, "Provide capture ports.", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamBool, &value, NULL, "Provide playback ports.", NULL); + + value.i = 1; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports.", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency (frames)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency (frames)", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Number of input channels to provide (note: currently ignored)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Number of output channels to provide (note: currently ignored)", NULL); return desc; } diff --git a/macosx/coreaudio/JackCoreAudioAdapter.cpp b/macosx/coreaudio/JackCoreAudioAdapter.cpp index f77a5e3a..fef7d4d8 100644 --- a/macosx/coreaudio/JackCoreAudioAdapter.cpp +++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp @@ -1497,116 +1497,44 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 13; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "channels"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Maximum number of channels"); - strcpy(desc->params[i].long_desc, "Maximum number of channels. If -1, max possible number of channels will be used"); - - i++; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Maximum number of input channels"); - strcpy(desc->params[i].long_desc, "Maximum number of input channels. If -1, max possible number of input channels will be used"); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Maximum number of output channels"); - strcpy(desc->params[i].long_desc, "Maximum number of output channels. If -1, max possible number of output channels will be used"); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].short_desc, "Input CoreAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].short_desc, "Output CoreAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 44100U; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 512U; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "duplex"); - desc->params[i].character = 'D'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = TRUE; - strcpy(desc->params[i].short_desc, "Provide both capture and playback ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].short_desc, "CoreAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "list-devices"); - desc->params[i].character = 'l'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = TRUE; - strcpy(desc->params[i].short_desc, "Display available CoreAudio devices"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "quality"); - desc->params[i].character = 'q'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "ring-buffer"); - desc->params[i].character = 'g'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 32768; - strcpy(desc->params[i].short_desc, "Fixed ringbuffer size"); - strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); - - i++; - strcpy(desc->params[i].name, "clock-drift"); - desc->params[i].character = 's'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Clock drift compensation"); - strcpy(desc->params[i].long_desc, "Whether to compensate clock drift in dynamically created aggregate device"); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); + + value.i = -1; + jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of channels", "Maximum number of channels. If -1, max possible number of channels will be used"); + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", "Maximum number of input channels. If -1, max possible number of input channels will be used"); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamInt, &value, NULL, "Maximum number of output channels", "Maximum number of output channels. If -1, max possible number of output channels will be used"); + + value.str[0] = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input CoreAudio device name", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output CoreAudio device name", NULL); + + value.ui = 44100U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = 512U; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.i = TRUE; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports", NULL); + + value.str[0] = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "CoreAudio device name", NULL); + + value.i = TRUE; + jack_driver_descriptor_add_parameter(desc, &filler, "list-devices", 'l', JackDriverParamBool, &value, NULL, "Display available CoreAudio devices", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); + + value.ui = 32768; + jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); + + value.i = FALSE; + jack_driver_descriptor_add_parameter(desc, &filler, "clock-drift", 's', JackDriverParamBool, &value, NULL, "Clock drift compensation", "Whether to compensate clock drift in dynamically created aggregate device"); return desc; } diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp index 1c26ce65..49a9f5d6 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.cpp +++ b/macosx/coreaudio/JackCoreAudioDriver.cpp @@ -1833,148 +1833,54 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "coreaudio"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Apple CoreAudio API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 17; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "channels"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Maximum number of channels"); - strcpy(desc->params[i].long_desc, "Maximum number of channels. If -1, max possible number of channels will be used"); - - i++; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Maximum number of input channels"); - strcpy(desc->params[i].long_desc, "Maximum number of input channels. If -1, max possible number of input channels will be used"); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = -1; - strcpy(desc->params[i].short_desc, "Maximum number of output channels"); - strcpy(desc->params[i].long_desc, "Maximum number of output channels. If -1, max possible number of output channels will be used"); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].short_desc, "Input CoreAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].short_desc, "Output CoreAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy (desc->params[i].name, "monitor"); - desc->params[i].character = 'm'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = 0; - strcpy(desc->params[i].short_desc, "Provide monitor ports for the output"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "duplex"); - desc->params[i].character = 'D'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = TRUE; - strcpy(desc->params[i].short_desc, "Provide both capture and playback ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 44100U; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 128U; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].short_desc, "CoreAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "input-latency"); - desc->params[i].character = 'I'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra input latency (frames)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "output-latency"); - desc->params[i].character = 'O'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra output latency (frames)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "list-devices"); - desc->params[i].character = 'l'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Display available CoreAudio devices"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "hog"); - desc->params[i].character = 'H'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Take exclusive access of the audio device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "async-latency"); - desc->params[i].character = 'L'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 100; - strcpy(desc->params[i].short_desc, "Extra output latency in asynchronous mode (percent)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "grain"); - desc->params[i].character = 'G'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 100; - strcpy(desc->params[i].short_desc, "Computation grain in RT thread (percent)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "clock-drift"); - desc->params[i].character = 's'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = FALSE; - strcpy(desc->params[i].short_desc, "Clock drift compensation"); - strcpy(desc->params[i].long_desc, "Whether to compensate clock drift in dynamically created aggregate device"); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("coreaudio", "Apple CoreAudio API based audio backend", &filler); + + value.i = -1; + jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of channels", "Maximum number of channels. If -1, max possible number of channels will be used"); + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", "Maximum number of input channels. If -1, max possible number of input channels will be used"); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamInt, &value, NULL, "Maximum number of output channels", "Maximum number of output channels. If -1, max possible number of output channels will be used"); + + value.str[0] = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input CoreAudio device name", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output CoreAudio device name", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL); + + value.i = TRUE; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports", NULL); + + value.ui = 44100U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = 128U; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.str[0] = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "CoreAudio device name", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency (frames)", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency (frames)", NULL); + + value.i = FALSE; + jack_driver_descriptor_add_parameter(desc, &filler, "list-devices", 'l', JackDriverParamBool, &value, NULL, "Display available CoreAudio devices", NULL); + + value.i = FALSE; + jack_driver_descriptor_add_parameter(desc, &filler, "hog", 'H', JackDriverParamBool, &value, NULL, "Take exclusive access of the audio device", NULL); + + value.ui = 100; + jack_driver_descriptor_add_parameter(desc, &filler, "async-latency", 'L', JackDriverParamUInt, &value, NULL, "Extra output latency in asynchronous mode (percent)", NULL); + + value.ui = 100; + jack_driver_descriptor_add_parameter(desc, &filler, "grain", 'G', JackDriverParamUInt, &value, NULL, "Computation grain in RT thread (percent)", NULL); + + value.i = FALSE; + jack_driver_descriptor_add_parameter(desc, &filler, "clock-drift", 's', JackDriverParamBool, &value, NULL, "Clock drift compensation", "Whether to compensate clock drift in dynamically created aggregate device"); return desc; } diff --git a/macosx/coremidi/JackCoreMidiDriver.cpp b/macosx/coremidi/JackCoreMidiDriver.cpp index 292e771f..092aaa61 100644 --- a/macosx/coremidi/JackCoreMidiDriver.cpp +++ b/macosx/coremidi/JackCoreMidiDriver.cpp @@ -637,30 +637,14 @@ extern "C" { SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { jack_driver_desc_t * desc; - unsigned int i; - - desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); - strcpy(desc->name, "coremidi"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Apple CoreMIDI API based MIDI backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 2; - desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "CoreMIDI virtual bus"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "CoreMIDI virtual bus"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("coremidi", "Apple CoreMIDI API based MIDI backend", &filler); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); return desc; } diff --git a/solaris/oss/JackBoomerDriver.cpp b/solaris/oss/JackBoomerDriver.cpp index 63446f14..1442a278 100644 --- a/solaris/oss/JackBoomerDriver.cpp +++ b/solaris/oss/JackBoomerDriver.cpp @@ -817,119 +817,44 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "boomer"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "Boomer/OSS API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = OSS_DRIVER_N_PARAMS; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_FS; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_BLKSIZE; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "nperiods"); - desc->params[i].character = 'n'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_NPERIODS; - strcpy(desc->params[i].short_desc, "Number of periods to prefill output buffer"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "wordlength"); - desc->params[i].character = 'w'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = OSS_DRIVER_DEF_BITS; - strcpy(desc->params[i].short_desc, "Word length"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_INS; - strcpy(desc->params[i].short_desc, "Capture channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_OUTS; - strcpy(desc->params[i].short_desc, "Playback channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "excl"); - desc->params[i].character = 'e'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy(desc->params[i].short_desc, "Exclusif (O_EXCL) access mode"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "Input device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "Output device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy (desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "OSS device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "input-latency"); - desc->params[i].character = 'I'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra input latency"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "output-latency"); - desc->params[i].character = 'O'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra output latency"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "sync-io"); - desc->params[i].character = 'S'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy(desc->params[i].short_desc, "In duplex mode, synchronize input and output"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("boomer", "Boomer/OSS API based audio backend", &filler); + + value.ui = OSS_DRIVER_DEF_FS; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = OSS_DRIVER_DEF_BLKSIZE; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = OSS_DRIVER_DEF_NPERIODS; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods to prefill output buffer", NULL); + + value.i = OSS_DRIVER_DEF_BITS; + jack_driver_descriptor_add_parameter(desc, &filler, "wordlength", 'w', JackDriverParamInt, &value, NULL, "Word length", NULL); + + value.ui = OSS_DRIVER_DEF_INS; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Capture channels", NULL); + + value.ui = OSS_DRIVER_DEF_OUTS; + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Playback channels", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "excl", 'e', JackDriverParamBool, &value, NULL, "Exclusif (O_EXCL) access mode", NULL); + + strcpy(value.str, OSS_DRIVER_DEF_DEV); + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input device", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output device", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "OSS device name", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "sync-io", 'S', JackDriverParamBool, &value, NULL, "In duplex mode, synchronize input and output", NULL); return desc; } diff --git a/solaris/oss/JackBoomerDriver.h b/solaris/oss/JackBoomerDriver.h index c98e28a3..79103b30 100644 --- a/solaris/oss/JackBoomerDriver.h +++ b/solaris/oss/JackBoomerDriver.h @@ -30,7 +30,6 @@ namespace Jack typedef jack_default_audio_sample_t jack_sample_t; -#define OSS_DRIVER_N_PARAMS 13 #define OSS_DRIVER_DEF_DEV "/dev/dsp" #define OSS_DRIVER_DEF_FS 48000 #define OSS_DRIVER_DEF_BLKSIZE 1024 diff --git a/solaris/oss/JackOSSAdapter.cpp b/solaris/oss/JackOSSAdapter.cpp index de3fe89f..9647bc4c 100644 --- a/solaris/oss/JackOSSAdapter.cpp +++ b/solaris/oss/JackOSSAdapter.cpp @@ -633,119 +633,46 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = OSS_DRIVER_N_PARAMS; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_FS; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_BLKSIZE; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "nperiods"); - desc->params[i].character = 'n'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_NPERIODS; - strcpy(desc->params[i].short_desc, "Number of periods to prefill output buffer"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "wordlength"); - desc->params[i].character = 'w'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = OSS_DRIVER_DEF_BITS; - strcpy(desc->params[i].short_desc, "Word length"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_INS; - strcpy(desc->params[i].short_desc, "Capture channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_OUTS; - strcpy(desc->params[i].short_desc, "Playback channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "excl"); - desc->params[i].character = 'e'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy(desc->params[i].short_desc, "Exclusif (O_EXCL) access mode"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "Input device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); + + value.ui = OSS_DRIVER_DEF_FS; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = OSS_DRIVER_DEF_BLKSIZE; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = OSS_DRIVER_DEF_NPERIODS; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods to prefill output buffer", NULL); + + value.i = OSS_DRIVER_DEF_BITS; + jack_driver_descriptor_add_parameter(desc, &filler, "wordlength", 'w', JackDriverParamInt, &value, NULL, "Word length", NULL); + + value.ui = OSS_DRIVER_DEF_INS; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Capture channels", NULL); - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "Output device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy (desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "OSS device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + value.ui = OSS_DRIVER_DEF_OUTS; + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Playback channels", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "excl", 'e', JackDriverParamBool, &value, NULL, "Exclusif (O_EXCL) access mode", NULL); + + strcpy(value.str, OSS_DRIVER_DEF_DEV); + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input device", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output device", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "OSS device name", NULL); - i++; - strcpy(desc->params[i].name, "ignorehwbuf"); - desc->params[i].character = 'b'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = true; - strcpy(desc->params[i].short_desc, "Ignore hardware period size"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + value.i = true; + jack_driver_descriptor_add_parameter(desc, &filler, "ignorehwbuf", 'b', JackDriverParamBool, &value, NULL, "Ignore hardware period size", NULL); - i++; - strcpy(desc->params[i].name, "quality"); - desc->params[i].character = 'q'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); - i++; - strcpy(desc->params[i].name, "ring-buffer"); - desc->params[i].character = 'g'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 32768; - strcpy(desc->params[i].short_desc, "Fixed ringbuffer size"); - strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); + value.i = 32768; + jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); return desc; } diff --git a/solaris/oss/JackOSSAdapter.h b/solaris/oss/JackOSSAdapter.h index 6e739f88..2cc6ae6b 100644 --- a/solaris/oss/JackOSSAdapter.h +++ b/solaris/oss/JackOSSAdapter.h @@ -34,7 +34,6 @@ namespace Jack typedef jack_default_audio_sample_t jack_sample_t; -#define OSS_DRIVER_N_PARAMS 13 #define OSS_DRIVER_DEF_DEV "/dev/dsp" #define OSS_DRIVER_DEF_FS 48000 #define OSS_DRIVER_DEF_BLKSIZE 1024 diff --git a/solaris/oss/JackOSSDriver.cpp b/solaris/oss/JackOSSDriver.cpp index 444fce44..fa5d8967 100644 --- a/solaris/oss/JackOSSDriver.cpp +++ b/solaris/oss/JackOSSDriver.cpp @@ -734,119 +734,44 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "oss"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "OSS API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = OSS_DRIVER_N_PARAMS; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_FS; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_BLKSIZE; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "nperiods"); - desc->params[i].character = 'n'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_NPERIODS; - strcpy(desc->params[i].short_desc, "Number of periods to prefill output buffer"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "wordlength"); - desc->params[i].character = 'w'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.i = OSS_DRIVER_DEF_BITS; - strcpy(desc->params[i].short_desc, "Word length"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_INS; - strcpy(desc->params[i].short_desc, "Capture channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = OSS_DRIVER_DEF_OUTS; - strcpy(desc->params[i].short_desc, "Playback channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "excl"); - desc->params[i].character = 'e'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy(desc->params[i].short_desc, "Exclusif (O_EXCL) access mode"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "Input device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "Output device"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy (desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, OSS_DRIVER_DEF_DEV); - strcpy(desc->params[i].short_desc, "OSS device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "ignorehwbuf"); - desc->params[i].character = 'b'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = false; - strcpy(desc->params[i].short_desc, "Ignore hardware period size"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "input-latency"); - desc->params[i].character = 'I'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra input latency"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "output-latency"); - desc->params[i].character = 'O'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra output latency"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("oss", "OSS API based audio backend", &filler); + + value.ui = OSS_DRIVER_DEF_FS; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = OSS_DRIVER_DEF_BLKSIZE; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + value.ui = OSS_DRIVER_DEF_NPERIODS; + jack_driver_descriptor_add_parameter(desc, &filler, "nperiods", 'n', JackDriverParamUInt, &value, NULL, "Number of periods to prefill output buffer", NULL); + + value.i = OSS_DRIVER_DEF_BITS; + jack_driver_descriptor_add_parameter(desc, &filler, "wordlength", 'w', JackDriverParamInt, &value, NULL, "Word length", NULL); + + value.ui = OSS_DRIVER_DEF_INS; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Capture channels", NULL); + + value.ui = OSS_DRIVER_DEF_OUTS; + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Playback channels", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "excl", 'e', JackDriverParamBool, &value, NULL, "Exclusif (O_EXCL) access mode", NULL); + + strcpy(value.str, OSS_DRIVER_DEF_DEV); + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input device", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output device", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "OSS device name", NULL); + + value.i = false; + jack_driver_descriptor_add_parameter(desc, &filler, "ignorehwbuf", 'b', JackDriverParamBool, &value, NULL, "Ignore hardware period size", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency", NULL); return desc; } diff --git a/solaris/oss/JackOSSDriver.h b/solaris/oss/JackOSSDriver.h index bedd72b7..c286528a 100644 --- a/solaris/oss/JackOSSDriver.h +++ b/solaris/oss/JackOSSDriver.h @@ -28,7 +28,6 @@ namespace Jack typedef jack_default_audio_sample_t jack_sample_t; -#define OSS_DRIVER_N_PARAMS 13 #define OSS_DRIVER_DEF_DEV "/dev/dsp" #define OSS_DRIVER_DEF_FS 48000 #define OSS_DRIVER_DEF_BLKSIZE 1024 diff --git a/windows/portaudio/JackPortAudioAdapter.cpp b/windows/portaudio/JackPortAudioAdapter.cpp index 095202f9..e309b9da 100644 --- a/windows/portaudio/JackPortAudioAdapter.cpp +++ b/windows/portaudio/JackPortAudioAdapter.cpp @@ -214,96 +214,39 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 10; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Maximum number of input channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Maximum number of output channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "default input device"); - strcpy(desc->params[i].short_desc, "Provide capture ports. Optionally set PortAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "default output device"); - strcpy(desc->params[i].short_desc, "Provide playback ports. Optionally set PortAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 44100U; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "periodsize"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 512U; - strcpy(desc->params[i].short_desc, "Period size"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - desc->params[i].value.ui = 128U; - strcpy(desc->params[i].value.str, "default device"); - strcpy(desc->params[i].short_desc, "PortAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "list-devices"); - desc->params[i].character = 'l'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = true; - strcpy(desc->params[i].short_desc, "Display available PortAudio devices"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "quality"); - desc->params[i].character = 'q'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "ring-buffer"); - desc->params[i].character = 'g'; - desc->params[i].type = JackDriverParamInt; - desc->params[i].value.ui = 32768; - strcpy(desc->params[i].short_desc, "Fixed ringbuffer size"); - strcpy(desc->params[i].long_desc, "Fixed ringbuffer size (if not set => automatic adaptative)"); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamInt, &value, NULL, "Maximum number of output channels", NULL); + + strcpy(value.str, "default input device"); + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set PortAudio device name", NULL); + + strcpy(value.str, "default output device"); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Provide playback ports. Optionally set PortAudio device name", NULL); + + value.ui = 44100U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = 512U; + jack_driver_descriptor_add_parameter(desc, &filler, "periodsize", 'p', JackDriverParamUInt, &value, NULL, "Period size", NULL); + + strcpy(value.str, "default device"); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "PortAudio device name", NULL); + + value.i = true; + jack_driver_descriptor_add_parameter(desc, &filler, "list-devices", 'l', JackDriverParamBool, &value, NULL, "Display available PortAudio devices", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); + + value.ui = 32768; + jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); return desc; } diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index 5582b374..ca7e200b 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -260,119 +260,44 @@ extern "C" SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() { - jack_driver_desc_t *desc; - unsigned int i; - desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); - - strcpy(desc->name, "portaudio"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "PortAudio API based audio backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 13; - desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); - - i = 0; - strcpy(desc->params[i].name, "channels"); - desc->params[i].character = 'c'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Maximum number of channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "inchannels"); - desc->params[i].character = 'i'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Maximum number of input channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "outchannels"); - desc->params[i].character = 'o'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Maximum number of output channels"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "capture"); - desc->params[i].character = 'C'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "will take default PortAudio input device"); - strcpy(desc->params[i].short_desc, "Provide capture ports. Optionally set PortAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "playback"); - desc->params[i].character = 'P'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "will take default PortAudio output device"); - strcpy(desc->params[i].short_desc, "Provide playback ports. Optionally set PortAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy (desc->params[i].name, "monitor"); - desc->params[i].character = 'm'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = 0; - strcpy(desc->params[i].short_desc, "Provide monitor ports for the output"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "duplex"); - desc->params[i].character = 'D'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = TRUE; - strcpy(desc->params[i].short_desc, "Provide both capture and playback ports"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "rate"); - desc->params[i].character = 'r'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 44100U; - strcpy(desc->params[i].short_desc, "Sample rate"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "period"); - desc->params[i].character = 'p'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 128U; - strcpy(desc->params[i].short_desc, "Frames per period"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "device"); - desc->params[i].character = 'd'; - desc->params[i].type = JackDriverParamString; - strcpy(desc->params[i].value.str, "will take default PortAudio device name"); - strcpy(desc->params[i].short_desc, "PortAudio device name"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "input-latency"); - desc->params[i].character = 'I'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra input latency"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "output-latency"); - desc->params[i].character = 'O'; - desc->params[i].type = JackDriverParamUInt; - desc->params[i].value.ui = 0; - strcpy(desc->params[i].short_desc, "Extra output latency"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); - - i++; - strcpy(desc->params[i].name, "list-devices"); - desc->params[i].character = 'l'; - desc->params[i].type = JackDriverParamBool; - desc->params[i].value.i = TRUE; - strcpy(desc->params[i].short_desc, "Display available PortAudio devices"); - strcpy(desc->params[i].long_desc, desc->params[i].short_desc); + jack_driver_desc_t * desc; + jack_driver_desc_filler_t filler; + jack_driver_param_value_t value; + + desc = jack_driver_descriptor_construct("portaudio", "PortAudio API based audio backend", &filler); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamUInt, &value, NULL, "Maximum number of channels", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Maximum number of input channels", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Maximum number of output channels", NULL); + + strcpy(value.str, "will take default PortAudio input device"); + jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set PortAudio device name", NULL); + + strcpy(value.str, "will take default PortAudio output device"); + jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Provide playback ports. Optionally set PortAudio device name", NULL); + + value.i = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "monitor", 'm', JackDriverParamBool, &value, NULL, "Provide monitor ports for the output", NULL); + + value.i = TRUE; + jack_driver_descriptor_add_parameter(desc, &filler, "duplex", 'D', JackDriverParamBool, &value, NULL, "Provide both capture and playback ports", NULL); + + value.ui = 44100U; + jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); + + value.ui = 128U; + jack_driver_descriptor_add_parameter(desc, &filler, "period", 'p', JackDriverParamUInt, &value, NULL, "Frames per period", NULL); + + strcpy(value.str, "will take default PortAudio device name"); + jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "PortAudio device name", NULL); + + value.ui = 0; + jack_driver_descriptor_add_parameter(desc, &filler, "input-latency", 'I', JackDriverParamUInt, &value, NULL, "Extra input latency", NULL); + jack_driver_descriptor_add_parameter(desc, &filler, "output-latency", 'O', JackDriverParamUInt, &value, NULL, "Extra output latency", NULL); + + value.i = TRUE; + jack_driver_descriptor_add_parameter(desc, &filler, "list-devices", 'l', JackDriverParamBool, &value, NULL, "Display available PortAudio devices", NULL); return desc; } diff --git a/windows/winmme/JackWinMMEDriver.cpp b/windows/winmme/JackWinMMEDriver.cpp index 5c1f82fc..b05d36e6 100644 --- a/windows/winmme/JackWinMMEDriver.cpp +++ b/windows/winmme/JackWinMMEDriver.cpp @@ -362,16 +362,8 @@ extern "C" SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { jack_driver_desc_t * desc; - //unsigned int i; - desc = (jack_driver_desc_t*)calloc (1, sizeof (jack_driver_desc_t)); - strcpy(desc->name, "winmme"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 - strcpy(desc->desc, "WinMME API based MIDI backend"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 - - desc->nparams = 0; - desc->params = (jack_driver_param_desc_t*)calloc (desc->nparams, sizeof (jack_driver_param_desc_t)); - - return desc; + return jack_driver_descriptor_construct("winmme", "WinMME API based MIDI backend", NULL); } SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params)