git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4292 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
@@ -64,6 +64,56 @@ jack_controller_find_driver( | |||||
return NULL; | return NULL; | ||||
} | } | ||||
bool | |||||
jack_controller_add_slave_drivers( | |||||
struct jack_controller * controller_ptr) | |||||
{ | |||||
struct list_head * node_ptr; | |||||
struct jack_controller_slave_driver * driver_ptr; | |||||
list_for_each(node_ptr, &controller_ptr->slave_drivers) | |||||
{ | |||||
driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings); | |||||
driver_ptr->handle = jack_controller_find_driver(controller_ptr->server, driver_ptr->name); | |||||
if (driver_ptr->handle == NULL) | |||||
{ | |||||
jack_error("Unknown driver \"%s\"", driver_ptr->name); | |||||
goto fail; | |||||
} | |||||
if (!jackctl_server_add_slave(controller_ptr->server, driver_ptr->handle)) | |||||
{ | |||||
jack_error("Driver \"%s\" cannot be loaded", driver_ptr->name); | |||||
goto fail; | |||||
} | |||||
} | |||||
return true; | |||||
fail: | |||||
driver_ptr->handle = NULL; | |||||
return false; | |||||
} | |||||
void | |||||
jack_controller_remove_slave_drivers( | |||||
struct jack_controller * controller_ptr) | |||||
{ | |||||
struct list_head * node_ptr; | |||||
struct jack_controller_slave_driver * driver_ptr; | |||||
list_for_each(node_ptr, &controller_ptr->slave_drivers) | |||||
{ | |||||
driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings); | |||||
if (driver_ptr->handle != NULL) | |||||
{ | |||||
jackctl_server_remove_slave(controller_ptr->server, driver_ptr->handle); | |||||
driver_ptr->handle = NULL; | |||||
} | |||||
} | |||||
} | |||||
jackctl_internal_t * | jackctl_internal_t * | ||||
jack_controller_find_internal( | jack_controller_find_internal( | ||||
jackctl_server_t *server, | jackctl_server_t *server, | ||||
@@ -161,6 +211,8 @@ jack_controller_start_server( | |||||
goto fail; | goto fail; | ||||
} | } | ||||
jack_controller_add_slave_drivers(controller_ptr); | |||||
if (!jackctl_server_start( | if (!jackctl_server_start( | ||||
controller_ptr->server)) | controller_ptr->server)) | ||||
{ | { | ||||
@@ -221,6 +273,8 @@ fail_stop_server: | |||||
} | } | ||||
fail_close_server: | fail_close_server: | ||||
jack_controller_remove_slave_drivers(controller_ptr); | |||||
if (!jackctl_server_close(controller_ptr->server)) | if (!jackctl_server_close(controller_ptr->server)) | ||||
{ | { | ||||
jack_error("failed to close jack server"); | jack_error("failed to close jack server"); | ||||
@@ -263,6 +317,8 @@ jack_controller_stop_server( | |||||
return FALSE; | return FALSE; | ||||
} | } | ||||
jack_controller_remove_slave_drivers(controller_ptr); | |||||
if (!jackctl_server_close(controller_ptr->server)) | if (!jackctl_server_close(controller_ptr->server)) | ||||
{ | { | ||||
jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to close server"); | jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to close server"); | ||||
@@ -387,6 +443,7 @@ jack_controller_create( | |||||
controller_ptr->started = false; | controller_ptr->started = false; | ||||
controller_ptr->driver = NULL; | controller_ptr->driver = NULL; | ||||
controller_ptr->driver_set = false; | controller_ptr->driver_set = false; | ||||
INIT_LIST_HEAD(&controller_ptr->slave_drivers); | |||||
drivers = (JSList *)jackctl_server_get_drivers_list(controller_ptr->server); | drivers = (JSList *)jackctl_server_get_drivers_list(controller_ptr->server); | ||||
controller_ptr->drivers_count = jack_slist_length(drivers); | controller_ptr->drivers_count = jack_slist_length(drivers); | ||||
@@ -465,41 +522,58 @@ fail: | |||||
} | } | ||||
bool | bool | ||||
jack_controller_add_slave( | |||||
struct jack_controller *controller_ptr, | |||||
jack_controller_add_slave_driver( | |||||
struct jack_controller * controller_ptr, | |||||
const char * driver_name) | const char * driver_name) | ||||
{ | { | ||||
jackctl_driver_t *driver; | |||||
struct jack_controller_slave_driver * driver_ptr; | |||||
driver = jack_controller_find_driver(controller_ptr->server, driver_name); | |||||
if (driver == NULL) | |||||
driver_ptr = malloc(sizeof(struct jack_controller_slave_driver)); | |||||
if (driver_ptr == NULL) | |||||
{ | { | ||||
jack_error("malloc() failed to allocate jack_controller_slave_driver struct"); | |||||
return false; | return false; | ||||
} | } | ||||
jack_info("driver \"%s\" selected", driver_name); | |||||
driver_ptr->name = strdup(driver_name); | |||||
if (driver_ptr->name == NULL) | |||||
{ | |||||
jack_error("strdup() failed for slave driver name \"%s\"", driver_name); | |||||
free(driver_ptr); | |||||
return false; | |||||
} | |||||
driver_ptr->handle = NULL; | |||||
return jackctl_server_add_slave(controller_ptr->server, driver); | |||||
jack_info("slave driver \"%s\" added", driver_name); | |||||
list_add_tail(&driver_ptr->siblings, &controller_ptr->slave_drivers); | |||||
return true; | |||||
} | } | ||||
bool | bool | ||||
jack_controller_remove_slave( | |||||
struct jack_controller *controller_ptr, | |||||
jack_controller_remove_slave_driver( | |||||
struct jack_controller * controller_ptr, | |||||
const char * driver_name) | const char * driver_name) | ||||
{ | { | ||||
jackctl_driver_t *driver; | |||||
struct list_head * node_ptr; | |||||
struct jack_controller_slave_driver * driver_ptr; | |||||
driver = jack_controller_find_driver(controller_ptr->server, driver_name); | |||||
if (driver == NULL) | |||||
list_for_each(node_ptr, &controller_ptr->slave_drivers) | |||||
{ | { | ||||
return false; | |||||
driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings); | |||||
if (strcmp(driver_ptr->name, driver_name) == 0) | |||||
{ | |||||
jack_info("slave driver \"%s\" removed", driver_name); | |||||
list_del(&driver_ptr->siblings); | |||||
free(driver_ptr->name); | |||||
free(driver_ptr); | |||||
return true; | |||||
} | |||||
} | } | ||||
jack_info("driver \"%s\" selected", driver_name); | |||||
return jackctl_server_remove_slave(controller_ptr->server, driver); | |||||
return false; | |||||
} | } | ||||
bool | bool | ||||
@@ -229,10 +229,15 @@ jack_control_run_method( | |||||
"jack_controller_load_internal failed for internal (%s)", internal_name); | "jack_controller_load_internal failed for internal (%s)", internal_name); | ||||
} | } | ||||
} | } | ||||
else if (strcmp (call->method_name, "AddSlave") == 0) | |||||
else if (strcmp (call->method_name, "AddSlaveDriver") == 0) | |||||
{ | { | ||||
const char *driver_name; | const char *driver_name; | ||||
if (controller_ptr->started) | |||||
{ | |||||
goto fail_started; | |||||
} | |||||
if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID)) | if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID)) | ||||
{ | { | ||||
/* The method call had invalid arguments meaning that | /* The method call had invalid arguments meaning that | ||||
@@ -241,17 +246,22 @@ jack_control_run_method( | |||||
goto exit; | goto exit; | ||||
} | } | ||||
if (!jack_controller_add_slave(controller_ptr, driver_name)) { | |||||
if (!jack_controller_add_slave_driver(controller_ptr, driver_name)) { | |||||
jack_dbus_error( | jack_dbus_error( | ||||
call, | call, | ||||
JACK_DBUS_ERROR_GENERIC, | JACK_DBUS_ERROR_GENERIC, | ||||
"jack_controller_add_slave failed for driver (%s)", driver_name); | |||||
"jack_controller_add_slave_driver failed for driver (%s)", driver_name); | |||||
} | } | ||||
} | } | ||||
else if (strcmp (call->method_name, "RemoveSlave") == 0) | |||||
else if (strcmp (call->method_name, "RemoveSlaveDriver") == 0) | |||||
{ | { | ||||
const char *driver_name; | const char *driver_name; | ||||
if (controller_ptr->started) | |||||
{ | |||||
goto fail_started; | |||||
} | |||||
if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID)) | if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID)) | ||||
{ | { | ||||
/* The method call had invalid arguments meaning that | /* The method call had invalid arguments meaning that | ||||
@@ -260,11 +270,11 @@ jack_control_run_method( | |||||
goto exit; | goto exit; | ||||
} | } | ||||
if (!jack_controller_remove_slave(controller_ptr, driver_name)) { | |||||
if (!jack_controller_remove_slave_driver(controller_ptr, driver_name)) { | |||||
jack_dbus_error( | jack_dbus_error( | ||||
call, | call, | ||||
JACK_DBUS_ERROR_GENERIC, | JACK_DBUS_ERROR_GENERIC, | ||||
"jack_controller_remove_slave failed for driver (%s)", driver_name); | |||||
"jack_controller_remove_slave_driver failed for driver (%s)", driver_name); | |||||
} | } | ||||
} | } | ||||
else if (strcmp (call->method_name, "UnloadInternal") == 0) | else if (strcmp (call->method_name, "UnloadInternal") == 0) | ||||
@@ -293,8 +303,7 @@ jack_control_run_method( | |||||
} | } | ||||
jack_dbus_construct_method_return_single(call, type, arg); | jack_dbus_construct_method_return_single(call, type, arg); | ||||
return true; | |||||
goto exit; | |||||
not_started: | not_started: | ||||
jack_dbus_only_error( | jack_dbus_only_error( | ||||
@@ -302,6 +311,15 @@ not_started: | |||||
JACK_DBUS_ERROR_SERVER_NOT_RUNNING, | JACK_DBUS_ERROR_SERVER_NOT_RUNNING, | ||||
"Can't execute method '%s' with stopped JACK server", | "Can't execute method '%s' with stopped JACK server", | ||||
call->method_name); | call->method_name); | ||||
goto exit; | |||||
fail_started: | |||||
jack_dbus_only_error( | |||||
call, | |||||
JACK_DBUS_ERROR_SERVER_RUNNING, | |||||
"Can't execute method '%s' with started JACK server", | |||||
call->method_name); | |||||
goto exit; | |||||
exit: | exit: | ||||
return true; | return true; | ||||
@@ -361,12 +379,12 @@ JACK_DBUS_METHOD_ARGUMENTS_BEGIN(UnloadInternal) | |||||
JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | ||||
JACK_DBUS_METHOD_ARGUMENTS_END | JACK_DBUS_METHOD_ARGUMENTS_END | ||||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(AddSlave) | |||||
JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | |||||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(AddSlaveDriver) | |||||
JACK_DBUS_METHOD_ARGUMENT("driver_name", "s", false) | |||||
JACK_DBUS_METHOD_ARGUMENTS_END | JACK_DBUS_METHOD_ARGUMENTS_END | ||||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(RemoveSlave) | |||||
JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | |||||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(RemoveSlaveDriver) | |||||
JACK_DBUS_METHOD_ARGUMENT("driver_name", "s", false) | |||||
JACK_DBUS_METHOD_ARGUMENTS_END | JACK_DBUS_METHOD_ARGUMENTS_END | ||||
JACK_DBUS_METHODS_BEGIN | JACK_DBUS_METHODS_BEGIN | ||||
@@ -384,8 +402,8 @@ JACK_DBUS_METHODS_BEGIN | |||||
JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | ||||
JACK_DBUS_METHOD_DESCRIBE(LoadInternal, NULL) | JACK_DBUS_METHOD_DESCRIBE(LoadInternal, NULL) | ||||
JACK_DBUS_METHOD_DESCRIBE(UnloadInternal, NULL) | JACK_DBUS_METHOD_DESCRIBE(UnloadInternal, NULL) | ||||
JACK_DBUS_METHOD_DESCRIBE(AddSlave, NULL) | |||||
JACK_DBUS_METHOD_DESCRIBE(RemoveSlave, NULL) | |||||
JACK_DBUS_METHOD_DESCRIBE(AddSlaveDriver, NULL) | |||||
JACK_DBUS_METHOD_DESCRIBE(RemoveSlaveDriver, NULL) | |||||
JACK_DBUS_METHODS_END | JACK_DBUS_METHODS_END | ||||
JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted) | JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted) | ||||
@@ -26,6 +26,14 @@ | |||||
#include "jack/control.h" | #include "jack/control.h" | ||||
#include "jack/jack.h" | #include "jack/jack.h" | ||||
#include "jackdbus.h" | #include "jackdbus.h" | ||||
#include "list.h" | |||||
struct jack_controller_slave_driver | |||||
{ | |||||
struct list_head siblings; | |||||
char * name; | |||||
jackctl_driver_t * handle; | |||||
}; | |||||
struct jack_controller | struct jack_controller | ||||
{ | { | ||||
@@ -45,6 +53,7 @@ struct jack_controller | |||||
jackctl_driver_t *driver; | jackctl_driver_t *driver; | ||||
bool driver_set; /* whether driver is manually set, if false - DEFAULT_DRIVER is auto set */ | bool driver_set; /* whether driver is manually set, if false - DEFAULT_DRIVER is auto set */ | ||||
struct list_head slave_drivers; | |||||
struct jack_dbus_object_descriptor dbus_descriptor; | struct jack_dbus_object_descriptor dbus_descriptor; | ||||
}; | }; | ||||
@@ -87,12 +96,12 @@ jack_controller_switch_master( | |||||
void *dbus_call_context_ptr); | void *dbus_call_context_ptr); | ||||
bool | bool | ||||
jack_controller_add_slave( | |||||
jack_controller_add_slave_driver( | |||||
struct jack_controller *controller_ptr, | struct jack_controller *controller_ptr, | ||||
const char * driver_name); | const char * driver_name); | ||||
bool | bool | ||||
jack_controller_remove_slave( | |||||
jack_controller_remove_slave_driver( | |||||
struct jack_controller *controller_ptr, | struct jack_controller *controller_ptr, | ||||
const char * driver_name); | const char * driver_name); | ||||
@@ -46,6 +46,7 @@ jack_controller_settings_uninit(); | |||||
#define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod" | #define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod" | ||||
#define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning" | #define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning" | ||||
#define JACK_DBUS_ERROR_SERVER_RUNNING "org.jackaudio.Error.ServerRunning" | |||||
#define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver" | #define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver" | ||||
#define JACK_DBUS_ERROR_UNKNOWN_INTERNAL "org.jackaudio.Error.UnknownInternal" | #define JACK_DBUS_ERROR_UNKNOWN_INTERNAL "org.jackaudio.Error.UnknownInternal" | ||||
#define JACK_DBUS_ERROR_UNKNOWN_PARAMETER "org.jackaudio.Error.UnknownParameter" | #define JACK_DBUS_ERROR_UNKNOWN_PARAMETER "org.jackaudio.Error.UnknownParameter" | ||||
@@ -116,6 +116,8 @@ def main(): | |||||
print " dp - get parameters of currently selected driver" | print " dp - get parameters of currently selected driver" | ||||
print " dpd <param> - get long description for driver parameter" | print " dpd <param> - get long description for driver parameter" | ||||
print " dps <param> <value> - set driver parameter" | print " dps <param> <value> - set driver parameter" | ||||
print " asd <driver> - add slave driver" | |||||
print " rsd <driver> - remove slave driver" | |||||
print " il - get list of available internals" | print " il - get list of available internals" | ||||
print " ip <name> - get parameters of given internal" | print " ip <name> - get parameters of given internal" | ||||
print " ipd <name> <param> - get long description for internal parameter" | print " ipd <name> <param> - get long description for internal parameter" | ||||
@@ -305,6 +307,26 @@ def main(): | |||||
name = sys.argv[index] | name = sys.argv[index] | ||||
index += 1 | index += 1 | ||||
result = control_iface.UnloadInternal(name) | result = control_iface.UnloadInternal(name) | ||||
elif arg == 'asd': | |||||
print "--- add slave driver" | |||||
if index >= len(sys.argv): | |||||
print "add slave driver command requires driver name argument" | |||||
sys.exit() | |||||
name = sys.argv[index] | |||||
index += 1 | |||||
result = control_iface.AddSlaveDriver(name) | |||||
elif arg == 'rsd': | |||||
print "--- remove slave driver" | |||||
if index >= len(sys.argv): | |||||
print "remove slave driver command requires driver name argument" | |||||
sys.exit() | |||||
name = sys.argv[index] | |||||
index += 1 | |||||
result = control_iface.RemoveSlaveDriver(name) | |||||
else: | else: | ||||
print "Unknown command '%s'" % arg | print "Unknown command '%s'" % arg | ||||
except dbus.DBusException, e: | except dbus.DBusException, e: | ||||