diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-07-25 18:33:48 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-07-25 18:33:48 +0000 |
commit | d44c033d0fc476086d83e9a544d84789c29d1a2f (patch) | |
tree | 0c49e60062dd0858839be9239b77bd0adcc2e724 /libs | |
parent | 4a42a635e5271c72ab4da471a74c7e2f759f2550 (diff) |
stop resetting _jack to zero to avoid crashing stupidly
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3647 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/audioengine.cc | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index a0287ab696..b0a17fd193 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -86,6 +86,7 @@ AudioEngine::~AudioEngine () if (_running) { jack_client_close (_jack); + _jack = 0; } stop_metering_thread (); @@ -105,6 +106,11 @@ _thread_init_callback (void *arg) int AudioEngine::start () { + if (!_jack) { + error << _("AudioEngine::start() called while disconnected from JACK") << endmsg; + return -1; + } + if (!_running) { if (session) { @@ -163,17 +169,13 @@ AudioEngine::start () int AudioEngine::stop (bool forever) { - if (_running) { - _running = false; - stop_metering_thread (); + if (_jack) { if (forever) { - jack_client_t* foo = _jack; - _jack = 0; - jack_client_close (foo); + disconnect_from_jack (); } else { jack_deactivate (_jack); + Stopped(); /* EMIT SIGNAL */ } - Stopped(); /* EMIT SIGNAL */ } return _running ? -1 : 0; @@ -188,11 +190,13 @@ AudioEngine::get_sync_offset (nframes_t& offset) const jack_position_t pos; - (void) jack_transport_query (_jack, &pos); - - if (pos.valid & JackVideoFrameOffset) { - offset = pos.video_offset; - return true; + if (_jack) { + (void) jack_transport_query (_jack, &pos); + + if (pos.valid & JackVideoFrameOffset) { + offset = pos.video_offset; + return true; + } } #endif @@ -236,7 +240,7 @@ int AudioEngine::_xrun_callback (void *arg) { AudioEngine* ae = static_cast<AudioEngine*> (arg); - if (ae->jack()) { + if (ae->connected()) { ae->Xrun (); /* EMIT SIGNAL */ } return 0; @@ -246,7 +250,7 @@ int AudioEngine::_graph_order_callback (void *arg) { AudioEngine* ae = static_cast<AudioEngine*> (arg); - if (ae->jack()) { + if (ae->connected()) { ae->GraphReordered (); /* EMIT SIGNAL */ } return 0; @@ -803,7 +807,8 @@ AudioEngine::halted (void *arg) ae->_running = false; ae->_buffer_size = 0; ae->_frame_rate = 0; - ae->_jack = 0; + + cerr << "!!! HALTED !!!\n"; if (was_running) { ae->Halted(); /* EMIT SIGNAL */ @@ -921,13 +926,9 @@ AudioEngine::get_nth_physical_audio (uint32_t n, int flag) uint32_t i; string ret; - if (!_running || !_jack) { - if (!_has_run) { - fatal << _("get_nth_physical called before engine was started") << endmsg; - /*NOTREACHED*/ - } else { - return ""; - } + if (!_jack) { + fatal << _("get_nth_physical called before engine was connected") << endmsg; + /*NOTREACHED*/ } ports = jack_get_ports (_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|flag); @@ -955,20 +956,12 @@ AudioEngine::get_port_total_latency (const Port& port) /*NOTREACHED*/ } - if (!_running) { - if (!_has_run) { - fatal << _("get_port_total_latency() called before engine was started") << endmsg; - /*NOTREACHED*/ - } - } - return jack_port_get_total_latency (_jack, port._port); } void AudioEngine::transport_stop () { - // cerr << "tell JACK to stop\n"; if (_jack) { jack_transport_stop (_jack); } @@ -1112,7 +1105,7 @@ AudioEngine::connect_to_jack (string client_name) { jack_client_name = client_name; - if ((_jack = jack_client_new (client_name.c_str())) == NULL) { + if ((_jack = jack_client_new (client_name.c_str())) == 0) { return -1; } @@ -1124,29 +1117,36 @@ AudioEngine::connect_to_jack (string client_name) int AudioEngine::disconnect_from_jack () { - if (_jack == 0) { + if (!_jack) { return 0; } - jack_client_close (_jack); + + if (_running) { + stop_metering_thread (); + } + + { + Glib::Mutex::Lock lm (_process_lock); + jack_client_close (_jack); + _jack = 0; + } _buffer_size = 0; _frame_rate = 0; if (_running) { - stop_metering_thread (); _running = false; Stopped(); /* EMIT SIGNAL */ } - _jack = 0; return 0; } int AudioEngine::reconnect_to_jack () { - if (_jack) { + if (_running) { disconnect_from_jack (); /* XXX give jackd a chance */ Glib::usleep (250000); @@ -1272,7 +1272,9 @@ void AudioEngine::update_total_latencies () { #ifdef HAVE_JACK_RECOMPUTE_LATENCIES - jack_recompute_total_latencies (_jack); + if (_jack) { + jack_recompute_total_latencies (_jack); + } #endif } |