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:
parent
61f8e53b7e
commit
697d29cdc2
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user