summaryrefslogtreecommitdiff
path: root/libs/ardour/session_process.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/session_process.cc')
-rw-r--r--libs/ardour/session_process.cc41
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.. */