Don't add standard processors twice to routes from 2.X sessions. Fixes #3434.
[ardour.git] / libs / ardour / delivery.cc
index a1aa968a040b5cbc05b292e5d800d2d7333b014f..e93e550308cd176e90d94942e2832d2f6fa20c64 100644 (file)
@@ -137,7 +137,8 @@ Delivery::can_support_io_configuration (const ChanCount& in, ChanCount& out) con
 
                if (_output) {
                        if (_output->n_ports() != ChanCount::ZERO) {
-                               out = _output->n_ports();
+                               /* increase number of output ports if the processor chain requires it */
+                               out = ChanCount::max (_output->n_ports(), in);
                                return true;
                        } else {
                                /* not configured yet - we will passthru */
@@ -189,8 +190,7 @@ Delivery::configure_io (ChanCount in, ChanCount out)
                if (_output) {
                        if (_output->n_ports() != out) {
                                if (_output->n_ports() != ChanCount::ZERO) {
-                                       fatal << _name << " programming error: configure_io with nports = " << _output->n_ports() << " called with " << in << " and " << out << " with " << _output->n_ports() << " output ports" << endmsg;
-                                       /*NOTREACHED*/
+                                       _output->ensure_io (out, false, this);
                                } else {
                                        /* I/O not yet configured */
                                }
@@ -209,8 +209,9 @@ Delivery::configure_io (ChanCount in, ChanCount out)
                                }
                        }
                }
-       }
 
+       }
+       
        if (!Processor::configure_io (in, out)) {
                return false;
        }
@@ -221,7 +222,7 @@ Delivery::configure_io (ChanCount in, ChanCount out)
 }
 
 void
-Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes, bool result_required)
+Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, nframes_t nframes, bool result_required)
 {
        assert (_output);
 
@@ -418,50 +419,49 @@ Delivery::reset_panners ()
 
 
 void
-Delivery::start_pan_touch (uint32_t which)
+Delivery::start_pan_touch (uint32_t which, double when)
 {
        if (which < _panner->npanners()) {
-               _panner->pan_control(which)->start_touch();
+               _panner->pan_control(which)->start_touch(when);
        }
 }
 
 void
-Delivery::end_pan_touch (uint32_t which)
+Delivery::end_pan_touch (uint32_t which, bool mark, double when)
 {
        if (which < _panner->npanners()) {
-               _panner->pan_control(which)->stop_touch();
+               _panner->pan_control(which)->stop_touch(mark, when);
        }
 
 }
 
-void
-Delivery::transport_stopped (sframes_t frame)
-{
-       _panner->transport_stopped (frame);
-}
 
 void
-Delivery::flush (nframes_t nframes, nframes64_t time)
+Delivery::flush_buffers (nframes_t nframes, nframes64_t time)
 {
        /* io_lock, not taken: function must be called from Session::process() calltree */
 
        PortSet& ports (_output->ports());
-
+        
        for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
                (*i).flush_buffers (nframes, time, _output_offset);
        }
 }
 
 void
-Delivery::transport_stopped ()
+Delivery::transport_stopped (framepos_t now)
 {
-       /* turn off any notes that are on */
+        Processor::transport_stopped (now);
 
-       PortSet& ports (_output->ports());
+       _panner->transport_stopped (now);
 
-       for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
-               (*i).transport_stopped ();
-       }
+        if (_output) {
+                PortSet& ports (_output->ports());
+                
+                for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) {
+                        (*i).transport_stopped ();
+                }
+        }
 }
 
 gain_t
@@ -481,9 +481,7 @@ Delivery::target_gain ()
                return 0.0;
        }
 
-       gain_t desired_gain = -1.0f;
-
-        MuteMaster::MutePoint mp;
+        MuteMaster::MutePoint mp = MuteMaster::Main; // stupid gcc uninit warning
         
         switch (_role) {
         case Main:
@@ -495,13 +493,15 @@ Delivery::target_gain ()
         case Send:
         case Insert:
         case Aux:
-                /* XXX FIX ME this is wrong, we need per-delivery muting */
-                mp = MuteMaster::PreFader;
+               if (_pre_fader) {
+                       mp = MuteMaster::PreFader;
+               } else {
+                       mp = MuteMaster::PostFader;
+               }
                 break;
         }
 
-        //cerr << name() << ' ';
-        desired_gain = _mute_master->mute_gain_at (mp);
+        gain_t desired_gain = _mute_master->mute_gain_at (mp);
         
         if (_role == Listen && _session.monitor_out() && !_session.listening()) {
                 
@@ -538,7 +538,7 @@ Delivery::set_name (const std::string& name)
 void
 Delivery::output_changed (IOChange change, void* /*src*/)
 {
-       if (change & ARDOUR::ConfigurationChanged) {
+       if (change.type & IOChange::ConfigurationChanged) {
                reset_panner ();
        }
 }