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