diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-01-05 22:36:58 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-01-05 22:36:58 +0000 |
commit | bdb15f942250ad3e8a42c6bef927374eedb0299f (patch) | |
tree | 8efac160143fce4dbc90b1fe852db3df7f9bb16a /libs | |
parent | c5205fe49f002f5fe116b0448341c6fdb42bcbc9 (diff) |
fix some more crashes with tempo map manipulations
git-svn-id: svn://localhost/ardour2/branches/3.0@11170 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/tempo.cc | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 73dc998732..8d1aba0210 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -421,13 +421,15 @@ TempoMap::do_insert (MetricSection* section) if (!(*i)->movable()) { - /* can't (re)move this section, so overwrite it + /* can't (re)move this section, so overwrite + * its data content (but not its properties as + * a section */ if (!iter_is_tempo) { - *(dynamic_cast<MeterSection*>(*i)) = *(dynamic_cast<MeterSection*>(section)); + *(dynamic_cast<Meter*>(*i)) = *(dynamic_cast<Meter*>(section)); } else { - *(dynamic_cast<TempoSection*>(*i)) = *(dynamic_cast<TempoSection*>(section)); + *(dynamic_cast<Tempo*>(*i)) = *(dynamic_cast<Tempo*>(section)); } need_add = false; break; @@ -546,6 +548,7 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const BBT_T /* cannot move the first meter section */ *((Meter*)&first) = meter; recompute_map (true); + } } @@ -724,10 +727,8 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) { /* CALLER MUST HOLD WRITE LOCK */ - MeterSection* meter; - TempoSection* tempo; - TempoSection* ts; - MeterSection* ms; + MeterSection* meter = 0; + TempoSection* tempo = 0; double current_frame; BBT_Time current; Metrics::iterator next_metric; @@ -750,6 +751,8 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) DEBUG_TRACE (DEBUG::TempoMath, string_compose ("recomputing tempo map, zero to %1\n", end)); for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { + MeterSection* ms; + if ((ms = dynamic_cast<MeterSection *> (*i)) != 0) { meter = ms; break; @@ -757,6 +760,8 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) } for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { + TempoSection* ts; + if ((ts = dynamic_cast<TempoSection *> (*i)) != 0) { tempo = ts; break; @@ -780,7 +785,10 @@ TempoMap::recompute_map (bool reassign_tempo_bbt, framepos_t end) DEBUG_TRACE (DEBUG::TempoMath, "\tUpdating tempo marks BBT time from bar offset\n"); for (Metrics::iterator i = metrics.begin(); i != metrics.end(); ++i) { - + + TempoSection* ts; + MeterSection* ms; + if ((ts = dynamic_cast<TempoSection*>(*i)) != 0) { /* reassign the BBT time of this tempo section @@ -1326,6 +1334,10 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) if (dir < 0) { /* find bar previous to 'frame' */ + if (fi == _map.begin()) { + return 0; + } + if ((*fi).is_bar() && (*fi).frame == frame) { --fi; } @@ -1378,15 +1390,11 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) prev--; } - while ((*next).beat != 1) { + while ((next != _map.end()) && (*next).beat != 1) { next++; - if (next == _map.end()) { - --next; - break; - } } - if ((frame - (*prev).frame) < ((*next).frame - frame)) { + if ((next == _map.end()) || (frame - (*prev).frame) < ((*next).frame - frame)) { return (*prev).frame; } else { return (*next).frame; @@ -1398,6 +1406,11 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) case Beat: if (dir < 0) { + + if (fi == _map.begin()) { + return 0; + } + if ((*fi).frame >= frame) { DEBUG_TRACE (DEBUG::SnapBBT, "requested frame is on beat, step back\n"); --fi; @@ -1421,10 +1434,12 @@ TempoMap::round_to_type (framepos_t frame, int dir, BBTPointType type) BBTPointList::const_iterator prev = fi; BBTPointList::const_iterator next = fi; - --prev; + if (prev != _map.begin()) { + --prev; + } ++next; - if ((frame - (*prev).frame) < ((*next).frame - frame)) { + if ((next == _map.end()) || (frame - (*prev).frame) < ((*next).frame - frame)) { return (*prev).frame; } else { return (*next).frame; |