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