git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2816 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -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); | |||
@@ -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; | |||
@@ -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 |
@@ -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 | |||
@@ -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); | |||
@@ -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; | |||