summaryrefslogtreecommitdiff
path: root/libs/ardour/route.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-09-30 13:10:17 +0200
committerRobin Gareus <robin@gareus.org>2017-09-30 13:10:17 +0200
commit697d29cdc2a59c698d2771f1dbec9a726a123843 (patch)
tree4c881401be9548227110b3f5974a57a5a958178e /libs/ardour/route.cc
parent61f8e53b7e88d961bffd1d8e3d4bb7cb5c7333cc (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.cc31
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;