diff options
author | torben <torben@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2011-05-29 00:47:00 +0000 |
---|---|---|
committer | torben <torben@0c269be4-1314-0410-8aa9-9f06e86f4224> | 2011-05-29 00:47:00 +0000 |
commit | 42d0bd99f384b6336163b441c76e0ba9d79c825a (patch) | |
tree | e46b6916b60418f6421344421809bf5fa1d78cd1 | |
parent | da26d33e14214b5d192acdc5c80a2d9b2e258656 (diff) | |
download | jack1-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.c | 27 |
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; |