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 | |||
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; | |||
} | |||
} |
@@ -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); | |||
} | |||
@@ -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); | |||
@@ -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 ) ); | |||
@@ -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 ) ); | |||
@@ -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" ); | |||
@@ -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); | |||
@@ -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)); | |||
@@ -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'], | |||
'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 |
@@ -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)); | |||