summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2016-05-02 05:34:25 +1000
committernick_m <mainsbridge@gmail.com>2016-05-27 23:38:16 +1000
commit6f3ac9d6264b57884365a83f12e1a57487ed33d4 (patch)
treeb7bedf729ea12b37708bc9ce0a3876935e39a252
parent118d04cce67b0d94b537e25084cb351a21640a20 (diff)
Tempo ramps - fix some leaks
-rw-r--r--libs/ardour/tempo.cc40
1 files changed, 37 insertions, 3 deletions
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index 400b0deeea..674afe2ce9 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -2118,16 +2118,27 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t
if (meter_locked_tempo) {
Metrics future_map;
+ bool solved = false;
TempoSection* tempo_copy = copy_metrics_and_point (imaginary, future_map, meter_locked_tempo);
const double new_pulse = ((section->beat() - prev_m->beat())
/ prev_m->note_divisor()) + prev_m->pulse();
const framepos_t smallest_frame = frame_at_pulse_locked (future_map, new_pulse);
- if (solve_map (future_map, tempo_copy, smallest_frame)) {
+ if ((solved = solve_map (future_map, tempo_copy, smallest_frame))) {
meter_locked_tempo->set_pulse (new_pulse);
solve_map (imaginary, meter_locked_tempo, smallest_frame);
section->set_frame (smallest_frame);
section->set_pulse (new_pulse);
} else {
+ solved = false;
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ if (!solved) {
return false;
}
}
@@ -2135,17 +2146,28 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t
} else {
if (meter_locked_tempo) {
Metrics future_map;
+ bool solved = false;
TempoSection* tempo_copy = copy_metrics_and_point (imaginary, future_map, meter_locked_tempo);
MeterSection* meter_copy = const_cast<MeterSection*> (&meter_section_at_locked (future_map, section->frame()));
meter_copy->set_frame (frame);
- if (solve_map (future_map, tempo_copy, frame)) {
+ if ((solved = solve_map (future_map, tempo_copy, frame))) {
section->set_frame (frame);
meter_locked_tempo->set_pulse (((section->beat() - prev_m->beat())
/ prev_m->note_divisor()) + prev_m->pulse());
solve_map (imaginary, meter_locked_tempo, frame);
} else {
+ solved = false;
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ if (!solved) {
return false;
}
}
@@ -2154,19 +2176,31 @@ TempoMap::solve_map (Metrics& imaginary, MeterSection* section, const framepos_t
/* not movable (first meter atm) */
if (meter_locked_tempo) {
Metrics future_map;
+ bool solved = false;
TempoSection* tempo_copy = copy_metrics_and_point (imaginary, future_map, meter_locked_tempo);
tempo_copy->set_frame (frame);
tempo_copy->set_pulse (0.0);
- if (solve_map (future_map, tempo_copy, frame)) {
+ if ((solved = solve_map (future_map, tempo_copy, frame))) {
section->set_frame (frame);
meter_locked_tempo->set_frame (frame);
meter_locked_tempo->set_pulse (0.0);
solve_map (imaginary, meter_locked_tempo, frame);
} else {
+ solved = false;
+ }
+
+ Metrics::const_iterator d = future_map.begin();
+ while (d != future_map.end()) {
+ delete (*d);
+ ++d;
+ }
+
+ if (!solved) {
return false;
}
+
} else {
return false;
}