From f54b75c869348501a4603bfe7adce46b50781b5b Mon Sep 17 00:00:00 2001 From: nick_m Date: Tue, 24 May 2016 02:50:42 +1000 Subject: [PATCH] Tempo ramps - consolidate meter dragging code. --- gtk2_ardour/editor_drag.cc | 25 ++++++------------- libs/ardour/ardour/tempo.h | 7 +++--- libs/ardour/tempo.cc | 50 ++++++++++++++++++-------------------- 3 files changed, 34 insertions(+), 48 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 9cbeb1984a..16c1862dd8 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3185,25 +3185,16 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) } } - framepos_t const pf = adjusted_current_frame (event, false); - if (_marker->meter().position_lock_style() == MusicTime) { - TempoMap& map (_editor->session()->tempo_map()); - Timecode::BBT_Time bbt; - map.bbt_time (pf, bbt); - /* round bbt to bars */ - map.round_bbt (bbt, -1, RoundNearest); + framepos_t pf = adjusted_current_frame (event); - if ((bbt.bars != _real_section->bbt().bars && pf > last_pointer_frame()) - || (bbt.bars < _real_section->bbt().bars && pf < last_pointer_frame())) { - - /* move meter beat-based */ - _editor->session()->tempo_map().gui_move_meter_bbt (_real_section, bbt); - } - } else { - /* AudioTime */ - /* move meter frame-based */ - _editor->session()->tempo_map().gui_move_meter_frame (_real_section, pf); + if (_real_section->position_lock_style() == AudioTime && _editor->snap_musical()) { + /* never snap to music for audio locked */ + pf = adjusted_current_frame (event, false); } + + _editor->session()->tempo_map().gui_move_meter (_real_section, pf); + + setup_pointer_frame_offset (); _marker->set_position (pf); show_verbose_cursor_time (_real_section->frame()); } diff --git a/libs/ardour/ardour/tempo.h b/libs/ardour/ardour/tempo.h index db618a4513..5416ad3462 100644 --- a/libs/ardour/ardour/tempo.h +++ b/libs/ardour/ardour/tempo.h @@ -399,10 +399,8 @@ class LIBARDOUR_API TempoMap : public PBD::StatefulDestructible std::pair predict_tempo_position (TempoSection* section, const Timecode::BBT_Time& bbt); - void gui_move_tempo (TempoSection*, const std::pair& pulse); - - void gui_move_meter_frame (MeterSection*, const framepos_t& frame); - void gui_move_meter_bbt (MeterSection*, const Timecode::BBT_Time& bbt); + void gui_move_tempo (TempoSection*, const std::pair& pulse); + void gui_move_meter (MeterSection*, const framepos_t& frame); bool gui_change_tempo (TempoSection*, const Tempo& bpm); void gui_dilate_tempo (TempoSection* tempo, const framepos_t& frame, const framepos_t& end_frame, const double& pulse); @@ -481,6 +479,7 @@ private: bool check_solved (const Metrics& metrics) const; bool set_active_tempos (const Metrics& metrics, const framepos_t& frame); + bool solve_map_frame (Metrics& metrics, TempoSection* section, const framepos_t& frame); bool solve_map_pulse (Metrics& metrics, TempoSection* section, const double& pulse); bool solve_map_frame (Metrics& metrics, MeterSection* section, const framepos_t& frame); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index 75065917fd..4a0151b22c 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -2352,7 +2352,7 @@ TempoMap::predict_tempo_position (TempoSection* section, const BBT_Time& bbt) } void -TempoMap::gui_move_tempo (TempoSection* ts, const pair& pulse) +TempoMap::gui_move_tempo (TempoSection* ts, const pair& pulse) { Metrics future_map; @@ -2388,37 +2388,33 @@ TempoMap::gui_move_tempo (TempoSection* ts, const pairposition_lock_style() == AudioTime) { - MetricPositionChanged (); // Emit Signal -} + { + Glib::Threads::RWLock::WriterLock lm (lock); + MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms); -void -TempoMap::gui_move_meter_bbt (MeterSection* ms, const Timecode::BBT_Time& bbt) -{ - Metrics future_map; - { - Glib::Threads::RWLock::WriterLock lm (lock); - MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms); - if (solve_map_bbt (future_map, copy, bbt)) { - solve_map_bbt (_metrics, ms, bbt); - recompute_tempos (_metrics); + if (solve_map_frame (future_map, copy, frame)) { + solve_map_frame (_metrics, ms, frame); + recompute_tempos (_metrics); + } + } + } else { + { + Glib::Threads::RWLock::WriterLock lm (lock); + MeterSection* copy = copy_metrics_and_point (_metrics, future_map, ms); + + const double beat = beat_at_frame_locked (_metrics, frame); + const Timecode::BBT_Time bbt = beats_to_bbt_locked (_metrics, beat); + + if (solve_map_bbt (future_map, copy, bbt)) { + solve_map_bbt (_metrics, ms, bbt); + recompute_tempos (_metrics); + } } } -- 2.30.2