copy BasicUI::button_varispeed() into ARDOUR_UI, and use in all the right places
We really must find a way to share code between BasicUI and ARDOUR_UI
This commit is contained in:
parent
b01632356d
commit
9905f6e0a9
@ -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
|
||||
|
@ -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 ();
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user