Tidy up PluginInsert's handling of how it chooses to map plugin IO to that of the...
[ardour.git] / libs / ardour / track.cc
index ade0871eb30ac6d7e0b6560e53a7c3bdd139048a..4f682085b2b19a82630213d9d88fac5a8130a9eb 100644 (file)
@@ -285,7 +285,7 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
 
 int
 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
-                   bool can_record, bool rec_monitors_input, bool& need_butler)
+                   bool can_record, bool& need_butler)
 {
        Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
        if (!lm.locked()) {
@@ -306,7 +306,7 @@ Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*
 
        silence (nframes);
 
-       return _diskstream->process (_session.transport_frame(), nframes, can_record, rec_monitors_input, need_butler);
+       return _diskstream->process (_session.transport_frame(), nframes, can_record, need_butler);
 }
 
 void
@@ -693,3 +693,40 @@ Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
                Amp::declick (bufs, nframes, declick);
        }
 }
+
+framecnt_t
+Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
+{
+       if (_roll_delay > nframes) {
+
+               _roll_delay -= nframes;
+               silence_unlocked (nframes);
+               /* transport frame is not legal for caller to use */
+               return 0;
+
+       } else if (_roll_delay > 0) {
+
+               nframes -= _roll_delay;
+               silence_unlocked (_roll_delay);
+               transport_frame += _roll_delay;
+
+               /* shuffle all the port buffers for things that lead "out" of this Route
+                  to reflect that we just wrote _roll_delay frames of silence.
+               */
+
+               Glib::RWLock::ReaderLock lm (_processor_lock);
+               for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+                       boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
+                       if (iop) {
+                               iop->increment_port_buffer_offset (_roll_delay);
+                       }
+               }
+               _output->increment_port_buffer_offset (_roll_delay);
+
+               _roll_delay = 0;
+
+       }
+
+       return nframes;
+}
+