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

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

struct jackctl_parameter
{
@@ -277,7 +282,7 @@ jackctl_drivers_load(
descriptor_node_ptr = jack_drivers_load(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;
}

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


static int
jackctl_internals_load(
struct jackctl_server * server_ptr)
{
struct jackctl_driver * internal_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 drivers in direver directory!");
jack_error("could not find any internals in driver directory!");
return false;
}

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)
{
jack_error("memory allocation of jackctl_driver structure failed.");
@@ -989,7 +995,7 @@ jackctl_internals_load(
internal_ptr->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);
free(internal_ptr);
@@ -1013,14 +1019,14 @@ jackctl_server_free_internals(
struct jackctl_server * server_ptr)
{
JSList * next_node_ptr;
struct jackctl_driver * internal_ptr;
struct jackctl_internal * internal_ptr;

while (server_ptr->internals)
{
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);
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;
}

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

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

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

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, '.');
if (!ptr) {
continue;


+ 39
- 12
common/control_types.h View File

@@ -21,15 +21,15 @@
#ifndef __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

/** 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 */
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 */
typedef struct jackctl_parameter jackctl_parameter_t;

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

EXPORT jackctl_server_t *
jackctl_server_create();
EXPORT void
jackctl_server_destroy(
jackctl_server_t * server);
@@ -155,7 +158,31 @@ jackctl_parameter_set_value(
EXPORT union jackctl_parameter_value
jackctl_parameter_get_default_value(
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
{ /* Adjust editor indent */
#endif
@@ -163,4 +190,4 @@ jackctl_parameter_get_default_value(
} /* extern "C" */
#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
* 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
*
@@ -336,7 +336,7 @@ jackctl_server_get_internals_list(
*/
const char *
jackctl_internal_get_name(
jackctl_driver_t * internal);
jackctl_internal_t * internal);

/**
* 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;
const JSList * node_ptr;
const char ** driver_name_target;
const char ** internal_name_target;
JSList * drivers;
JSList * internals;
DBusObjectPathVTable vtable =
{
jack_dbus_message_handler_unregister,
@@ -289,6 +291,24 @@ jack_controller_create(
node_ptr = jack_slist_next(node_ptr);
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.interfaces = g_jackcontroller_interfaces;
@@ -300,15 +320,16 @@ jack_controller_create(
&controller_ptr->dbus_descriptor))
{
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);

return controller_ptr;

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

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

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

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;
unsigned int drivers_count;
const char **internal_names;
unsigned int internals_count;

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


Loading…
Cancel
Save