diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-01-05 17:31:24 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-01-05 17:31:24 +0000 |
commit | 3678b7c96246d8d78e23985fbc8cbdbc6d9e9127 (patch) | |
tree | f529f063f1cf9d3706a8e54e63ef6b12a5286cb3 /libs | |
parent | 63f77717d747f3664f9fde13e2ef7f05d4bc50fa (diff) |
make extending the tempo map O(N) in the section to be filled in, rather than O(N) in the overall length of the map, and clean up some other details
git-svn-id: svn://localhost/ardour2/branches/3.0@11166 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/tempo.h | 33 | ||||
-rw-r--r-- | libs/ardour/tempo.cc | 291 | ||||
-rw-r--r-- | libs/ardour/test/tempo_test.cc | 6 |
3 files changed, 191 insertions, 139 deletions
diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index e377b8fd72..7d9a9feb7d 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -204,27 +204,26 @@ class TempoMap : public PBD::StatefulDestructible struct BBTPoint { framepos_t frame; - const Meter* meter; - const Tempo* tempo; + const MeterSection* meter; + const TempoSection* tempo; uint32_t bar; uint32_t beat; + BBTPoint (const MeterSection& m, const TempoSection& t, framepos_t f, + uint32_t b, uint32_t e) + : frame (f), meter (&m), tempo (&t), bar (b), beat (e) {} + Timecode::BBT_Time bbt() const { return Timecode::BBT_Time (bar, beat, 0); } operator Timecode::BBT_Time() const { return bbt(); } operator framepos_t() const { return frame; } - bool is_bar() const { return beat == 1; } - - BBTPoint (const Meter& m, const Tempo& t, framepos_t f, - uint32_t b, uint32_t e) - : frame (f), meter (&m), tempo (&t), bar (b), beat (e) {} }; typedef std::vector<BBTPoint> BBTPointList; template<class T> void apply_with_metrics (T& obj, void (T::*method)(const Metrics&)) { Glib::RWLock::ReaderLock lm (lock); - (obj.*method)(*metrics); + (obj.*method)(metrics); } void map (BBTPointList::const_iterator&, BBTPointList::const_iterator&, @@ -299,37 +298,31 @@ class TempoMap : public PBD::StatefulDestructible static Tempo _default_tempo; static Meter _default_meter; - Metrics* metrics; + Metrics metrics; framecnt_t _frame_rate; - framepos_t last_bbt_when; - bool last_bbt_valid; - Timecode::BBT_Time last_bbt; mutable Glib::RWLock lock; - BBTPointList* _map; + BBTPointList _map; void recompute_map (bool reassign_tempo_bbt, framepos_t end = -1); + void extend_map (framepos_t end); void require_map_to (framepos_t pos); void require_map_to (const Timecode::BBT_Time&); + void _extend_map (TempoSection* tempo, MeterSection* meter, + Metrics::iterator next_metric, + Timecode::BBT_Time current, framepos_t current_frame, framepos_t end); BBTPointList::const_iterator bbt_before_or_at (framepos_t); BBTPointList::const_iterator bbt_before_or_at (const Timecode::BBT_Time&); BBTPointList::const_iterator bbt_after_or_at (framepos_t); framepos_t round_to_type (framepos_t fr, int dir, BBTPointType); - void bbt_time (framepos_t, Timecode::BBT_Time&, const BBTPointList::const_iterator&); - framecnt_t bbt_duration_at_unlocked (const Timecode::BBT_Time& when, const Timecode::BBT_Time& bbt, int dir); const MeterSection& first_meter() const; const TempoSection& first_tempo() const; - int move_metric_section (MetricSection&, const Timecode::BBT_Time& to); void do_insert (MetricSection* section); - - Timecode::BBT_Time bbt_add (const Timecode::BBT_Time&, const Timecode::BBT_Time&, const TempoMetric&) const; - Timecode::BBT_Time bbt_add (const Timecode::BBT_Time& a, const Timecode::BBT_Time& b) const; - Timecode::BBT_Time bbt_subtract (const Timecode::BBT_Time&, const Timecode::BBT_Time&) const; }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 879e44ba64..99ab12e8d5 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -277,10 +277,7 @@ struct MetricSectionSorter { TempoMap::TempoMap (framecnt_t fr) { - metrics = new Metrics; - _map = new BBTPointList; _frame_rate = fr; - last_bbt_valid = false; BBT_Time start; start.bars = 1; @@ -295,14 +292,12 @@ TempoMap::TempoMap (framecnt_t fr) /* note: frame time is correct (zero) for both of these */ - metrics->push_back (t); - metrics->push_back (m); + metrics.push_back (t); + metrics.push_back (m); } TempoMap::~TempoMap () { - delete metrics; - delete _map; } void @@ -314,11 +309,11 @@ TempoMap::remove_tempo (const TempoSection& tempo, bool complete_operation) Glib::RWLock::WriterLock lm (lock); Metrics::iterator i; - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { if (dynamic_cast<TempoSection*> (*i) != 0) { if (tempo.frame() == (*i)->frame()) { if ((*i)->movable()) { - metrics->erase (i); + metrics.erase (i); removed = true; break; } @@ -327,7 +322,7 @@ TempoMap::remove_tempo (const TempoSection& tempo, bool complete_operation) } if (removed && complete_operation) { - recompute_map (false, false); + recompute_map (false); } } @@ -345,11 +340,11 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation) Glib::RWLock::WriterLock lm (lock); Metrics::iterator i; - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { if (dynamic_cast<MeterSection*> (*i) != 0) { if (tempo.frame() == (*i)->frame()) { if ((*i)->movable()) { - metrics->erase (i); + metrics.erase (i); removed = true; break; } @@ -358,7 +353,7 @@ TempoMap::remove_meter (const MeterSection& tempo, bool complete_operation) } if (removed && complete_operation) { - recompute_map (true, false); + recompute_map (true); } } @@ -404,9 +399,9 @@ TempoMap::do_insert (MetricSection* section) the new one. */ - Metrics::iterator to_remove = metrics->end (); + Metrics::iterator to_remove = metrics.end (); - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { int const c = (*i)->compare (*section); @@ -443,26 +438,26 @@ TempoMap::do_insert (MetricSection* section) } } - if (to_remove != metrics->end()) { + if (to_remove != metrics.end()) { /* remove the MetricSection at the same time as the one we are about to add */ - metrics->erase (to_remove); + metrics.erase (to_remove); } /* Add the given MetricSection */ if (need_add) { - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { if ((*i)->compare (*section) < 0) { continue; } - metrics->insert (i, section); + metrics.insert (i, section); break; } - if (i == metrics->end()) { - metrics->insert (metrics->end(), section); + if (i == metrics.end()) { + metrics.insert (metrics.end(), section); } } } @@ -480,7 +475,7 @@ TempoMap::replace_tempo (const TempoSection& ts, const Tempo& tempo, const BBT_T Glib::RWLock::WriterLock lm (lock); /* cannot move the first tempo section */ *((Tempo*)&first) = tempo; - recompute_map (false, false); + recompute_map (false); } } @@ -511,7 +506,7 @@ TempoMap::add_tempo (const Tempo& tempo, BBT_Time where) now see if we can find better candidates. */ - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { const MeterSection* m; @@ -530,7 +525,7 @@ TempoMap::add_tempo (const Tempo& tempo, BBT_Time where) do_insert (ts); - recompute_map (false, false); + recompute_map (false); } @@ -550,7 +545,7 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_T Glib::RWLock::WriterLock lm (lock); /* cannot move the first meter section */ *((Meter*)&first) = meter; - recompute_map (true, false); + recompute_map (true); } } @@ -579,7 +574,7 @@ TempoMap::add_meter (const Meter& meter, BBT_Time where) where.ticks = 0; do_insert (new MeterSection (where, meter.divisions_per_bar(), meter.note_divisor())); - recompute_map (true, false); + recompute_map (true); } @@ -598,12 +593,12 @@ TempoMap::change_initial_tempo (double beats_per_minute, double note_type) Tempo newtempo (beats_per_minute, note_type); TempoSection* t; - for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((t = dynamic_cast<TempoSection*> (*i)) != 0) { { Glib::RWLock::WriterLock lm (lock); *((Tempo*) t) = newtempo; - recompute_map (false, false); + recompute_map (false); } PropertyChanged (PropertyChange ()); break; @@ -623,7 +618,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d /* find the TempoSection immediately preceding "where" */ - for (first = 0, i = metrics->begin(), prev = 0; i != metrics->end(); ++i) { + for (first = 0, i = metrics.begin(), prev = 0; i != metrics.end(); ++i) { if ((*i)->frame() > where) { break; @@ -654,7 +649,7 @@ TempoMap::change_existing_tempo_at (framepos_t where, double beats_per_minute, d Glib::RWLock::WriterLock lm (lock); /* cannot move the first tempo section */ *((Tempo*)prev) = newtempo; - recompute_map (false, false); + recompute_map (false); } PropertyChanged (PropertyChange ()); @@ -665,7 +660,7 @@ TempoMap::first_meter () const { const MeterSection *m = 0; - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((m = dynamic_cast<const MeterSection *> (*i)) != 0) { return *m; } @@ -681,7 +676,7 @@ TempoMap::first_tempo () const { const TempoSection *t = 0; - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((t = dynamic_cast<const TempoSection *> (*i)) != 0) { return *t; } @@ -697,8 +692,8 @@ TempoMap::require_map_to (framepos_t pos) { Glib::RWLock::WriterLock lm (lock); - if (_map->empty() || _map->back().frame < pos) { - recompute_map (false, pos); + if (_map.empty() || _map.back().frame < pos) { + extend_map (pos); } } @@ -715,11 +710,11 @@ TempoMap::require_map_to (const BBT_Time& bbt) int additional_minutes = 1; while (1) { - if (!_map->empty() && _map->back().bar >= (bbt.bars + 1)) { + if (!_map.empty() && _map.back().bar >= (bbt.bars + 1)) { break; } /* add some more distance, using bigger steps each time */ - recompute_map (false, _map->back().frame + (_frame_rate * 60 * additional_minutes)); + extend_map (_map.back().frame + (_frame_rate * 60 * additional_minutes)); additional_minutes *= 2; } } @@ -733,38 +728,41 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) TempoSection* tempo; TempoSection* ts; MeterSection* ms; - double divisions_per_bar; - double beat_frames; double current_frame; BBT_Time current; Metrics::iterator next_metric; - BBTPointList* new_map = new BBTPointList; + + if (end == 0) { + /* silly call from Session::process() during startup + */ + return; + } if (end < 0) { - if (_map->empty()) { + if (_map.empty()) { /* compute 1 mins worth */ end = _frame_rate * 60; } else { - end = _map->back().frame; + end = _map.back().frame; } } else { - if (!_map->empty ()) { + if (!_map.empty ()) { /* never allow the map to be shortened */ - end = max (end, _map->back().frame); + end = max (end, _map.back().frame); } } DEBUG_TRACE (DEBUG::TempoMath, string_compose ("recomputing tempo map, zero to %1\n", end)); - for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((ms = dynamic_cast<MeterSection *> (*i)) != 0) { meter = ms; break; } } - for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((ts = dynamic_cast<TempoSection *> (*i)) != 0) { tempo = ts; break; @@ -781,16 +779,13 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) current.beats = 1; current.ticks = 0; - divisions_per_bar = meter->divisions_per_bar (); - beat_frames = meter->frames_per_division (*tempo,_frame_rate); - if (reassign_tempo_bbt) { MeterSection* rmeter = meter; DEBUG_TRACE (DEBUG::TempoMath, "\tUpdating tempo marks BBT time from bar offset\n"); - for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) { @@ -809,15 +804,82 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) } } - DEBUG_TRACE (DEBUG::TempoMath, string_compose ("start with meter = %1 tempo = %2 dpb %3 fpb %4\n", - *((Meter*)meter), *((Tempo*)tempo), divisions_per_bar, beat_frames)); + DEBUG_TRACE (DEBUG::TempoMath, string_compose ("start with meter = %1 tempo = %2\n", *((Meter*)meter), *((Tempo*)tempo))); - next_metric = metrics->begin(); + next_metric = metrics.begin(); ++next_metric; // skip meter (or tempo) ++next_metric; // skip tempo (or meter) + _map.clear (); + DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add first bar at 1|1 @ %2\n", current.bars, current_frame)); - new_map->push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), 1, 1)); + _map.push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), 1, 1)); + + _extend_map (tempo, meter, next_metric, current, current_frame, end); +} + +void +TempoMap::extend_map (framepos_t end) +{ + /* CALLER MUST HOLD WRITE LOCK */ + + if (_map.empty()) { + recompute_map (false, end); + return; + } + + BBTPointList::const_iterator i = _map.end(); + Metrics::iterator next_metric; + + --i; + + BBT_Time last_metric_start; + + if ((*i).tempo->frame() > (*i).meter->frame()) { + last_metric_start = (*i).tempo->start(); + } else { + last_metric_start = (*i).meter->start(); + } + + /* find the metric immediately after the tempo + meter sections for the + * last point in the map + */ + + for (next_metric = metrics.begin(); next_metric != metrics.end(); ++next_metric) { + if ((*next_metric)->start() > last_metric_start) { + break; + } + } + + cerr << "extend map to " << end << " next_metric @ end ? " << (next_metric == metrics.end()); + if (next_metric != metrics.end()) { + cerr << *next_metric; + } + cerr << endl; + + /* we cast away const here because this is the one place where we need + * to actually modify the frame time of each metric section. + */ + + _extend_map (const_cast<TempoSection*> ((*i).tempo), + const_cast<MeterSection*> ((*i).meter), + next_metric, BBT_Time ((*i).bar, (*i).beat, 0), (*i).frame, end); +} + +void +TempoMap::_extend_map (TempoSection* tempo, MeterSection* meter, + Metrics::iterator next_metric, + BBT_Time current, framepos_t current_frame, framepos_t end) +{ + /* CALLER MUST HOLD WRITE LOCK */ + + TempoSection* ts; + MeterSection* ms; + double divisions_per_bar; + double beat_frames; + + divisions_per_bar = meter->divisions_per_bar (); + beat_frames = meter->frames_per_division (*tempo,_frame_rate); while (current_frame < end) { @@ -829,7 +891,7 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) current.beats = 1; } - if (next_metric != metrics->end()) { + if (next_metric != metrics.end()) { /* no operator >= so invert operator < */ @@ -907,7 +969,7 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) ++next_metric; - if (next_metric != metrics->end() && ((*next_metric)->start() == current)) { + if (next_metric != metrics.end() && ((*next_metric)->start() == current)) { /* same position so go back and set this one up before advancing */ goto set_metrics; @@ -917,15 +979,12 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) if (current.beats == 1) { DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Bar at %1|1 @ %2\n", current.bars, current_frame)); - new_map->push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), current.bars, 1)); + _map.push_back (BBTPoint (*meter, *tempo,(framepos_t) llrint(current_frame), current.bars, 1)); } else { DEBUG_TRACE (DEBUG::TempoMath, string_compose ("Add Beat at %1|%2 @ %3\n", current.bars, current.beats, current_frame)); - new_map->push_back (BBTPoint (*meter, *tempo, (framepos_t) llrint(current_frame), current.bars, current.beats)); + _map.push_back (BBTPoint (*meter, *tempo, (framepos_t) llrint(current_frame), current.bars, current.beats)); } } - - swap (_map, new_map); - delete new_map; } TempoMetric @@ -943,7 +1002,7 @@ TempoMap::metric_at (framepos_t frame) const now see if we can find better candidates. */ - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { // cerr << "Looking at a metric section " << **i << endl; @@ -980,7 +1039,7 @@ TempoMap::metric_at (BBT_Time bbt) const now see if we can find better candidates. */ - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { BBT_Time section_start ((*i)->start()); @@ -1019,7 +1078,7 @@ TempoMap::bbt_time_rt (framepos_t frame, BBT_Time& bbt) throw std::logic_error ("TempoMap::bbt_time_rt() could not lock tempo map"); } - if (_map->empty() || _map->back().frame < frame) { + if (_map.empty() || _map.back().frame < frame) { throw std::logic_error (string_compose ("map not long enough to reach %1", frame)); } @@ -1085,7 +1144,7 @@ TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, i BBTPointList::const_iterator start (wi); double tick_frames = 0; - assert (wi != _map->end()); + assert (wi != _map.end()); /* compute how much rounding we did because of non-zero ticks */ @@ -1096,19 +1155,19 @@ TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, i uint32_t bars = 0; uint32_t beats = 0; - while (wi != _map->end() && bars < bbt.bars) { + while (wi != _map.end() && bars < bbt.bars) { ++wi; if ((*wi).is_bar()) { ++bars; } } - assert (wi != _map->end()); + assert (wi != _map.end()); - while (wi != _map->end() && beats < bbt.beats) { + while (wi != _map.end() && beats < bbt.beats) { ++wi; ++beats; } - assert (wi != _map->end()); + assert (wi != _map.end()); /* add any additional frames related to ticks in the added value */ @@ -1166,9 +1225,9 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, int dir) } if (the_beat.ticks > BBT_Time::ticks_per_bar_division) { - assert (i != _map->end()); + assert (i != _map.end()); ++i; - assert (i != _map->end()); + assert (i != _map.end()); the_beat.ticks -= BBT_Time::ticks_per_bar_division; } @@ -1191,7 +1250,7 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, int dir) } if (the_beat.ticks < difference) { - if (i == _map->begin()) { + if (i == _map.begin()) { /* can't go backwards from wherever pos is, so just return it */ return fr; } @@ -1217,9 +1276,9 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, int dir) DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("moved forward to %1\n", the_beat.ticks)); if (the_beat.ticks > BBT_Time::ticks_per_bar_division) { - assert (i != _map->end()); + assert (i != _map.end()); ++i; - assert (i != _map->end()); + assert (i != _map.end()); the_beat.ticks -= BBT_Time::ticks_per_bar_division; DEBUG_TRACE (DEBUG::SnapBBT, string_compose ("fold beat to %1\n", the_beat)); } @@ -1229,7 +1288,7 @@ TempoMap::round_to_beat_subdivision (framepos_t fr, int sub_num, int dir) /* closer to previous subdivision, so shift backward */ if (rem > the_beat.ticks) { - if (i == _map->begin()) { + if (i == _map.begin()) { /* can't go backwards past zero, so ... */ return 0; } @@ -1264,7 +1323,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) fi = bbt_before_or_at (frame); } - assert (fi != _map->end()); + assert (fi != _map.end()); DEBUG_TRACE(DEBUG::SnapBBT, string_compose ("round from %1 (%3|%4 @ %5) to bars in direction %2\n", frame, dir, (*fi).bar, (*fi).beat, (*fi).frame)); @@ -1278,7 +1337,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) } while (!(*fi).is_bar()) { - if (fi == _map->begin()) { + if (fi == _map.begin()) { break; } fi--; @@ -1297,7 +1356,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) while (!(*fi).is_bar()) { fi++; - if (fi == _map->end()) { + if (fi == _map.end()) { --fi; break; } @@ -1319,7 +1378,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) } while ((*prev).beat != 1) { - if (prev == _map->begin()) { + if (prev == _map.begin()) { break; } prev--; @@ -1327,7 +1386,7 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) while ((*next).beat != 1) { next++; - if (next == _map->end()) { + if (next == _map.end()) { --next; break; } @@ -1392,13 +1451,13 @@ TempoMap::map (TempoMap::BBTPointList::const_iterator& begin, { { Glib::RWLock::WriterLock lm (lock); - if (_map->empty() || (_map->back().frame < upper)) { + if (_map.empty() || (_map.back().frame < upper)) { recompute_map (false, upper); } } - begin = lower_bound (_map->begin(), _map->end(), lower); - end = upper_bound (_map->begin(), _map->end(), upper); + begin = lower_bound (_map.begin(), _map.end(), lower); + end = upper_bound (_map.begin(), _map.end(), upper); } const TempoSection& @@ -1408,7 +1467,7 @@ TempoMap::tempo_section_at (framepos_t frame) const Metrics::const_iterator i; TempoSection* prev = 0; - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { TempoSection* t; if ((t = dynamic_cast<TempoSection*> (*i)) != 0) { @@ -1451,7 +1510,7 @@ TempoMap::get_state () { Glib::RWLock::ReaderLock lm (lock); - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { root->add_child_nocopy ((*i)->get_state()); } } @@ -1467,10 +1526,10 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) XMLNodeList nlist; XMLNodeConstIterator niter; - Metrics old_metrics (*metrics); + Metrics old_metrics (metrics); MeterSection* last_meter = 0; - metrics->clear(); + metrics.clear(); nlist = node.children(); @@ -1481,7 +1540,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) try { TempoSection* ts = new TempoSection (*child); - metrics->push_back (ts); + metrics.push_back (ts); if (ts->bar_offset() < 0.0) { if (last_meter) { @@ -1492,7 +1551,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) catch (failed_constructor& err){ error << _("Tempo map: could not set new state, restoring old one.") << endmsg; - *metrics = old_metrics; + metrics = old_metrics; break; } @@ -1500,13 +1559,13 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) try { MeterSection* ms = new MeterSection (*child); - metrics->push_back (ms); + metrics.push_back (ms); last_meter = ms; } catch (failed_constructor& err) { error << _("Tempo map: could not set new state, restoring old one.") << endmsg; - *metrics = old_metrics; + metrics = old_metrics; break; } } @@ -1514,10 +1573,10 @@ TempoMap::set_state (const XMLNode& node, int /*version*/) if (niter == nlist.end()) { MetricSectionSorter cmp; - metrics->sort (cmp); + metrics.sort (cmp); } - recompute_map (true, false); + recompute_map (true); } PropertyChanged (PropertyChange ()); @@ -1532,7 +1591,7 @@ TempoMap::dump (std::ostream& o) const const MeterSection* m; const TempoSection* t; - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((t = dynamic_cast<const TempoSection*>(*i)) != 0) { o << "Tempo @ " << *i << " (Bar-offset: " << t->bar_offset() << ") " << t->beats_per_minute() << " BPM (pulse = 1/" << t->note_type() << ") at " << t->start() << " frame= " << t->frame() << " (movable? " @@ -1550,7 +1609,7 @@ TempoMap::n_tempos() const Glib::RWLock::ReaderLock lm (lock); int cnt = 0; - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if (dynamic_cast<const TempoSection*>(*i) != 0) { cnt++; } @@ -1565,7 +1624,7 @@ TempoMap::n_meters() const Glib::RWLock::ReaderLock lm (lock); int cnt = 0; - for (Metrics::const_iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::const_iterator i = metrics.begin(); i != metrics.end(); ++i) { if (dynamic_cast<const MeterSection*>(*i) != 0) { cnt++; } @@ -1579,7 +1638,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount) { { Glib::RWLock::WriterLock lm (lock); - for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { + for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { if ((*i)->frame() >= where && (*i)->movable ()) { (*i)->set_frame ((*i)->frame() + amount); } @@ -1607,7 +1666,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount) bool first = true; MetricSection* prev = 0; - for (i = metrics->begin(); i != metrics->end(); ++i) { + for (i = metrics.begin(); i != metrics.end(); ++i) { BBT_Time bbt; TempoMetric metric (*meter, *tempo); @@ -1661,7 +1720,7 @@ TempoMap::insert_time (framepos_t where, framecnt_t amount) prev = (*i); } - recompute_map (true, false); + recompute_map (true); } @@ -1701,7 +1760,7 @@ TempoMap::framepos_minus_bbt (framepos_t pos, BBT_Time op) /* walk backwards */ - while (i != _map->begin() && (op.bars || op.beats)) { + while (i != _map.begin() && (op.bars || op.beats)) { --i; if (had_bars) { @@ -1758,7 +1817,7 @@ TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op) /* we know that (*i).frame is before or equal to pos */ backup_frames = pos - (*i).frame; - while (i != _map->end() && (op.bars || op.beats)) { + while (i != _map.end() && (op.bars || op.beats)) { ++i; @@ -1781,19 +1840,19 @@ TempoMap::framepos_plus_bbt (framepos_t pos, BBT_Time op) } } - if (i != _map->end()) { + if (i != _map.end()) { break; } /* we hit the end of the map before finish the bbt walk. */ - recompute_map (pos + (_frame_rate * 60 * additional_minutes)); + recompute_map (false, pos + (_frame_rate * 60 * additional_minutes)); additional_minutes *= 2; /* go back and try again */ warning << "reached end of map with op now at " << op << " end = " - << _map->back().frame << ' ' << _map->back().bar << '|' << _map->back().beat << ", trying to walk " + << _map.back().frame << ' ' << _map.back().bar << '|' << _map.back().beat << ", trying to walk " << op_copy << " ... retry" << endmsg; } @@ -1828,12 +1887,12 @@ TempoMap::framewalk_to_beats (framepos_t pos, framecnt_t distance) beats += ((*i).frame - pos) / (*i).meter->frames_per_division (*(*i).tempo, _frame_rate); } - while (i != _map->end() && (*i).frame < end) { + while (i != _map.end() && (*i).frame < end) { ++i; beats++; } - assert (i != _map->end()); + assert (i != _map.end()); /* if our ending BBTPoint is after the end, subtract a fractional beat to represent that distance. @@ -1853,10 +1912,10 @@ TempoMap::bbt_before_or_at (framepos_t pos) BBTPointList::const_iterator i; - i = lower_bound (_map->begin(), _map->end(), pos); - assert (i != _map->end()); + i = lower_bound (_map.begin(), _map.end(), pos); + assert (i != _map.end()); if ((*i).frame > pos) { - assert (i != _map->begin()); + assert (i != _map.begin()); --i; } return i; @@ -1874,10 +1933,10 @@ TempoMap::bbt_before_or_at (const BBT_Time& bbt) BBTPointList::const_iterator i; bbtcmp cmp; - i = lower_bound (_map->begin(), _map->end(), bbt, cmp); - assert (i != _map->end()); + i = lower_bound (_map.begin(), _map.end(), bbt, cmp); + assert (i != _map.end()); if ((*i).bar > bbt.bars || (*i).beat > bbt.beats) { - assert (i != _map->begin()); + assert (i != _map.begin()); --i; } return i; @@ -1890,15 +1949,15 @@ TempoMap::bbt_after_or_at (framepos_t pos) BBTPointList::const_iterator i; - if (_map->back().frame == pos) { - i = _map->end(); - assert (i != _map->begin()); + if (_map.back().frame == pos) { + i = _map.end(); + assert (i != _map.begin()); --i; return i; } - i = upper_bound (_map->begin(), _map->end(), pos); - assert (i != _map->end()); + i = upper_bound (_map.begin(), _map.end(), pos); + assert (i != _map.end()); return i; } diff --git a/libs/ardour/test/tempo_test.cc b/libs/ardour/test/tempo_test.cc index a330d11c05..845116470e 100644 --- a/libs/ardour/test/tempo_test.cc +++ b/libs/ardour/test/tempo_test.cc @@ -42,7 +42,7 @@ TempoTest::recomputeMapTest () map.add_meter (meterB, BBT_Time (4, 1, 0)); cout << "\n\n\n"; - for (list<MetricSection*>::iterator i = map.metrics->begin(); i != map.metrics->end(); ++i) { + for (list<MetricSection*>::iterator i = map.metrics.begin(); i != map.metrics.end(); ++i) { if (dynamic_cast<TempoSection*> (*i)) { cout << "\tTempo MS @ " << (*i)->start() << " " << (*i)->frame() << "\n"; } else { @@ -50,10 +50,10 @@ TempoTest::recomputeMapTest () } } - list<MetricSection*>::iterator i = map.metrics->begin(); + list<MetricSection*>::iterator i = map.metrics.begin(); CPPUNIT_ASSERT_EQUAL (framepos_t (0), (*i)->frame ()); - i = map.metrics->end(); + i = map.metrics.end(); --i; CPPUNIT_ASSERT_EQUAL (framepos_t (288e3), (*i)->frame ()); } |