Browse Source

Internal clients enumeration working.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2817 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 16 years ago
parent
commit
a52cb6eaa4
11 changed files with 189 additions and 104 deletions
  1. +76
    -68
      common/JackControl.cpp
  2. +42
    -24
      common/JackDriverLoader.cpp
  3. +1
    -1
      common/JackDriverLoader.h
  4. +1
    -1
      common/JackNetAdapter.cpp
  5. +1
    -1
      common/JackNetManager.cpp
  6. +4
    -4
      linux/alsa/JackAlsaAdapter.cpp
  7. +2
    -2
      linux/dbus/controller.c
  8. +1
    -1
      macosx/JackCoreAudioAdapter.cpp
  9. +55
    -0
      tests/jack_server_control.cpp
  10. +5
    -1
      tests/wscript
  11. +1
    -1
      windows/JackPortAudioAdapter.cpp

+ 76
- 68
common/JackControl.cpp View File

@@ -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;
}
}

+ 42
- 24
common/JackDriverLoader.cpp View File

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


+ 1
- 1
common/JackDriverLoader.h View File

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


+ 1
- 1
common/JackNetAdapter.cpp View File

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




+ 1
- 1
common/JackNetManager.cpp View File

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




+ 4
- 4
linux/alsa/JackAlsaAdapter.cpp View File

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


+ 2
- 2
linux/dbus/controller.c View File

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


+ 1
- 1
macosx/JackCoreAudioAdapter.cpp View File

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




+ 55
- 0
tests/jack_server_control.cpp View File

@@ -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;
}

+ 5
- 1
tests/wscript View File

@@ -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

+ 1
- 1
windows/JackPortAudioAdapter.cpp View File

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




Loading…
Cancel
Save