summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2016-06-20 00:06:56 +1000
committernick_m <mainsbridge@gmail.com>2016-07-10 02:18:36 +1000
commitc6f2095fb7a7ca47e3980899aafc6aa85c0fcd9a (patch)
tree9140751ef4ee8576e4d796a5af47ffed86b41eec
parent6b0eadc62f75e2b8df5d7426acc422741800c667 (diff)
Improve the performance of TempoMap::frame_at_beat ().
- should be a no-op
-rw-r--r--libs/ardour/tempo.cc27
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);
}