Separate pre-roll cycle calculation

This is also needed when exporting.
This commit is contained in:
Robin Gareus 2020-03-05 20:47:19 +01:00
parent 6fd27f89b3
commit 1f6686c2a0
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 25 additions and 15 deletions

View File

@ -1345,6 +1345,8 @@ private:
void process_export (pframes_t);
void process_export_fw (pframes_t);
samplecnt_t calc_preroll_subcycle (samplecnt_t) const;
void block_processing() { g_atomic_int_set (&processing_prohibited, 1); }
void unblock_processing() { g_atomic_int_set (&processing_prohibited, 0); }
bool processing_blocked() const { return g_atomic_int_get (&processing_prohibited); }

View File

@ -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<RouteList> 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<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));
}
}
/* process until next route in-point */
ns = calc_preroll_subcycle (ns);
if (_count_in_samples > 0) {
run_click (_transport_sample - _count_in_samples, ns);