From a52cb6eaa448d9f4a6d26af2800aea5c3676b5f4 Mon Sep 17 00:00:00 2001 From: sletz Date: Thu, 28 Aug 2008 09:38:39 +0000 Subject: [PATCH] Internal clients enumeration working. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2817 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackControl.cpp | 144 ++++++++++++++++--------------- common/JackDriverLoader.cpp | 66 ++++++++------ common/JackDriverLoader.h | 2 +- common/JackNetAdapter.cpp | 2 +- common/JackNetManager.cpp | 2 +- linux/alsa/JackAlsaAdapter.cpp | 8 +- linux/dbus/controller.c | 4 +- macosx/JackCoreAudioAdapter.cpp | 2 +- tests/jack_server_control.cpp | 55 ++++++++++++ tests/wscript | 6 +- windows/JackPortAudioAdapter.cpp | 2 +- 11 files changed, 189 insertions(+), 104 deletions(-) create mode 100644 tests/jack_server_control.cpp diff --git a/common/JackControl.cpp b/common/JackControl.cpp index 04cabb5f..cd53620c 100644 --- a/common/JackControl.cpp +++ b/common/JackControl.cpp @@ -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 void jackctl_server_free_parameters( @@ -666,6 +737,11 @@ EXPORT jackctl_server_t * jackctl_server_create() { goto fail_free_parameters; } + + if (!jackctl_internals_load(server_ptr)) + { + goto fail_free_parameters; + } 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; - } -} diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index bae9064c..b165d9e3 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -404,8 +404,8 @@ jack_find_driver_descriptor (JSList * drivers, const char * name) 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; JackDriverDescFunction so_get_descriptor = NULL; @@ -450,14 +450,14 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) } so_get_descriptor = (JackDriverDescFunction) - GetProc(dlhandle, "driver_get_descriptor"); + GetProc(dlhandle, symbol); #ifdef WIN32 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 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 UnloadDriverModule(dlhandle); @@ -500,22 +500,41 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile) return descriptor; } -static bool check_symbol(const char* filename, const char* symbol) +static bool check_symbol(const char* sofile, const char* symbol) { void * dlhandle; 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) { #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 - 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 } else { res = (GetProc(dlhandle, symbol)) ? true : false; UnloadDriverModule(dlhandle); } + free(filename); return res; } @@ -559,7 +578,7 @@ jack_drivers_load (JSList * drivers) { continue; } - desc = jack_drivers_get_descriptor (drivers, filedata.cFileName); + desc = jack_get_descriptor (drivers, filedata.cFileName, "driver_get_descriptor"); if (desc) { driver_list = jack_slist_append (driver_list, desc); } @@ -615,7 +634,7 @@ jack_drivers_load (JSList * drivers) { 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) { driver_list = jack_slist_append (driver_list, desc); } @@ -669,11 +688,6 @@ jack_internals_load (JSList * internals) { do { - /* check if dll is an internal client */ - if (!check_symbol(filedata.cFileName, "jack_internal_initialize")) { - continue; - } - ptr = strrchr (filedata.cFileName, '.'); if (!ptr) { continue; @@ -683,8 +697,12 @@ jack_internals_load (JSList * internals) { 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) { driver_list = jack_slist_append (driver_list, desc); } @@ -726,11 +744,6 @@ jack_internals_load (JSList * internals) { 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, '.'); if (!ptr) { continue; @@ -739,8 +752,13 @@ jack_internals_load (JSList * internals) { if (strncmp ("so", ptr, 2) != 0) { 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) { driver_list = jack_slist_append (driver_list, desc); } diff --git a/common/JackDriverLoader.h b/common/JackDriverLoader.h index 362ce1d6..734d78b7 100644 --- a/common/JackDriverLoader.h +++ b/common/JackDriverLoader.h @@ -61,7 +61,7 @@ typedef struct _jack_driver_info jack_driver_info_t; 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_internals_load (JSList * internals); diff --git a/common/JackNetAdapter.cpp b/common/JackNetAdapter.cpp index aae1bf37..4c3f730d 100644 --- a/common/JackNetAdapter.cpp +++ b/common/JackNetAdapter.cpp @@ -435,7 +435,7 @@ extern "C" 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, "net" ); + strcpy ( desc->name, "netadapter" ); desc->nparams = 9; desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index db327d24..894a07ad 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -699,7 +699,7 @@ extern "C" jack_driver_desc_t *desc; 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->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); diff --git a/linux/alsa/JackAlsaAdapter.cpp b/linux/alsa/JackAlsaAdapter.cpp index fa81728c..9e18d0aa 100644 --- a/linux/alsa/JackAlsaAdapter.cpp +++ b/linux/alsa/JackAlsaAdapter.cpp @@ -211,11 +211,11 @@ extern "C" 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-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; - 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; strcpy ( params[i].name, "capture" ); diff --git a/linux/dbus/controller.c b/linux/dbus/controller.c index d2083024..d6d91dd2 100644 --- a/linux/dbus/controller.c +++ b/linux/dbus/controller.c @@ -293,7 +293,7 @@ jack_controller_create( } 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 *)); if (controller_ptr->internal_names == NULL) { @@ -302,7 +302,7 @@ jack_controller_create( } 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) { *internal_name_target = jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data); diff --git a/macosx/JackCoreAudioAdapter.cpp b/macosx/JackCoreAudioAdapter.cpp index 25f76c16..0f1b346a 100644 --- a/macosx/JackCoreAudioAdapter.cpp +++ b/macosx/JackCoreAudioAdapter.cpp @@ -960,7 +960,7 @@ extern "C" unsigned int i; 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->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); diff --git a/tests/jack_server_control.cpp b/tests/jack_server_control.cpp new file mode 100644 index 00000000..85d90369 --- /dev/null +++ b/tests/jack_server_control.cpp @@ -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 +#include +#include +#include +#include +#include +#include +#include + +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; +} diff --git a/tests/wscript b/tests/wscript index daf94ceb..1d429265 100644 --- a/tests/wscript +++ b/tests/wscript @@ -8,6 +8,7 @@ test_programs = { 'testSem': ['testSem.cpp'], 'jack_test': ['jack_test.cpp'], 'jack_cpu': ['jack_cpu.c'], + 'jack_server_control': ['jack_server_control.cpp'], } 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("LINKFLAGS", "-arch i386 -arch ppc") 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 #if test_program != 'jack_test': # prog.inst_var = 0 diff --git a/windows/JackPortAudioAdapter.cpp b/windows/JackPortAudioAdapter.cpp index 51365119..7072dd45 100644 --- a/windows/JackPortAudioAdapter.cpp +++ b/windows/JackPortAudioAdapter.cpp @@ -241,7 +241,7 @@ extern "C" unsigned int i; 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->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t));