13
0

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.
This commit is contained in:
Robin Gareus 2017-09-30 13:10:17 +02:00
parent 61f8e53b7e
commit 697d29cdc2
2 changed files with 19 additions and 28 deletions

View File

@ -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;

View File

@ -311,6 +311,22 @@ Session::process_with_events (pframes_t nframes)
ns = std::min ((samplecnt_t)nframes, _count_in_samples);
}
boost::shared_ptr<RouteList> r = routes.reader ();
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
samplecnt_t route_offset = (*i)->playback_latency ();
if (_remaining_latency_preroll > route_offset + ns) {
/* route will no-roll for complete pre-roll cycle */
continue;
}
if (_remaining_latency_preroll > route_offset) {
/* route may need partial no-roll and partial roll from
* (_transport_sample - _remaining_latency_preroll) .. +ns.
* shorten and split the cycle.
*/
ns = std::min (ns, (_remaining_latency_preroll - route_offset));
}
}
if (_count_in_samples > 0) {
run_click (_transport_sample - _count_in_samples, ns);
assert (_count_in_samples >= ns);