X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fgraph.cc;h=de2ec802df3283eeeadf403deeb759c08869968d;hb=8488d8f6a53d3385893a435481cb60ed21c21ea0;hp=d183bcd7d271e41bcfa839dd3a4c4d281111e9d1;hpb=e5888d398350b26ba2cdc634cc9791e90b4fc6b6;p=ardour.git diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index d183bcd7d2..de2ec802df 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -22,6 +22,7 @@ #include "pbd/compose.h" #include "pbd/debug_rt_alloc.h" +#include "pbd/pthread_utils.h" #include "ardour/debug.h" #include "ardour/graph.h" @@ -31,8 +32,6 @@ #include "ardour/process_thread.h" #include "ardour/audioengine.h" -#include - #include "i18n.h" using namespace ARDOUR; @@ -54,7 +53,7 @@ int alloc_allowed () Graph::Graph (Session & session) : SessionHandleRef (session) - , _quit_threads (false) + , _threads_active (false) , _execution_sem ("graph_execution", 0) , _callback_start_sem ("graph_start", 0) , _callback_done_sem ("graph_done", 0) @@ -72,9 +71,13 @@ Graph::Graph (Session & session) _current_chain = 0; _pending_chain = 0; _setup_chain = 1; - _quit_threads = false; _graph_empty = true; + + ARDOUR::AudioEngine::instance()->Running.connect_same_thread (engine_connections, boost::bind (&Graph::reset_thread_list, this)); + ARDOUR::AudioEngine::instance()->Stopped.connect_same_thread (engine_connections, boost::bind (&Graph::engine_stopped, this)); + ARDOUR::AudioEngine::instance()->Halted.connect_same_thread (engine_connections, boost::bind (&Graph::engine_stopped, this)); + reset_thread_list (); #ifdef DEBUG_RT_ALLOC @@ -83,6 +86,14 @@ Graph::Graph (Session & session) #endif } +void +Graph::engine_stopped () +{ + if (AudioEngine::instance()->process_thread_count() != 0) { + drop_threads (); + } +} + /** Set up threads for running the graph */ void Graph::reset_thread_list () @@ -115,6 +126,7 @@ Graph::reset_thread_list () throw failed_constructor (); } } + _threads_active = true; } void @@ -133,7 +145,7 @@ Graph::session_going_away() void Graph::drop_threads () { - _quit_threads = true; + _threads_active = false; uint32_t thread_count = AudioEngine::instance()->process_thread_count (); @@ -146,8 +158,6 @@ Graph::drop_threads () AudioEngine::instance()->join_process_threads (); _execution_tokens = 0; - - _quit_threads = false; } void @@ -244,7 +254,7 @@ Graph::restart_cycle() /* Block until the a process callback triggers us */ _callback_start_sem.wait(); - if (_quit_threads) { + if (!_threads_active) { return; } @@ -358,7 +368,7 @@ Graph::run_one() /* update the number of threads that will still be sleeping */ _execution_tokens -= wakeup; - DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 signals %2\n", pthread_self(), wakeup)); + DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 signals %2\n", pthread_name(), wakeup)); for (int i = 0; i < wakeup; i++) { _execution_sem.signal (); @@ -367,12 +377,12 @@ Graph::run_one() while (to_run == 0) { _execution_tokens += 1; pthread_mutex_unlock (&_trigger_mutex); - DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 goes to sleep\n", pthread_self())); + DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 goes to sleep\n", pthread_name())); _execution_sem.wait (); - if (_quit_threads) { + if (!_threads_active) { return true; } - DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 is awake\n", pthread_self())); + DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 is awake\n", pthread_name())); pthread_mutex_lock (&_trigger_mutex); if (_trigger_queue.size()) { to_run = _trigger_queue.back(); @@ -384,7 +394,7 @@ Graph::run_one() to_run->process(); to_run->finish (_current_chain); - DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 has finished run_one()\n", pthread_self())); + DEBUG_TRACE(DEBUG::ProcessThreads, string_compose ("%1 has finished run_one()\n", pthread_name())); return false; } @@ -422,13 +432,13 @@ Graph::main_thread() DEBUG_TRACE(DEBUG::ProcessThreads, "main thread is awake\n"); - if (_quit_threads) { + if (!_threads_active) { return; } prep (); - if (_graph_empty && !_quit_threads) { + if (_graph_empty && _threads_active) { _callback_done_sem.signal (); DEBUG_TRACE(DEBUG::ProcessThreads, "main thread sees graph done, goes back to sleep\n"); goto again; @@ -475,6 +485,8 @@ Graph::dump (int chain) int Graph::silent_process_routes (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool& need_butler) { + if (!_threads_active) return 0; + _process_nframes = nframes; _process_start_frame = start_frame; _process_end_frame = end_frame; @@ -500,6 +512,8 @@ Graph::process_routes (pframes_t nframes, framepos_t start_frame, framepos_t end { DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("graph execution from %1 to %2 = %3\n", start_frame, end_frame, nframes)); + if (!_threads_active) return 0; + _process_nframes = nframes; _process_start_frame = start_frame; _process_end_frame = end_frame; @@ -527,6 +541,8 @@ Graph::routes_no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end { DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("no-roll graph execution from %1 to %2 = %3\n", start_frame, end_frame, nframes)); + if (!_threads_active) return 0; + _process_nframes = nframes; _process_start_frame = start_frame; _process_end_frame = end_frame; @@ -552,7 +568,7 @@ Graph::process_one_route (Route* route) assert (route); - DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 runs route %2\n", pthread_self(), route->name())); + DEBUG_TRACE (DEBUG::ProcessThreads, string_compose ("%1 runs route %2\n", pthread_name(), route->name())); if (_process_silent) { retval = route->silent_roll (_process_nframes, _process_start_frame, _process_end_frame, need_butler);