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)); | ||||