[3.0P] dont dump chain(1) in session.cc
[ardour.git] / libs / ardour / route.cc
index 86b4b89d167cb04055efcca75e0fb67a05981c4e..4dcdcf1898a621d4a2018c08386e1565a4a82f24 100644 (file)
@@ -58,6 +58,7 @@
 #include "ardour/session.h"
 #include "ardour/timestamps.h"
 #include "ardour/utils.h"
+#include "ardour/graph.h"
 
 #include "i18n.h"
 
@@ -72,6 +73,7 @@ PBD::Signal0<void> Route::RemoteControlIDChange;
 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
        : SessionObject (sess, name)
        , AutomatableControls (sess)
+       , GraphNode( sess.route_graph )
         , _active (true)
         , _initial_delay (0)
         , _roll_delay (0)
@@ -448,25 +450,17 @@ Route::process_output_buffers (BufferSet& bufs,
           and go ....
           ----------------------------------------------------------------------------------------- */
 
-       Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
-
-       if (rm.locked()) {
-                //cerr << name() << " upstream solo " << _soloed_by_others_upstream
-                // << " downstream solo " << _soloed_by_others_downstream
-                // << " self " << _self_solo
-                //<< endl;
-               for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-
-                       if (bufs.count() != (*i)->input_streams()) {
-                               cerr << _name << " bufs = " << bufs.count()
-                                    << " input for " << (*i)->name() << " = " << (*i)->input_streams()
-                                    << endl;
-                       }
-                       assert (bufs.count() == (*i)->input_streams());
+       for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
 
-                       (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
-                       bufs.set_count ((*i)->output_streams());
+               if (bufs.count() != (*i)->input_streams()) {
+                       cerr << _name << " bufs = " << bufs.count()
+                            << " input for " << (*i)->name() << " = " << (*i)->input_streams()
+                            << endl;
                }
+               assert (bufs.count() == (*i)->input_streams());
+               
+               (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
+               bufs.set_count ((*i)->output_streams());
        }
 }
 
@@ -486,7 +480,7 @@ Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
        assert (bufs.available() >= input_streams());
 
        if (_input->n_ports() == ChanCount::ZERO) {
-               silence (nframes);
+               silence_unlocked (nframes);
        }
 
        bufs.set_count (input_streams());
@@ -748,7 +742,7 @@ Route::set_mute_points (MuteMaster::MutePoint mp)
         _mute_master->set_mute_points (mp);
         mute_points_changed (); /* EMIT SIGNAL */
         
-        if (_mute_master->muted()) {
+        if (_mute_master->muted_by_self()) {
                 mute_changed (this); /* EMIT SIGNAL */
         }
 }
@@ -762,7 +756,7 @@ Route::set_mute (bool yn, void *src)
        }
 
        if (muted() != yn) {
-                _mute_master->set_muted (yn);
+                _mute_master->set_muted_by_self (yn);
                mute_changed (src); /* EMIT SIGNAL */
        }
 }
@@ -770,7 +764,7 @@ Route::set_mute (bool yn, void *src)
 bool
 Route::muted () const
 {
-        return _mute_master->muted();
+        return _mute_master->muted_by_self();
 }
 
 #if 0
@@ -1460,18 +1454,16 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
        uint32_t index = 0;
 
        DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configure processors\n", _name));
-#ifndef NDEBUG
        DEBUG_TRACE (DEBUG::Processors, "{\n");
        for (list<boost::shared_ptr<Processor> >::const_iterator p = _processors.begin(); p != _processors.end(); ++p) {
                DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 ID = %2\n", (*p)->name(), (*p)->id()));
        }
        DEBUG_TRACE (DEBUG::Processors, "}\n");
-#endif
 
        for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
 
                if ((*p)->can_support_io_configuration(in, out)) {
-                       DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1in = %2 out = %3\n",(*p)->name(), in, out));
+                       DEBUG_TRACE (DEBUG::Processors, string_compose ("\t%1 in = %2 out = %3\n",(*p)->name(), in, out));
                        configuration.push_back(make_pair(in, out));
                        in = out;
                } else {
@@ -1504,6 +1496,8 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
                _session.ensure_buffers (n_process_buffers ());
        }
 
+       DEBUG_TRACE (DEBUG::Processors, string_compose ("%1: configuration complete\n", _name));
+
        _in_configure_processors = false;
        return 0;
 }
@@ -2326,31 +2320,37 @@ Route::curve_reallocate ()
 void
 Route::silence (nframes_t nframes)
 {
-       if (!_silent) {
-
-               _output->silence (nframes);
-
-               {
-                       Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
+       Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
+       if (!lm.locked()) {
+               return;
+       }
 
-                       if (lm.locked()) {
-                               for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-                                       boost::shared_ptr<PluginInsert> pi;
+       silence_unlocked (nframes);
+}
 
-                                       if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
-                                               // skip plugins, they don't need anything when we're not active
-                                               continue;
-                                       }
+void
+Route::silence_unlocked (nframes_t nframes)
+{
+       /* Must be called with the processor lock held */
+       
+       if (!_silent) {
 
-                                       (*i)->silence (nframes);
-                               }
+               _output->silence (nframes);
 
-                               if (nframes == _session.get_block_size()) {
-                                       // _silent = true;
-                               }
+               for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+                       boost::shared_ptr<PluginInsert> pi;
+                       
+                       if (!_active && (pi = boost::dynamic_pointer_cast<PluginInsert> (*i)) != 0) {
+                               // skip plugins, they don't need anything when we're not active
+                               continue;
                        }
+                       
+                       (*i)->silence (nframes);
+               }
+               
+               if (nframes == _session.get_block_size()) {
+                       // _silent = true;
                }
-
        }
 }
 
@@ -2646,12 +2646,17 @@ int
 Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
                bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
 {
+       Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
+       if (!lm.locked()) {
+               return 0;
+       }
+
        if (n_outputs().n_total() == 0) {
                return 0;
        }
 
        if (!_active || n_inputs() == ChanCount::ZERO)  {
-               silence (nframes);
+               silence_unlocked (nframes);
                return 0;
        }
        if (session_state_changing) {
@@ -2661,7 +2666,7 @@ Route::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
                           
                           XXX note the absurdity of ::no_roll() being called when we ARE rolling!
                        */
-                       silence (nframes);
+                       silence_unlocked (nframes);
                        return 0;
                }
                /* we're really not rolling, so we're either delivery silence or actually
@@ -2681,14 +2686,14 @@ Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
        if (_roll_delay > nframes) {
 
                _roll_delay -= nframes;
-               silence (nframes);
+               silence_unlocked (nframes);
                /* transport frame is not legal for caller to use */
                return 0;
 
        } else if (_roll_delay > 0) {
 
                nframes -= _roll_delay;
-               silence (_roll_delay);
+               silence_unlocked (_roll_delay);
                /* we've written _roll_delay of samples into the
                   output ports, so make a note of that for
                   future reference.
@@ -2706,22 +2711,19 @@ int
 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
             bool /*can_record*/, bool /*rec_monitors_input*/, bool& /* need_butler */)
 {
-       {
-               // automation snapshot can also be called from the non-rt context
-               // and it uses the processor list, so we try to acquire the lock here
-               Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
-
-               if (lm.locked()) {
-                       automation_snapshot (_session.transport_frame(), false);
-               }
+       Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
+       if (!lm.locked()) {
+               return 0;
        }
+       
+       automation_snapshot (_session.transport_frame(), false);
 
        if (n_outputs().n_total() == 0) {
                return 0;
        }
 
        if (!_active || n_inputs().n_total() == 0) {
-               silence (nframes);
+               silence_unlocked (nframes);
                return 0;
        }