summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortorben <torben@0c269be4-1314-0410-8aa9-9f06e86f4224>2011-05-29 00:47:00 +0000
committertorben <torben@0c269be4-1314-0410-8aa9-9f06e86f4224>2011-05-29 00:47:00 +0000
commit42d0bd99f384b6336163b441c76e0ba9d79c825a (patch)
treee46b6916b60418f6421344421809bf5fa1d78cd1
parentda26d33e14214b5d192acdc5c80a2d9b2e258656 (diff)
downloadjack1-42d0bd99f384b6336163b441c76e0ba9d79c825a.tar.gz
[controlAPI] first implementation of jackctl_server_switch_master()
git-svn-id: svn+ssh://jackaudio.org/trunk/jack@4423 0c269be4-1314-0410-8aa9-9f06e86f4224
-rw-r--r--jackd/controlapi.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/jackd/controlapi.c b/jackd/controlapi.c
index b88b07c..b31fba8 100644
--- a/jackd/controlapi.c
+++ b/jackd/controlapi.c
@@ -1485,11 +1485,28 @@ bool jackctl_server_remove_slave(jackctl_server_t * server_ptr, jackctl_driver_t
bool jackctl_server_switch_master(jackctl_server_t * server_ptr, jackctl_driver_t * driver_ptr)
{
+ jack_driver_t *old_driver;
+
if (server_ptr->engine == NULL)
goto fail_nostart;
- server_ptr->engine->driver->stop( server_ptr->engine->driver );
+ old_driver = server_ptr->engine->driver;
+
+ if (old_driver)
+ {
+ old_driver->stop( old_driver );
+ old_driver->detach( old_driver, server_ptr->engine );
+
+ pthread_mutex_lock( &server_ptr->engine->request_lock );
+ jack_lock_graph (server_ptr->engine);
+ jack_remove_client( server_ptr->engine, old_driver->internal_client );
+ jack_unlock_graph (server_ptr->engine);
+ pthread_mutex_unlock( &server_ptr->engine->request_lock );
+
+ server_ptr->engine->driver = NULL;
+ jack_driver_unload( old_driver );
+ }
if (jack_engine_load_driver (server_ptr->engine, driver_ptr->desc_ptr, driver_ptr->set_parameters))
{
@@ -1497,6 +1514,7 @@ bool jackctl_server_switch_master(jackctl_server_t * server_ptr, jackctl_driver_
goto fail_nodriver;
}
+
if (server_ptr->engine->driver->start (server_ptr->engine->driver) != 0) {
jack_error ("cannot start driver");
goto fail_nostart;
@@ -1505,12 +1523,7 @@ bool jackctl_server_switch_master(jackctl_server_t * server_ptr, jackctl_driver_
return true;
fail_nodriver:
- jack_error ("could not initialise new driver, trying to reactivate the old one");
-
- if (server_ptr->engine->driver->start (server_ptr->engine->driver) != 0) {
- jack_error ("cannot restart driver");
- goto fail_nostart;
- }
+ jack_error ("could not initialise new driver, leaving without driver");
fail_nostart:
return false;