git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2817 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -340,6 +340,77 @@ jackctl_server_free_drivers( | |||||
| } | } | ||||
| } | } | ||||
| static int | |||||
| jackctl_internals_load( | |||||
| struct jackctl_server * server_ptr) | |||||
| { | |||||
| struct jackctl_internal * internal_ptr; | |||||
| JSList *node_ptr; | |||||
| JSList *descriptor_node_ptr; | |||||
| descriptor_node_ptr = jack_internals_load(NULL); | |||||
| if (descriptor_node_ptr == NULL) | |||||
| { | |||||
| jack_error("could not find any internals in driver directory!"); | |||||
| return false; | |||||
| } | |||||
| while (descriptor_node_ptr != NULL) | |||||
| { | |||||
| jack_log("jackctl_internals_load"); | |||||
| internal_ptr = (struct jackctl_internal *)malloc(sizeof(struct jackctl_driver)); | |||||
| if (internal_ptr == NULL) | |||||
| { | |||||
| jack_error("memory allocation of jackctl_driver structure failed."); | |||||
| goto next; | |||||
| } | |||||
| internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | |||||
| internal_ptr->parameters = NULL; | |||||
| internal_ptr->set_parameters = NULL; | |||||
| if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) | |||||
| { | |||||
| assert(internal_ptr->parameters == NULL); | |||||
| free(internal_ptr); | |||||
| goto next; | |||||
| } | |||||
| server_ptr->internals = jack_slist_append(server_ptr->internals, internal_ptr); | |||||
| next: | |||||
| node_ptr = descriptor_node_ptr; | |||||
| descriptor_node_ptr = descriptor_node_ptr->next; | |||||
| free(node_ptr); | |||||
| } | |||||
| return true; | |||||
| } | |||||
| static | |||||
| void | |||||
| jackctl_server_free_internals( | |||||
| struct jackctl_server * server_ptr) | |||||
| { | |||||
| JSList * next_node_ptr; | |||||
| struct jackctl_internal * internal_ptr; | |||||
| while (server_ptr->internals) | |||||
| { | |||||
| next_node_ptr = server_ptr->internals->next; | |||||
| internal_ptr = (struct jackctl_internal *)server_ptr->internals->data; | |||||
| jackctl_free_driver_parameters((struct jackctl_driver *)internal_ptr); | |||||
| free(internal_ptr->desc_ptr->params); | |||||
| free(internal_ptr->desc_ptr); | |||||
| free(internal_ptr); | |||||
| free(server_ptr->internals); | |||||
| server_ptr->internals = next_node_ptr; | |||||
| } | |||||
| } | |||||
| static | static | ||||
| void | void | ||||
| jackctl_server_free_parameters( | jackctl_server_free_parameters( | ||||
| @@ -666,6 +737,11 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| { | { | ||||
| goto fail_free_parameters; | goto fail_free_parameters; | ||||
| } | } | ||||
| if (!jackctl_internals_load(server_ptr)) | |||||
| { | |||||
| goto fail_free_parameters; | |||||
| } | |||||
| return server_ptr; | return server_ptr; | ||||
| @@ -967,71 +1043,3 @@ EXPORT bool jackctl_server_unload_internal( | |||||
| } | } | ||||
| static int | |||||
| jackctl_internals_load( | |||||
| struct jackctl_server * server_ptr) | |||||
| { | |||||
| struct jackctl_internal * internal_ptr; | |||||
| JSList *node_ptr; | |||||
| JSList *descriptor_node_ptr; | |||||
| descriptor_node_ptr = jack_internals_load(NULL); | |||||
| if (descriptor_node_ptr == NULL) | |||||
| { | |||||
| jack_error("could not find any internals in driver directory!"); | |||||
| return false; | |||||
| } | |||||
| while (descriptor_node_ptr != NULL) | |||||
| { | |||||
| internal_ptr = (struct jackctl_internal *)malloc(sizeof(struct jackctl_driver)); | |||||
| if (internal_ptr == NULL) | |||||
| { | |||||
| jack_error("memory allocation of jackctl_driver structure failed."); | |||||
| goto next; | |||||
| } | |||||
| internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | |||||
| internal_ptr->parameters = NULL; | |||||
| internal_ptr->set_parameters = NULL; | |||||
| if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr)) | |||||
| { | |||||
| assert(internal_ptr->parameters == NULL); | |||||
| free(internal_ptr); | |||||
| goto next; | |||||
| } | |||||
| server_ptr->internals = jack_slist_append(server_ptr->internals, internal_ptr); | |||||
| next: | |||||
| node_ptr = descriptor_node_ptr; | |||||
| descriptor_node_ptr = descriptor_node_ptr->next; | |||||
| free(node_ptr); | |||||
| } | |||||
| return true; | |||||
| } | |||||
| static | |||||
| void | |||||
| jackctl_server_free_internals( | |||||
| struct jackctl_server * server_ptr) | |||||
| { | |||||
| JSList * next_node_ptr; | |||||
| struct jackctl_internal * internal_ptr; | |||||
| while (server_ptr->internals) | |||||
| { | |||||
| next_node_ptr = server_ptr->internals->next; | |||||
| internal_ptr = (struct jackctl_internal *)server_ptr->internals->data; | |||||
| jackctl_free_driver_parameters((struct jackctl_driver *)internal_ptr); | |||||
| free(internal_ptr->desc_ptr->params); | |||||
| free(internal_ptr->desc_ptr); | |||||
| free(internal_ptr); | |||||
| free(server_ptr->internals); | |||||
| server_ptr->internals = next_node_ptr; | |||||
| } | |||||
| } | |||||
| @@ -404,8 +404,8 @@ jack_find_driver_descriptor (JSList * drivers, const char * name) | |||||
| return desc; | return desc; | ||||
| } | } | ||||
| jack_driver_desc_t * | |||||
| jack_drivers_get_descriptor (JSList * drivers, const char * sofile) | |||||
| static jack_driver_desc_t * | |||||
| jack_get_descriptor (JSList * drivers, const char * sofile, const char * symbol) | |||||
| { | { | ||||
| jack_driver_desc_t * descriptor, * other_descriptor; | jack_driver_desc_t * descriptor, * other_descriptor; | ||||
| JackDriverDescFunction so_get_descriptor = NULL; | JackDriverDescFunction so_get_descriptor = NULL; | ||||
| @@ -450,14 +450,14 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) | |||||
| } | } | ||||
| so_get_descriptor = (JackDriverDescFunction) | so_get_descriptor = (JackDriverDescFunction) | ||||
| GetProc(dlhandle, "driver_get_descriptor"); | |||||
| GetProc(dlhandle, symbol); | |||||
| #ifdef WIN32 | #ifdef WIN32 | ||||
| if ((so_get_descriptor == NULL) && (dlerr = GetLastError()) != 0) { | if ((so_get_descriptor == NULL) && (dlerr = GetLastError()) != 0) { | ||||
| jack_error("jack_drivers_get_descriptor err = %ld", dlerr); | |||||
| jack_error("jack_get_descriptor err = %ld", dlerr); | |||||
| #else | #else | ||||
| if ((so_get_descriptor == NULL) && (dlerr = dlerror ()) != NULL) { | if ((so_get_descriptor == NULL) && (dlerr = dlerror ()) != NULL) { | ||||
| jack_error("jack_drivers_get_descriptor err = %s", dlerr); | |||||
| jack_error("jack_get_descriptor err = %s", dlerr); | |||||
| #endif | #endif | ||||
| UnloadDriverModule(dlhandle); | UnloadDriverModule(dlhandle); | ||||
| @@ -500,22 +500,41 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) | |||||
| return descriptor; | return descriptor; | ||||
| } | } | ||||
| static bool check_symbol(const char* filename, const char* symbol) | |||||
| static bool check_symbol(const char* sofile, const char* symbol) | |||||
| { | { | ||||
| void * dlhandle; | void * dlhandle; | ||||
| bool res = false; | bool res = false; | ||||
| const char* driver_dir; | |||||
| if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) { | |||||
| // for WIN32 ADDON_DIR is defined in JackConstants.h as relative path | |||||
| // for posix systems, it is absolute path of default driver dir | |||||
| #ifdef WIN32 | |||||
| char temp_driver_dir1[512]; | |||||
| char temp_driver_dir2[512]; | |||||
| GetCurrentDirectory(512, temp_driver_dir1); | |||||
| sprintf(temp_driver_dir2, "%s/%s", temp_driver_dir1, ADDON_DIR); | |||||
| driver_dir = temp_driver_dir2; | |||||
| #else | |||||
| driver_dir = ADDON_DIR; | |||||
| #endif | |||||
| } | |||||
| char* filename = (char *)malloc(strlen (driver_dir) + 1 + strlen(sofile) + 1); | |||||
| sprintf (filename, "%s/%s", driver_dir, sofile); | |||||
| if ((dlhandle = LoadDriverModule(filename)) == NULL) { | if ((dlhandle = LoadDriverModule(filename)) == NULL) { | ||||
| #ifdef WIN32 | #ifdef WIN32 | ||||
| jack_error ("could not open driver .dll '%s': %ld\n", filename, GetLastError()); | |||||
| jack_error ("could not open component .dll '%s': %ld\n", filename, GetLastError()); | |||||
| #else | #else | ||||
| jack_error ("could not open driver .so '%s': %s\n", filename, dlerror()); | |||||
| jack_error ("could not open component .so '%s': %s\n", filename, dlerror()); | |||||
| #endif | #endif | ||||
| } else { | } else { | ||||
| res = (GetProc(dlhandle, symbol)) ? true : false; | res = (GetProc(dlhandle, symbol)) ? true : false; | ||||
| UnloadDriverModule(dlhandle); | UnloadDriverModule(dlhandle); | ||||
| } | } | ||||
| free(filename); | |||||
| return res; | return res; | ||||
| } | } | ||||
| @@ -559,7 +578,7 @@ jack_drivers_load (JSList * drivers) { | |||||
| continue; | continue; | ||||
| } | } | ||||
| desc = jack_drivers_get_descriptor (drivers, filedata.cFileName); | |||||
| desc = jack_get_descriptor (drivers, filedata.cFileName, "driver_get_descriptor"); | |||||
| if (desc) { | if (desc) { | ||||
| driver_list = jack_slist_append (driver_list, desc); | driver_list = jack_slist_append (driver_list, desc); | ||||
| } | } | ||||
| @@ -615,7 +634,7 @@ jack_drivers_load (JSList * drivers) { | |||||
| continue; | continue; | ||||
| } | } | ||||
| desc = jack_drivers_get_descriptor (drivers, dir_entry->d_name); | |||||
| desc = jack_get_descriptor (drivers, dir_entry->d_name, "driver_get_descriptor"); | |||||
| if (desc) { | if (desc) { | ||||
| driver_list = jack_slist_append (driver_list, desc); | driver_list = jack_slist_append (driver_list, desc); | ||||
| } | } | ||||
| @@ -669,11 +688,6 @@ jack_internals_load (JSList * internals) { | |||||
| do { | do { | ||||
| /* check if dll is an internal client */ | |||||
| if (!check_symbol(filedata.cFileName, "jack_internal_initialize")) { | |||||
| continue; | |||||
| } | |||||
| ptr = strrchr (filedata.cFileName, '.'); | ptr = strrchr (filedata.cFileName, '.'); | ||||
| if (!ptr) { | if (!ptr) { | ||||
| continue; | continue; | ||||
| @@ -683,8 +697,12 @@ jack_internals_load (JSList * internals) { | |||||
| continue; | continue; | ||||
| } | } | ||||
| desc = jack_drivers_get_descriptor (internals, filedata.cFileName); | |||||
| /* check if dll is an internal client */ | |||||
| if (!check_symbol(filedata.cFileName, "jack_internal_initialize")) { | |||||
| continue; | |||||
| } | |||||
| desc = jack_get_descriptor (internals, filedata.cFileName, "jack_get_descriptor"); | |||||
| if (desc) { | if (desc) { | ||||
| driver_list = jack_slist_append (driver_list, desc); | driver_list = jack_slist_append (driver_list, desc); | ||||
| } | } | ||||
| @@ -726,11 +744,6 @@ jack_internals_load (JSList * internals) { | |||||
| while ((dir_entry = readdir(dir_stream))) { | while ((dir_entry = readdir(dir_stream))) { | ||||
| /* check if dll is an internal client */ | |||||
| if (!check_symbol(dir_entry->d_name, "jack_internal_initialize")) { | |||||
| continue; | |||||
| } | |||||
| ptr = strrchr (dir_entry->d_name, '.'); | ptr = strrchr (dir_entry->d_name, '.'); | ||||
| if (!ptr) { | if (!ptr) { | ||||
| continue; | continue; | ||||
| @@ -739,8 +752,13 @@ jack_internals_load (JSList * internals) { | |||||
| if (strncmp ("so", ptr, 2) != 0) { | if (strncmp ("so", ptr, 2) != 0) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| desc = jack_drivers_get_descriptor (internals, dir_entry->d_name); | |||||
| /* check if dll is an internal client */ | |||||
| if (!check_symbol(dir_entry->d_name, "jack_internal_initialize")) { | |||||
| continue; | |||||
| } | |||||
| desc = jack_get_descriptor (internals, dir_entry->d_name, "jack_get_descriptor"); | |||||
| if (desc) { | if (desc) { | ||||
| driver_list = jack_slist_append (driver_list, desc); | driver_list = jack_slist_append (driver_list, desc); | ||||
| } | } | ||||
| @@ -61,7 +61,7 @@ typedef struct _jack_driver_info | |||||
| jack_driver_info_t; | jack_driver_info_t; | ||||
| jack_driver_desc_t * jack_find_driver_descriptor (JSList * drivers, const char * name); | jack_driver_desc_t * jack_find_driver_descriptor (JSList * drivers, const char * name); | ||||
| jack_driver_desc_t * jack_drivers_get_descriptor (JSList * drivers, const char * sofile); | |||||
| //jack_driver_desc_t * jack_drivers_get_descriptor (JSList * drivers, const char * sofile); | |||||
| JSList * jack_drivers_load (JSList * drivers); | JSList * jack_drivers_load (JSList * drivers); | ||||
| JSList * jack_internals_load (JSList * internals); | JSList * jack_internals_load (JSList * internals); | ||||
| @@ -435,7 +435,7 @@ extern "C" | |||||
| EXPORT jack_driver_desc_t* jack_get_descriptor() | EXPORT jack_driver_desc_t* jack_get_descriptor() | ||||
| { | { | ||||
| jack_driver_desc_t* desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | jack_driver_desc_t* desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | ||||
| strcpy ( desc->name, "net" ); | |||||
| strcpy ( desc->name, "netadapter" ); | |||||
| desc->nparams = 9; | desc->nparams = 9; | ||||
| desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | ||||
| @@ -699,7 +699,7 @@ extern "C" | |||||
| jack_driver_desc_t *desc; | jack_driver_desc_t *desc; | ||||
| desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | ||||
| strcpy ( desc->name, "netmanager" ); | |||||
| strcpy ( desc->name, "netmanager" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
| desc->nparams = 2; | desc->nparams = 2; | ||||
| desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | ||||
| @@ -211,11 +211,11 @@ extern "C" | |||||
| jack_driver_desc_t *desc; | jack_driver_desc_t *desc; | ||||
| jack_driver_param_desc_t * params; | jack_driver_param_desc_t * params; | ||||
| unsigned int i; | unsigned int i; | ||||
| desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) ); | |||||
| strcpy ( desc->name, "alsa-adapter" ); | |||||
| 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 | |||||
| desc->nparams = 9; | desc->nparams = 9; | ||||
| params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | |||||
| params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | |||||
| i = 0; | i = 0; | ||||
| strcpy ( params[i].name, "capture" ); | strcpy ( params[i].name, "capture" ); | ||||
| @@ -293,7 +293,7 @@ jack_controller_create( | |||||
| } | } | ||||
| internals = (JSList *)jackctl_server_get_internals_list(controller_ptr->server); | internals = (JSList *)jackctl_server_get_internals_list(controller_ptr->server); | ||||
| controller_ptr->drivers_count = jack_slist_length(internals); | |||||
| controller_ptr->internals_count = jack_slist_length(internals); | |||||
| controller_ptr->internal_names = malloc(controller_ptr->internals_count * sizeof(const char *)); | controller_ptr->internal_names = malloc(controller_ptr->internals_count * sizeof(const char *)); | ||||
| if (controller_ptr->internal_names == NULL) | if (controller_ptr->internal_names == NULL) | ||||
| { | { | ||||
| @@ -302,7 +302,7 @@ jack_controller_create( | |||||
| } | } | ||||
| internal_name_target = controller_ptr->internal_names; | internal_name_target = controller_ptr->internal_names; | ||||
| node_ptr = jackctl_server_get_drivers_list(controller_ptr->server); | |||||
| node_ptr = jackctl_server_get_internals_list(controller_ptr->server); | |||||
| while (node_ptr != NULL) | while (node_ptr != NULL) | ||||
| { | { | ||||
| *internal_name_target = jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data); | *internal_name_target = jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data); | ||||
| @@ -960,7 +960,7 @@ extern "C" | |||||
| unsigned int i; | unsigned int i; | ||||
| desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); | desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); | ||||
| strcpy(desc->name, "coreaudio-adapter"); | |||||
| strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
| desc->nparams = 10; | desc->nparams = 10; | ||||
| desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | ||||
| @@ -0,0 +1,55 @@ | |||||
| /* | |||||
| Copyright (C) 2008 Grame | |||||
| This program is free software; you can redistribute it and/or modify | |||||
| it under the terms of the GNU General Public License as published by | |||||
| the Free Software Foundation; either version 2 of the License, or | |||||
| (at your option) any later version. | |||||
| This program is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
| GNU General Public License for more details. | |||||
| You should have received a copy of the GNU General Public License | |||||
| along with this program; if not, write to the Free Software | |||||
| Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| */ | |||||
| #include <stdio.h> | |||||
| #include <errno.h> | |||||
| #include <unistd.h> | |||||
| #include <stdlib.h> | |||||
| #include <string.h> | |||||
| #include <getopt.h> | |||||
| #include <jack/jack.h> | |||||
| #include <jack/control.h> | |||||
| jackctl_server_t * server; | |||||
| int main(int argc, char *argv[]) | |||||
| { | |||||
| const JSList * drivers; | |||||
| const JSList * internals; | |||||
| const JSList * node_ptr; | |||||
| server = jackctl_server_create(); | |||||
| drivers = jackctl_server_get_drivers_list(server); | |||||
| node_ptr = drivers; | |||||
| while (node_ptr != NULL) { | |||||
| printf("driver = %s\n", jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data)); | |||||
| node_ptr = jack_slist_next(node_ptr); | |||||
| } | |||||
| internals = jackctl_server_get_internals_list(server); | |||||
| node_ptr = internals; | |||||
| while (node_ptr != NULL) { | |||||
| printf("internal client = %s\n", jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data)); | |||||
| node_ptr = jack_slist_next(node_ptr); | |||||
| } | |||||
| jackctl_server_destroy(server); | |||||
| return 0; | |||||
| } | |||||
| @@ -8,6 +8,7 @@ test_programs = { | |||||
| 'testSem': ['testSem.cpp'], | 'testSem': ['testSem.cpp'], | ||||
| 'jack_test': ['jack_test.cpp'], | 'jack_test': ['jack_test.cpp'], | ||||
| 'jack_cpu': ['jack_cpu.c'], | 'jack_cpu': ['jack_cpu.c'], | ||||
| 'jack_server_control': ['jack_server_control.cpp'], | |||||
| } | } | ||||
| def build(bld): | def build(bld): | ||||
| @@ -22,7 +23,10 @@ def build(bld): | |||||
| prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | prog.env.append_value("CPPFLAGS", "-mmacosx-version-min=10.4 -arch i386 -arch ppc") | ||||
| #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | #prog.env.append_value("LINKFLAGS", "-arch i386 -arch ppc") | ||||
| prog.env.append_value("LINKFLAGS", "") | prog.env.append_value("LINKFLAGS", "") | ||||
| prog.uselib_local = 'clientlib' | |||||
| if test_program == 'jack_server_control': | |||||
| prog.uselib_local = 'serverlib' | |||||
| else: | |||||
| prog.uselib_local = 'clientlib' | |||||
| prog.target = test_program | prog.target = test_program | ||||
| #if test_program != 'jack_test': | #if test_program != 'jack_test': | ||||
| # prog.inst_var = 0 | # prog.inst_var = 0 | ||||
| @@ -241,7 +241,7 @@ extern "C" | |||||
| unsigned int i; | unsigned int i; | ||||
| desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); | desc = (jack_driver_desc_t*)calloc(1, sizeof(jack_driver_desc_t)); | ||||
| strcpy(desc->name, "portaudio-adapter"); | |||||
| strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | |||||
| desc->nparams = 8; | desc->nparams = 8; | ||||
| desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | ||||