From 2be8f11a3e05826108f867153d3e3462f6613c48 Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Thu, 3 Jul 2014 12:25:35 -0500 Subject: [PATCH] fix the naming and behavior of always-play-range to match the button, which is follow-edits. when you select a range, the playhead should jump to the start of the range and begin to play the selection. BUT (unlike previous implementation) if the user wants to relocate the playhead, then that should be allowed. The user should always remain in charge of the playhead location. NOTE: your previous config setting will be invalidated. You must re-save a session to overwrite with the new config variable --- gtk2_ardour/ardour_ui.cc | 8 ++++---- gtk2_ardour/ardour_ui.h | 2 +- gtk2_ardour/ardour_ui2.cc | 4 ++-- gtk2_ardour/ardour_ui_ed.cc | 2 +- gtk2_ardour/ardour_ui_options.cc | 2 +- gtk2_ardour/editor_drag.cc | 2 +- gtk2_ardour/editor_mouse.cc | 2 +- gtk2_ardour/editor_ops.cc | 4 ++-- gtk2_ardour/editor_selection.cc | 2 +- libs/ardour/ardour/rc_configuration_vars.h | 2 +- libs/ardour/ardour/session.h | 1 + libs/ardour/session_transport.cc | 7 +++++++ 12 files changed, 23 insertions(+), 15 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index a21796e757..060a98ef44 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1902,7 +1902,7 @@ ARDOUR_UI::transport_roll () } } - } else if (_session->get_play_range () && !Config->get_always_play_range()) { + } else if (_session->get_play_range () ) { /* stop playing a range if we currently are */ _session->request_play_range (0, true); } @@ -1969,10 +1969,10 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (rolling) { _session->request_stop (with_abort, true); } else { - if ( Config->get_always_play_range() ) { + if ( Config->get_follow_edits() && ( editor->get_selection().time.front().start == _session->transport_frame() ) ) { //if playhead is exactly at the start of a range, we can assume it was placed there by follow_edits _session->request_play_range (&editor->get_selection().time, true); + _session->set_requested_return_frame( editor->get_selection().time.front().start ); //force an auto-return here } - _session->request_transport_speed (1.0f); } } @@ -2179,7 +2179,7 @@ ARDOUR_UI::map_transport_state () editor->get_waves_button ("transport_loop_button").set_active (false); } - if (Config->get_always_play_range()) { + if (Config->get_follow_edits()) { /* light up both roll and play-selection if they are joined */ roll_button.set_active (true); play_selection_button.set_active (true); diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index a0c45c3df8..55a3e9cd2b 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -443,7 +443,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr boost::shared_ptr play_selection_controllable; boost::shared_ptr rec_controllable; - void toggle_always_play_range (); + void toggle_follow_edits (); void set_transport_controllable_state (const XMLNode&); XMLNode& get_transport_controllable_state (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 18dde195c6..074e6f873f 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -601,7 +601,7 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev) } void -ARDOUR_UI::toggle_always_play_range () +ARDOUR_UI::toggle_follow_edits () { RefPtr act = ActionManager::get_action (X_("Transport"), X_("ToggleFollowEdits")); assert (act); @@ -609,7 +609,7 @@ ARDOUR_UI::toggle_always_play_range () RefPtr tact = RefPtr::cast_dynamic (act); assert (tact); - Config->set_always_play_range (tact->get_active ()); + Config->set_follow_edits (tact->get_active ()); } diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index f83d0b341a..f203b6a07b 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -353,7 +353,7 @@ ARDOUR_UI::install_actions () act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_always_play_range)); + act = ActionManager::register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 42a9790566..7d9c526503 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -328,7 +328,7 @@ ARDOUR_UI::parameter_changed (std::string p) } else if (p == "always-play-range") { - ActionManager::map_some_state ("Transport", "ToggleFollowEdits", &RCConfiguration::get_always_play_range); + ActionManager::map_some_state ("Transport", "ToggleFollowEdits", &RCConfiguration::get_follow_edits); } else if (p == "send-mtc") { diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 03005b9dab..ca764408ad 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -4348,7 +4348,7 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) if ( s->get_play_range() && s->transport_rolling() ) { s->request_play_range (&_editor->selection->time, true); } else { - if (Config->get_always_play_range() && !s->transport_rolling()) { + if (Config->get_follow_edits() && !s->transport_rolling()) { s->request_locate (_editor->get_selection().time.start()); } } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 39f72077cc..2fd1a13415 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1293,7 +1293,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } //not rolling, range mode click + join_play_range : locate the PH here - if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_always_play_range() ) { + if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_follow_edits() ) { framepos_t where = canvas_event_sample (event); snap_to(where); _session->request_locate (where, false); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 8852bcdbff..91750616ba 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2237,7 +2237,7 @@ Editor::get_preroll () void Editor::maybe_locate_with_edit_preroll ( framepos_t location ) { - if ( _session->transport_rolling() || !Config->get_always_play_range() ) + if ( _session->transport_rolling() || !Config->get_follow_edits() ) return; location -= get_preroll(); @@ -5559,7 +5559,7 @@ Editor::set_playhead_cursor () } } - if ( Config->get_always_play_range() ) + if ( Config->get_follow_edits() ) cancel_time_selection(); } diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index ea07b2a3b2..a6a4b09aed 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -1087,7 +1087,7 @@ Editor::time_selection_changed () ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true); } - if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->time.empty()) { + if (_session && Config->get_follow_edits() && !_session->transport_rolling() && !selection->time.empty()) { _session->request_locate (selection->time.start()); } } diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 34b0c53085..a0cbd9caee 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -153,7 +153,7 @@ CONFIG_VARIABLE (bool, secondary_clock_delta_edit_cursor, "secondary-clock-delta CONFIG_VARIABLE (bool, show_track_meters, "show-track-meters", true) CONFIG_VARIABLE (bool, locate_while_waiting_for_sync, "locate-while-waiting-for-sync", false) CONFIG_VARIABLE (bool, disable_disarm_during_roll, "disable-disarm-during-roll", false) -CONFIG_VARIABLE (bool, always_play_range, "always-play-range", false) +CONFIG_VARIABLE (bool, follow_edits, "follow-edits", false) CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", false) /* metering */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index b7dac796c5..c967afa3f3 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -508,6 +508,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop framepos_t transport_frame () const {return _transport_frame; } framepos_t audible_frame () const; framepos_t requested_return_frame() const { return _requested_return_frame; } + void set_requested_return_frame(framepos_t return_to); enum PullupFormat { pullup_Plus4Plus1, diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 19f86eb2b3..2cd8de49bf 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -1635,6 +1635,13 @@ Session::request_bounded_roll (framepos_t start, framepos_t end) lar.push_back (ar); request_play_range (&lar, true); } + +void +Session::set_requested_return_frame (framepos_t return_to) +{ + _requested_return_frame = return_to; +} + void Session::request_roll_at_and_return (framepos_t start, framepos_t return_to) {