Fix crash on relayering.
[ardour.git] / libs / ardour / route.cc
index 216c199041295a40bd89ea1d736f25b2fc56029b..1cb7b84bc972012df1ab89348e86cf3007083176 100644 (file)
@@ -321,7 +321,7 @@ Route::set_gain (gain_t val, void *src)
 void
 Route::process_output_buffers (BufferSet& bufs,
                               sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
-                              bool with_processors, int declick)
+                              bool /*with_processors*/, int declick)
 {
        bool monitor;
 
@@ -420,7 +420,12 @@ Route::process_output_buffers (BufferSet& bufs,
 
        if (rm.locked()) {
                for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
-                       bufs.set_count (ChanCount::max(bufs.count(), (*i)->input_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);
                        bufs.set_count (ChanCount::max(bufs.count(), (*i)->output_streams()));
                }
@@ -474,13 +479,16 @@ Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
                }
        }
 
+       write_out_of_band_data (bufs, start_frame, end_frame, nframes);
        process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
 }
 
 void
 Route::passthru_silence (sframes_t start_frame, sframes_t end_frame, nframes_t nframes, int declick)
 {
-       process_output_buffers (_session.get_silent_buffers (n_process_buffers()), start_frame, end_frame, nframes, true, declick);
+       BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
+       write_out_of_band_data (bufs, start_frame, end_frame, nframes);
+       process_output_buffers (bufs, start_frame, end_frame, nframes, true, declick);
 }
 
 void
@@ -694,8 +702,8 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite
                        
                }
                
-               // XXX: do we want to emit the signal here ? change call order.
-               if (!boost::dynamic_pointer_cast<InternalSend>(processor)) {
+               if (_control_outs != processor) {
+                       // XXX: do we want to emit the signal here ? change call order.
                        processor->activate ();
                }
                processor->ActiveChanged.connect (bind (mem_fun (_session, &Session::update_latency_compensation), false, false));
@@ -762,10 +770,6 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter
                                        return true;
                                }
                                        
-                       } else if (prop->value() == "listen" || prop->value() == "deliver") {
-
-                               /* XXX need to generalize */
-
                        } else if (prop->value() == "intsend") {
 
                                processor.reset (new InternalSend (_session, _mute_master, node));
@@ -797,6 +801,7 @@ Route::add_processor_from_xml (const XMLNode& node, ProcessorList::iterator iter
 
                        } else {
                                error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
+                               return false;
                        }
                                
                        if (iter == _processors.end() && processor->visible() && !_processors.empty()) {
@@ -1600,7 +1605,7 @@ Route::set_state (const XMLNode& node)
 }
 
 int
-Route::_set_state (const XMLNode& node, bool call_base)
+Route::_set_state (const XMLNode& node, bool /*call_base*/)
 {
 
        XMLNodeList nlist;
@@ -1959,7 +1964,7 @@ Route::release_return_buffer () const
 }
 
 int
-Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool active, bool aux)
+Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*active*/, bool aux)
 {
        vector<string> ports;
        vector<string>::const_iterator i;
@@ -2104,7 +2109,7 @@ Route::feeds (boost::shared_ptr<Route> other)
 }
 
 void
-Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
+Route::handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
 {
        nframes_t now = _session.transport_frame();
 
@@ -2130,7 +2135,7 @@ Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_f
 }
 
 void
-Route::input_change_handler (IOChange change, void *src)
+Route::input_change_handler (IOChange change, void * /*src*/)
 {
        if ((change & ConfigurationChanged)) {
                configure_processors (0);
@@ -2138,7 +2143,7 @@ Route::input_change_handler (IOChange change, void *src)
 }
 
 void
-Route::output_change_handler (IOChange change, void *src)
+Route::output_change_handler (IOChange change, void * /*src*/)
 {
        if ((change & ConfigurationChanged)) {
                
@@ -2160,7 +2165,7 @@ Route::pans_required () const
 
 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)
+               bool session_state_changing, bool /*can_record*/, bool /*rec_monitors_input*/)
 {
        if (n_outputs().n_total() == 0) {
                return 0;
@@ -2206,7 +2211,7 @@ Route::check_initial_delay (nframes_t nframes, nframes_t& transport_frame)
 
 int
 Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int declick,
-            bool can_record, bool rec_monitors_input)
+            bool /*can_record*/, bool /*rec_monitors_input*/)
 {
        {
                // automation snapshot can also be called from the non-rt context
@@ -2241,8 +2246,8 @@ Route::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, int
 }
 
 int
-Route::silent_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame
-                   bool can_record, bool rec_monitors_input)
+Route::silent_roll (nframes_t nframes, sframes_t /*start_frame*/, sframes_t /*end_frame*/
+                   bool /*can_record*/, bool /*rec_monitors_input*/)
 {
        silence (nframes);
        return 0;
@@ -2498,7 +2503,7 @@ Route::set_pending_declick (int declick)
  */
 
 void
-Route::shift (nframes64_t pos, nframes64_t frames)
+Route::shift (nframes64_t /*pos*/, nframes64_t /*frames*/)
 {
 #ifdef THIS_NEEDS_FIXING_FOR_V3
 
@@ -2649,7 +2654,22 @@ void
 Route::meter ()
 {
        Glib::RWLock::ReaderLock rm (_processor_lock, Glib::TRY_LOCK);
+
+       assert (_meter);
+
        _meter->meter ();
+
+       for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+
+               boost::shared_ptr<Send> s;
+               boost::shared_ptr<Return> r;
+
+               if ((s = boost::dynamic_pointer_cast<Send> (*i)) != 0) {
+                       s->meter()->meter();
+               } else if ((r = boost::dynamic_pointer_cast<Return> (*i)) != 0) {
+                       r->meter()->meter ();
+               }
+       }
 }
 
 boost::shared_ptr<Panner>