harden TempoMap::next_tempo_section () a bit.
[ardour.git] / libs / ardour / tempo.cc
index dbc0457f8a2b35d603307bc7b00f82929ea6de5b..3865fe3e197ba05575a8885c8a26c5ac12333a86 100644 (file)
@@ -155,6 +155,17 @@ TempoSection::TempoSection (const XMLNode& node, framecnt_t sample_rate)
                        _end_note_types_per_minute = _note_types_per_minute;
                        _legacy_end = true;
                }
+       } else {
+               _legacy_end = true;
+       }
+
+       if ((prop = node.property ("tempo-type")) != 0) {
+               TempoSection::Type old_type;
+
+               old_type = Type (string_2_enum (prop->value(), old_type));
+               if (old_type == TempoSection::Constant) {
+                       _end_note_types_per_minute = _note_types_per_minute;
+               }
        }
 
        if ((prop = node.property ("movable")) == 0) {
@@ -1816,9 +1827,9 @@ TempoMap::minute_at_tempo_locked (const Metrics& metrics, const Tempo& tempo) co
                        if (prev_t) {
                                const double prev_t_bpm = prev_t->note_types_per_minute();
                                const double prev_t_end_bpm = prev_t->end_note_types_per_minute();
-                               if (prev_t_bpm > tempo_bpm && prev_t_end_bpm < tempo_bpm
-                                   || prev_t_bpm < tempo_bpm && prev_t_end_bpm > tempo_bpm
-                                   || prev_t_end_bpm == tempo_bpm) {
+                               if ((prev_t_bpm > tempo_bpm && prev_t_end_bpm < tempo_bpm)
+                                   || (prev_t_bpm < tempo_bpm && prev_t_end_bpm > tempo_bpm)
+                                   || (prev_t_end_bpm == tempo_bpm)) {
 
                                        return prev_t->minute_at_ntpm (tempo_bpm, t->pulse());
                                }
@@ -4274,6 +4285,42 @@ TempoMap::tempo_section_at_beat_locked (const Metrics& metrics, const double& be
        return *prev_t;
 }
 
+TempoSection*
+TempoMap::next_tempo_section (TempoSection* ts) const
+{
+       if (!ts) {
+               return 0;
+       }
+
+       Glib::Threads::RWLock::ReaderLock lm (lock);
+
+       TempoSection* prev = 0;
+
+       for (Metrics::const_iterator i = _metrics.begin(); i != _metrics.end(); ++i) {
+
+               if ((*i)->is_tempo()) {
+                       TempoSection* t = static_cast<TempoSection*> (*i);
+
+                       if (!t->active()) {
+                               continue;
+                       }
+
+                       if (prev && prev == ts) {
+
+                               return t;
+                       }
+
+                       prev = t;
+               }
+       }
+
+       if (prev == 0) {
+               fatal << endmsg;
+               abort(); /*NOTREACHED*/
+       }
+
+       return 0;
+}
 /* don't use this to calculate length (the tempo is only correct for this frame).
    do that stuff based on the beat_at_frame and frame_at_beat api
 */
@@ -4467,10 +4514,8 @@ TempoMap::fix_legacy_end_session ()
                        }
 
                        if (prev_t) {
-                               if (prev_t->type() == TempoSection::Ramp) {
+                               if (prev_t->type() != TempoSection::Constant) {
                                        prev_t->set_end_note_types_per_minute (t->note_types_per_minute());
-                               } else {
-                                       prev_t->set_end_note_types_per_minute (prev_t->note_types_per_minute());
                                }
                        }