From 3c76fa9dd1887603f28e57bed5883a4814a6d782 Mon Sep 17 00:00:00 2001 From: nick_m Date: Mon, 2 May 2016 06:12:33 +1000 Subject: [PATCH] Tempo ramps - fix various tempo dragging issues. --- gtk2_ardour/editor_drag.cc | 1 - libs/ardour/ardour/tempo.h | 3 ++- libs/ardour/tempo.cc | 26 ++++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index d3f7a3c4bd..fe67b71dd2 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3206,7 +3206,6 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) _editor->session()->tempo_map().gui_dilate_tempo (_real_section, pf); } else if (bbt.bars > _real_section->bbt().bars) { const double pulse = _real_section->pulse() + (prev_m.note_divisor() / prev_m.divisions_per_bar()); - //const double pulse = _real_section->pulse() + (_real_section->note_divisor() / _real_section->divisions_per_bar()); _editor->session()->tempo_map().gui_move_meter (_real_section, pulse); } else if (bbt.bars < _real_section->bbt().bars) { const double pulse = _real_section->pulse() - (prev_m.note_divisor() / prev_m.divisions_per_bar()); diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index e6f07a3772..eb6eeb3a50 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -393,7 +393,8 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible void replace_tempo (const TempoSection&, const Tempo&, const framepos_t& frame, TempoSection::Type type); void gui_move_tempo_frame (TempoSection*, const framepos_t& frame); - void gui_move_tempo_beat (TempoSection*, const double& frame); + void gui_move_tempo_beat (TempoSection*, const double& beat); + void gui_move_tempo_pulse (TempoSection*, const double& pulse); void gui_move_meter (MeterSection*, const framepos_t& frame); void gui_move_meter (MeterSection*, const double& pulse); bool gui_change_tempo (TempoSection*, const Tempo& bpm); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 674afe2ce9..7af7545b76 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -2400,7 +2400,7 @@ TempoMap::predict_tempo_frame (TempoSection* section, const BBT_Time& bbt) if (solve_map (future_map, tempo_copy, pulse_at_beat_locked (future_map, beat))) { ret = tempo_copy->frame(); } else { - ret = frame_at_beat_locked (_metrics, beat); + ret = section->frame(); } Metrics::const_iterator d = future_map.begin(); @@ -2422,7 +2422,7 @@ TempoMap::predict_tempo_pulse (TempoSection* section, const framepos_t& frame) if (solve_map (future_map, tempo_copy, frame)) { ret = tempo_copy->pulse(); } else { - ret = pulse_at_frame_locked (_metrics, frame); + ret = section->pulse(); } Metrics::const_iterator d = future_map.begin(); @@ -2477,6 +2477,28 @@ TempoMap::gui_move_tempo_beat (TempoSection* ts, const double& beat) MetricPositionChanged (); // Emit Signal } +void +TempoMap::gui_move_tempo_pulse (TempoSection* ts, const double& pulse) +{ + Metrics future_map; + { + Glib::Threads::RWLock::WriterLock lm (lock); + TempoSection* tempo_copy = copy_metrics_and_point (_metrics, future_map, ts); + if (solve_map (future_map, tempo_copy, pulse)) { + solve_map (_metrics, ts, pulse); + recompute_meters (_metrics); + } + } + + Metrics::const_iterator d = future_map.begin(); + while (d != future_map.end()) { + delete (*d); + ++d; + } + + MetricPositionChanged (); // Emit Signal +} + void TempoMap::gui_move_meter (MeterSection* ms, const framepos_t& frame) {