X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fgraph.cc;h=cb0fa1b21ae28b8d45ea3aaab7af32f522f525d0;hb=9cb678ebcc2ca0c7993bdd182c9e6ad1f8adf09a;hp=99fc52453449d03d1e26dec4a4b338f84b5fd280;hpb=d4bab8aeed61d7de331d5fb10230de78edfd423b;p=ardour.git diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc index 99fc524534..cb0fa1b21a 100644 --- a/libs/ardour/graph.cc +++ b/libs/ardour/graph.cc @@ -77,28 +77,21 @@ Graph::Graph (Session & session) reset_thread_list (); - Config->ParameterChanged.connect_same_thread (processor_usage_connection, boost::bind (&Graph::parameter_changed, this, _1)); - #ifdef DEBUG_RT_ALLOC graph = this; pbd_alloc_allowed = &::alloc_allowed; #endif } -void -Graph::parameter_changed (std::string param) -{ - if (param == X_("processor-usage")) { - reset_thread_list (); - } -} - /** Set up threads for running the graph */ void Graph::reset_thread_list () { uint32_t num_threads = how_many_dsp_threads (); + /* For now, we shouldn't be using the graph code if we only have 1 DSP thread */ + assert (num_threads > 1); + /* don't bother doing anything here if we already have the right number of threads. */ @@ -107,31 +100,25 @@ Graph::reset_thread_list () return; } - Glib::Mutex::Lock lm (_session.engine().process_lock()); + Glib::Threads::Mutex::Lock lm (_session.engine().process_lock()); pthread_t a_thread; if (!_thread_list.empty()) { drop_threads (); } -#if 0 - /* XXX this only makes sense when we can use just the AudioEngine thread - and still keep the graph current with the route list - */ - if (num_threads <= 1) { - /* no point creating 1 thread - the AudioEngine already gives us one - */ - return; - } -#endif - if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this), &a_thread, 100000) == 0) { - _thread_list.push_back (a_thread); + if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this), &a_thread, 100000) != 0) { + throw failed_constructor (); } + _thread_list.push_back (a_thread); + for (uint32_t i = 1; i < num_threads; ++i) { - if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this), &a_thread, 100000) == 0) { - _thread_list.push_back (a_thread); + if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this), &a_thread, 100000) != 0) { + throw failed_constructor (); } + + _thread_list.push_back (a_thread); } } @@ -174,7 +161,7 @@ Graph::drop_threads () void Graph::clear_other_chain () { - Glib::Mutex::Lock ls (_swap_mutex); + Glib::Threads::Mutex::Lock ls (_swap_mutex); while (1) { if (_setup_chain != _pending_chain) { @@ -233,7 +220,9 @@ Graph::prep() void Graph::trigger (GraphNode* n) { + pthread_mutex_lock (&_trigger_mutex); _trigger_queue.push_back (n); + pthread_mutex_unlock (&_trigger_mutex); } /** Called when a node at the `output' end of the chain (ie one that has no-one to feed) @@ -285,7 +274,7 @@ Graph::restart_cycle() void Graph::rechain (boost::shared_ptr routelist, GraphEdges const & edges) { - Glib::Mutex::Lock ls (_swap_mutex); + Glib::Threads::Mutex::Lock ls (_swap_mutex); int chain = _setup_chain; DEBUG_TRACE (DEBUG::Graph, string_compose ("============== setup %1\n", chain)); @@ -595,10 +584,10 @@ Graph::process_one_route (Route* route) bool Graph::in_process_thread () const { - list::const_iterator i = _thread_list.begin (); - while (i != _thread_list.end() && *i != pthread_self ()) { - ++i; + for (list::const_iterator i = _thread_list.begin (); i != _thread_list.end(); ++i) { + if (*i == pthread_self()) { + return true; + } } - - return i != _thread_list.end (); + return false; }