diff options
author | Robin Gareus <robin@gareus.org> | 2017-09-30 13:10:17 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-09-30 13:10:17 +0200 |
commit | 697d29cdc2a59c698d2771f1dbec9a726a123843 (patch) | |
tree | 4c881401be9548227110b3f5974a57a5a958178e /libs/ardour/route.cc | |
parent | 61f8e53b7e88d961bffd1d8e3d4bb7cb5c7333cc (diff) |
Fix thinko in 8139becb -- route split cycle
Individual Routes cannot split the process-cycle in no_roll(); roll()
by themselves. Each of the calls will flush output buffers (and offset
port-buffers). If a route feeds another route the inputs of the other
route will only see partial data.
Diffstat (limited to 'libs/ardour/route.cc')
-rw-r--r-- | libs/ardour/route.cc | 31 |
1 files changed, 3 insertions, 28 deletions
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 0aa69e91ec..f411631e9e 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -383,6 +383,8 @@ Route::process_output_buffers (BufferSet& bufs, */ bool run_disk_writer = false; if (_disk_writer && speed != 0) { + samplecnt_t latency_preroll = _session.remaining_latency_preroll (); + run_disk_writer = latency_preroll < nframes + (_signal_latency + _output->latency ()); if (end_sample - _disk_writer->input_latency () < _session.transport_sample ()) { run_disk_writer = true; } @@ -3728,38 +3730,11 @@ Route::latency_preroll (pframes_t nframes, samplepos_t& start_sample, samplepos_ return nframes; } - samplecnt_t route_offset = playback_latency (); - - if (latency_preroll > route_offset + nframes) { + if (latency_preroll > playback_latency ()) { no_roll_unlocked (nframes, start_sample - latency_preroll, end_sample - latency_preroll); return 0; } - if (latency_preroll > route_offset) { - - samplecnt_t skip = latency_preroll - route_offset; - no_roll_unlocked (skip, start_sample - latency_preroll, start_sample - latency_preroll + skip); - - if (nframes == skip) { - return 0; - } - - Glib::Threads::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 (skip); - } - } - _input->increment_port_buffer_offset (skip); - _output->increment_port_buffer_offset (skip); - - start_sample -= route_offset; - end_sample -= route_offset; - - return nframes - skip; - } - start_sample -= latency_preroll; end_sample -= latency_preroll; return nframes; |