Separate pre-roll cycle calculation
This is also needed when exporting.
This commit is contained in:
parent
6fd27f89b3
commit
1f6686c2a0
|
@ -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); }
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue