diff options
Diffstat (limited to 'libs/ardour/session_process.cc')
-rw-r--r-- | libs/ardour/session_process.cc | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 1674cd9a7a..ed5422cf07 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -292,18 +292,47 @@ Session::process_with_events (pframes_t nframes) process_event (ev); } - /* count in */ + /* only count-in when going to roll at speed 1.0 */ if (_transport_speed != 1.0 && _count_in_samples > 0) { _count_in_samples = 0; } + if (_transport_speed == 0.0) { + _remaining_latency_preroll = 0; + } + + assert (_count_in_samples == 0 || _remaining_latency_preroll == 0 || _count_in_samples == _remaining_latency_preroll); - if (_count_in_samples > 0) { - samplecnt_t ns = std::min ((samplecnt_t)nframes, _count_in_samples); + if (_count_in_samples > 0 || _remaining_latency_preroll > 0) { + samplecnt_t ns; + + if (_remaining_latency_preroll > 0) { + ns = std::min ((samplecnt_t)nframes, _remaining_latency_preroll); + } else { + ns = std::min ((samplecnt_t)nframes, _count_in_samples); + } + + if (_count_in_samples > 0) { + run_click (_transport_sample - _count_in_samples, ns); + assert (_count_in_samples >= ns); + _count_in_samples -= ns; + } - no_roll (ns); - run_click (_transport_sample - _count_in_samples, ns); + if (_remaining_latency_preroll > 0) { + if (_count_in_samples == 0) { + click (_transport_sample - _remaining_latency_preroll, ns); + } + if (process_routes (ns, session_needs_butler)) { + fail_roll (ns); + } + } else { + no_roll (ns); + } + + if (_remaining_latency_preroll > 0) { + assert (_remaining_latency_preroll >= ns); + _remaining_latency_preroll -= ns; + } - _count_in_samples -= ns; nframes -= ns; /* process events.. */ |