From 1f6686c2a0c8ecd5bdf7ae74c3f4775811197033 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 5 Mar 2020 20:47:19 +0100 Subject: Separate pre-roll cycle calculation This is also needed when exporting. --- libs/ardour/session_process.cc | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'libs/ardour/session_process.cc') diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index fef23107ca..720f1a7129 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -303,6 +303,27 @@ Session::compute_audible_delta (samplepos_t& pos_and_delta) const return true; } +samplecnt_t +Session::calc_preroll_subcycle (samplecnt_t ns) const +{ + boost::shared_ptr r = routes.reader (); + for (RouteList::const_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)); + } + } + return ns; +} + /** Process callback used when the auditioner is not active */ void Session::process_with_events (pframes_t nframes) @@ -358,21 +379,8 @@ Session::process_with_events (pframes_t nframes) ns = std::min ((samplecnt_t)nframes, _count_in_samples); } - boost::shared_ptr 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)); - } - } + /* process until next route in-point */ + ns = calc_preroll_subcycle (ns); if (_count_in_samples > 0) { run_click (_transport_sample - _count_in_samples, ns); -- cgit v1.2.3