Browse Source

Implement internal clients enumeration.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2816 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 16 years ago
parent
commit
58596f44f3
6 changed files with 113 additions and 29 deletions
  1. +15
    -9
      common/JackControl.cpp
  2. +30
    -4
      common/JackDriverLoader.cpp
  3. +39
    -12
      common/control_types.h
  4. +2
    -2
      common/jack/control.h
  5. +24
    -2
      linux/dbus/controller.c
  6. +3
    -0
      linux/dbus/controller_internal.h

+ 15
- 9
common/JackControl.cpp View File

@@ -99,7 +99,12 @@ struct jackctl_driver
JSList * set_parameters; JSList * set_parameters;
}; };


typedef jackctl_driver jackctl_internal;
struct jackctl_internal
{
jack_driver_desc_t * desc_ptr;
JSList * parameters;
JSList * set_parameters;
};


struct jackctl_parameter struct jackctl_parameter
{ {
@@ -277,7 +282,7 @@ jackctl_drivers_load(
descriptor_node_ptr = jack_drivers_load(NULL); descriptor_node_ptr = jack_drivers_load(NULL);
if (descriptor_node_ptr == NULL) if (descriptor_node_ptr == NULL)
{ {
jack_error("could not find any drivers in direver directory!");
jack_error("could not find any drivers in driver directory!");
return false; return false;
} }


@@ -961,24 +966,25 @@ EXPORT bool jackctl_server_unload_internal(
return false; return false;
} }



static int static int
jackctl_internals_load( jackctl_internals_load(
struct jackctl_server * server_ptr) struct jackctl_server * server_ptr)
{ {
struct jackctl_driver * internal_ptr;
struct jackctl_internal * internal_ptr;
JSList *node_ptr; JSList *node_ptr;
JSList *descriptor_node_ptr; JSList *descriptor_node_ptr;


descriptor_node_ptr = jack_internals_load(NULL); descriptor_node_ptr = jack_internals_load(NULL);
if (descriptor_node_ptr == NULL) if (descriptor_node_ptr == NULL)
{ {
jack_error("could not find any drivers in direver directory!");
jack_error("could not find any internals in driver directory!");
return false; return false;
} }


while (descriptor_node_ptr != NULL) while (descriptor_node_ptr != NULL)
{ {
internal_ptr = (struct jackctl_driver *)malloc(sizeof(struct jackctl_driver));
internal_ptr = (struct jackctl_internal *)malloc(sizeof(struct jackctl_driver));
if (internal_ptr == NULL) if (internal_ptr == NULL)
{ {
jack_error("memory allocation of jackctl_driver structure failed."); jack_error("memory allocation of jackctl_driver structure failed.");
@@ -989,7 +995,7 @@ jackctl_internals_load(
internal_ptr->parameters = NULL; internal_ptr->parameters = NULL;
internal_ptr->set_parameters = NULL; internal_ptr->set_parameters = NULL;


if (!jackctl_add_driver_parameters(internal_ptr))
if (!jackctl_add_driver_parameters((struct jackctl_driver *)internal_ptr))
{ {
assert(internal_ptr->parameters == NULL); assert(internal_ptr->parameters == NULL);
free(internal_ptr); free(internal_ptr);
@@ -1013,14 +1019,14 @@ jackctl_server_free_internals(
struct jackctl_server * server_ptr) struct jackctl_server * server_ptr)
{ {
JSList * next_node_ptr; JSList * next_node_ptr;
struct jackctl_driver * internal_ptr;
struct jackctl_internal * internal_ptr;


while (server_ptr->internals) while (server_ptr->internals)
{ {
next_node_ptr = server_ptr->internals->next; next_node_ptr = server_ptr->internals->next;
internal_ptr = (struct jackctl_driver *)server_ptr->internals->data;
internal_ptr = (struct jackctl_internal *)server_ptr->internals->data;


jackctl_free_driver_parameters(internal_ptr);
jackctl_free_driver_parameters((struct jackctl_driver *)internal_ptr);
free(internal_ptr->desc_ptr->params); free(internal_ptr->desc_ptr->params);
free(internal_ptr->desc_ptr); free(internal_ptr->desc_ptr);
free(internal_ptr); free(internal_ptr);


+ 30
- 4
common/JackDriverLoader.cpp View File

@@ -500,6 +500,25 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile)
return descriptor; return descriptor;
} }


static bool check_symbol(const char* filename, const char* symbol)
{
void * dlhandle;
bool res = false;
if ((dlhandle = LoadDriverModule(filename)) == NULL) {
#ifdef WIN32
jack_error ("could not open driver .dll '%s': %ld\n", filename, GetLastError());
#else
jack_error ("could not open driver .so '%s': %s\n", filename, dlerror());
#endif
} else {
res = (GetProc(dlhandle, symbol)) ? true : false;
UnloadDriverModule(dlhandle);
}
return res;
}

#ifdef WIN32 #ifdef WIN32


JSList * JSList *
@@ -649,6 +668,12 @@ 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;
@@ -657,6 +682,7 @@ jack_internals_load (JSList * internals) {
if (strncmp ("dll", ptr, 3) != 0) { if (strncmp ("dll", ptr, 3) != 0) {
continue; continue;
} }


desc = jack_drivers_get_descriptor (internals, filedata.cFileName); desc = jack_drivers_get_descriptor (internals, filedata.cFileName);
if (desc) { if (desc) {
@@ -700,11 +726,11 @@ jack_internals_load (JSList * internals) {


while ((dir_entry = readdir(dir_stream))) { while ((dir_entry = readdir(dir_stream))) {


/* check the filename is of the right format */
if (strncmp ("jack_", dir_entry->d_name, 5) != 0) {
continue;
/* 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;


+ 39
- 12
common/control_types.h View File

@@ -21,15 +21,15 @@
#ifndef __control_types__ #ifndef __control_types__
#define __control_types__ #define __control_types__


#include "jslist.h"
#include "JackExports.h"
#ifdef WIN32
#ifdef __MINGW32__
#include <sys/types.h>
#else
typedef HANDLE sigset_t;
#endif
#include "jslist.h"
#include "JackExports.h"
#ifdef WIN32
#ifdef __MINGW32__
#include <sys/types.h>
#else
typedef HANDLE sigset_t;
#endif
#endif #endif


/** Parameter types, intentionally similar to jack_driver_param_type_t */ /** Parameter types, intentionally similar to jack_driver_param_type_t */
@@ -65,6 +65,9 @@ typedef struct jackctl_server jackctl_server_t;
/** opaque type for driver object */ /** opaque type for driver object */
typedef struct jackctl_driver jackctl_driver_t; typedef struct jackctl_driver jackctl_driver_t;


/** opaque type for internal client object */
typedef struct jackctl_internal jackctl_internal_t;

/** opaque type for parameter object */ /** opaque type for parameter object */
typedef struct jackctl_parameter jackctl_parameter_t; typedef struct jackctl_parameter jackctl_parameter_t;


@@ -85,7 +88,7 @@ jackctl_wait_signals(


EXPORT jackctl_server_t * EXPORT jackctl_server_t *
jackctl_server_create(); jackctl_server_create();
EXPORT void EXPORT void
jackctl_server_destroy( jackctl_server_destroy(
jackctl_server_t * server); jackctl_server_t * server);
@@ -155,7 +158,31 @@ jackctl_parameter_set_value(
EXPORT union jackctl_parameter_value EXPORT union jackctl_parameter_value
jackctl_parameter_get_default_value( jackctl_parameter_get_default_value(
jackctl_parameter_t * parameter); jackctl_parameter_t * parameter);
EXPORT union jackctl_parameter_value
jackctl_parameter_get_default_value(
jackctl_parameter *parameter_ptr);
EXPORT const JSList *
jackctl_server_get_internals_list(
jackctl_server *server_ptr);
EXPORT const char *
jackctl_internal_get_name(
jackctl_internal *internal_ptr);
EXPORT const JSList *
jackctl_internal_get_parameters(
jackctl_internal *internal_ptr);
EXPORT bool jackctl_server_load_internal(
jackctl_server * server,
jackctl_internal * internal);
EXPORT bool jackctl_server_unload_internal(
jackctl_server * server,
jackctl_internal * internal);

#if 0 #if 0
{ /* Adjust editor indent */ { /* Adjust editor indent */
#endif #endif
@@ -163,4 +190,4 @@ jackctl_parameter_get_default_value(
} /* extern "C" */ } /* extern "C" */
#endif #endif


#endif
#endif

+ 2
- 2
common/jack/control.h View File

@@ -315,7 +315,7 @@ jackctl_parameter_get_default_value(
/** /**
* Call this function to get list of available internal clients. List node data * Call this function to get list of available internal clients. List node data
* pointers is a internal client object handle (::jackctl_driver_t).
* pointers is a internal client object handle (::jackctl_internal_t).
* *
* @param server server object handle to get internal clients for * @param server server object handle to get internal clients for
* *
@@ -336,7 +336,7 @@ jackctl_server_get_internals_list(
*/ */
const char * const char *
jackctl_internal_get_name( jackctl_internal_get_name(
jackctl_driver_t * internal);
jackctl_internal_t * internal);


/** /**
* Call this function to get list of internal parameters. List node data * Call this function to get list of internal parameters. List node data


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

@@ -247,7 +247,9 @@ jack_controller_create(
struct jack_controller *controller_ptr; struct jack_controller *controller_ptr;
const JSList * node_ptr; const JSList * node_ptr;
const char ** driver_name_target; const char ** driver_name_target;
const char ** internal_name_target;
JSList * drivers; JSList * drivers;
JSList * internals;
DBusObjectPathVTable vtable = DBusObjectPathVTable vtable =
{ {
jack_dbus_message_handler_unregister, jack_dbus_message_handler_unregister,
@@ -289,6 +291,24 @@ jack_controller_create(
node_ptr = jack_slist_next(node_ptr); node_ptr = jack_slist_next(node_ptr);
driver_name_target++; driver_name_target++;
} }
internals = (JSList *)jackctl_server_get_internals_list(controller_ptr->server);
controller_ptr->drivers_count = jack_slist_length(internals);
controller_ptr->internal_names = malloc(controller_ptr->internals_count * sizeof(const char *));
if (controller_ptr->internal_names == NULL)
{
jack_error("Ran out of memory trying to allocate internals names array");
goto fail_destroy_server;
}

internal_name_target = controller_ptr->internal_names;
node_ptr = jackctl_server_get_drivers_list(controller_ptr->server);
while (node_ptr != NULL)
{
*internal_name_target = jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data);
node_ptr = jack_slist_next(node_ptr);
internal_name_target++;
}


controller_ptr->dbus_descriptor.context = controller_ptr; controller_ptr->dbus_descriptor.context = controller_ptr;
controller_ptr->dbus_descriptor.interfaces = g_jackcontroller_interfaces; controller_ptr->dbus_descriptor.interfaces = g_jackcontroller_interfaces;
@@ -300,15 +320,16 @@ jack_controller_create(
&controller_ptr->dbus_descriptor)) &controller_ptr->dbus_descriptor))
{ {
jack_error("Ran out of memory trying to register D-Bus object path"); jack_error("Ran out of memory trying to register D-Bus object path");
goto fail_free_driver_names_array;
goto fail_free_names_array;
} }


jack_controller_settings_load(controller_ptr); jack_controller_settings_load(controller_ptr);


return controller_ptr; return controller_ptr;


fail_free_driver_names_array:
fail_free_names_array:
free(controller_ptr->driver_names); free(controller_ptr->driver_names);
free(controller_ptr->internal_names);


fail_destroy_server: fail_destroy_server:
jackctl_server_destroy(controller_ptr->server); jackctl_server_destroy(controller_ptr->server);
@@ -332,6 +353,7 @@ jack_controller_destroy(
} }


free(controller_ptr->driver_names); free(controller_ptr->driver_names);
free(controller_ptr->internal_names);


jackctl_server_destroy(controller_ptr->server); jackctl_server_destroy(controller_ptr->server);




+ 3
- 0
linux/dbus/controller_internal.h View File

@@ -39,6 +39,9 @@ struct jack_controller


const char **driver_names; const char **driver_names;
unsigned int drivers_count; unsigned int drivers_count;
const char **internal_names;
unsigned int internals_count;


/* current driver, NULL if not driver is selected */ /* current driver, NULL if not driver is selected */
jackctl_driver_t *driver; jackctl_driver_t *driver;


Loading…
Cancel
Save