diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 770da5425b..9110b80532 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1992,55 +1992,70 @@ ARDOUR_UI::transport_rec_count_in () } void -ARDOUR_UI::transport_ffwd_rewind (int option, int dir) +ARDOUR_UI::transport_ffwd_rewind (bool fwd) { if (!_session) { return; } - /* engine speed is always positive, so multiply by transport - * (-1, 0, 1) to get directional value - */ + // incrementally increase speed by semitones + // (keypress auto-repeat is 100ms) + const float maxspeed = Config->get_shuttle_max_speed(); + float semitone_ratio = exp2f (1.0f/12.0f); + float transport_speed = _session->actual_speed (); - const float current_transport_speed = _session->engine_speed () * _session->transport_speed (); - float target_speed = current_transport_speed; + if (transport_speed == 0.0 || fabs (transport_speed) <= 1.0/semitone_ratio) { - switch (option) { - case 0: - target_speed = dir * 1.0f; - break; - case 1: - target_speed = dir * 4.0f; - break; - case -1: - target_speed = dir * 0.5f; - break; + /* close to zero, maybe flip direction */ + + if (fwd) { + if (transport_speed <= 0) { + _session->request_transport_speed (1.0, false); + _session->request_roll (TRS_UI); + } + } else { + if (transport_speed >= 0) { + _session->request_transport_speed (-1.0, false); + _session->request_roll (TRS_UI); + } + } + + /* either we've just started, or we're moving as slowly as we + * ever should + */ + + return; } - /* if wanting to move forward/backward and current speed is at or above current - speed (i.e. same direction, and moving), then speed up. - */ - - const bool speed_up = (dir > 0 && current_transport_speed >= target_speed) || (dir < 0 && current_transport_speed <= target_speed); - - if (speed_up) { - target_speed = current_transport_speed * 1.5f; + if (fwd) { + if (transport_speed < 0.f) { + /* we need to move the speed back towards zero */ + semitone_ratio = 1.0/semitone_ratio; + } + } else { + if (transport_speed > 0.f) { + /* we need to move the speed back towards zero */ + semitone_ratio = 1.0/semitone_ratio; + } } - _session->request_transport_speed (target_speed, false); - _session->request_roll (); + float speed = semitone_ratio * transport_speed; + + speed = std::max (-maxspeed, std::min (maxspeed, speed)); + _session->request_transport_speed (speed, false); + _session->request_roll (TRS_UI); } void -ARDOUR_UI::transport_rewind (int option) +ARDOUR_UI::transport_rewind () { - transport_ffwd_rewind (option, -1); + transport_ffwd_rewind (false); } void -ARDOUR_UI::transport_forward (int option) +ARDOUR_UI::transport_forward () { - transport_ffwd_rewind (option, 1); + transport_ffwd_rewind (true); } void diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 01f9369109..a9e24b4b08 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -670,9 +670,9 @@ private: void transport_play_preroll(); void transport_rec_preroll(); void transport_rec_count_in(); - void transport_forward (int option); - void transport_rewind (int option); - void transport_ffwd_rewind (int option, int dir); + void transport_forward (); + void transport_rewind (); + void transport_ffwd_rewind (bool fwd); void transport_loop (); void toggle_roll (bool with_abort, bool roll_out_of_bounded_mode); bool trx_record_enable_all_tracks (); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 38de8e7e55..fbbcfe0600 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -365,22 +365,22 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 0)); + act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), -1)); + act = ActionManager::register_action (transport_actions, X_("RewindSlow"), _("Rewind (Slow)"), sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 1)); + act = ActionManager::register_action (transport_actions, X_("RewindFast"), _("Rewind (Fast)"), sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 0)); + act = ActionManager::register_action (transport_actions, X_("Forward"), _("Forward"), sigc::mem_fun(*this, &ARDOUR_UI::transport_forward)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), -1)); + act = ActionManager::register_action (transport_actions, X_("ForwardSlow"), _("Forward (Slow)"), sigc::mem_fun(*this, &ARDOUR_UI::transport_forward)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_forward), 1)); + act = ActionManager::register_action (transport_actions, X_("ForwardFast"), _("Forward (Fast)"), sigc::mem_fun(*this, &ARDOUR_UI::transport_forward)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); act = ActionManager::register_action (transport_actions, X_("GotoZero"), _("Go to Zero"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_zero)); diff --git a/gtk2_ardour/ardour_ui_keys.cc b/gtk2_ardour/ardour_ui_keys.cc index 9b360a932b..81c46a6767 100644 --- a/gtk2_ardour/ardour_ui_keys.cc +++ b/gtk2_ardour/ardour_ui_keys.cc @@ -327,8 +327,8 @@ ARDOUR_UI::transport_numpad_event (int num) } else { switch (num) { case 0: toggle_roll(false, false); break; - case 1: transport_rewind(1); break; - case 2: transport_forward(1); break; + case 1: transport_rewind(); break; + case 2: transport_forward(); break; case 3: transport_record(true); break; case 4: toggle_session_auto_loop(); break; case 5: transport_record(false); toggle_session_auto_loop(); break;