diff options
author | nick_m <mainsbridge@gmail.com> | 2016-06-20 00:06:56 +1000 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-07-10 02:18:36 +1000 |
commit | c6f2095fb7a7ca47e3980899aafc6aa85c0fcd9a (patch) | |
tree | 9140751ef4ee8576e4d796a5af47ffed86b41eec | |
parent | 6b0eadc62f75e2b8df5d7426acc422741800c667 (diff) |
Improve the performance of TempoMap::frame_at_beat ().
- should be a no-op
-rw-r--r-- | libs/ardour/tempo.cc | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 5df06f7745..9613c1913f 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -1469,12 +1469,33 @@ TempoMap::frame_at_beat (const double& beat) const return frame_at_beat_locked (_metrics, beat); } -/* meter section based */ +/* meter & tempo section based */ framecnt_t TempoMap::frame_at_beat_locked (const Metrics& metrics, const double& beat) const { - const TempoSection* prev_t = &tempo_section_at_beat_locked (metrics, beat); - const MeterSection* prev_m = &meter_section_at_beat_locked (metrics, beat); + MeterSection* prev_m = 0; + TempoSection* prev_t = 0; + + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { + MeterSection* m; + if ((m = dynamic_cast<MeterSection*> (*i)) != 0) { + if (prev_m && m->beat() > beat) { + break; + } + prev_m = m; + } + } + + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { + TempoSection* t; + if ((t = dynamic_cast<TempoSection*> (*i)) != 0) { + if (prev_t && ((t->pulse() - prev_m->pulse()) * prev_m->note_divisor()) + prev_m->beat() > beat) { + break; + } + prev_t = t; + } + + } return prev_t->frame_at_pulse (((beat - prev_m->beat()) / prev_m->note_divisor()) + prev_m->pulse(), _frame_rate); } |