diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index ab1d6bbbd0..59b506be12 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -479,9 +479,11 @@ public: void use_rf_shuttle_speed (); void allow_auto_play (bool yn); + void set_default_play_speed (double spd, TransportRequestSource origin = TRS_UI); void reset_transport_speed (TransportRequestSource origin = TRS_UI); - void request_transport_speed (double speed, bool as_default = true, TransportRequestSource origin = TRS_UI); - void request_transport_speed_nonzero (double, bool as_default = true, TransportRequestSource origin = TRS_UI); + + void request_transport_speed (double speed, TransportRequestSource origin = TRS_UI); + void request_transport_speed_nonzero (double, TransportRequestSource origin = TRS_UI); void request_overwrite_buffer (boost::shared_ptr, OverwriteReason); void adjust_playback_buffering(); void adjust_capture_buffering(); @@ -1390,10 +1392,6 @@ private: // varispeed playback -- TODO: move out of session to backend. double _engine_speed; - double _default_transport_speed; - double _default_engine_speed; - double _last_transport_speed; - double _requested_transport_speed; double _signalled_varispeed; bool auto_play_legal; diff --git a/libs/ardour/ardour/transport_fsm.h b/libs/ardour/ardour/transport_fsm.h index 1b3f4d9a8b..2223aa75d9 100644 --- a/libs/ardour/ardour/transport_fsm.h +++ b/libs/ardour/ardour/transport_fsm.h @@ -54,7 +54,6 @@ struct TransportFSM bool force; /* for SetSpeed */ double speed; - bool as_default; Event (EventType t) : type (t) @@ -95,10 +94,9 @@ struct TransportFSM cast double-to-bool and complains. C++11 would allow "= delete" as an alternate fix, but this is fine. */ - Event (double sp, bool ad) + Event (double sp) : type (SetSpeed) , speed (sp) - , as_default (ad) { } @@ -147,7 +145,9 @@ struct TransportFSM std::string current_state () const; double transport_speed() const { return _transport_speed; } + double default_speed() const { return _default_speed; } + void set_default_speed(double spd) const { _default_speed = spd; } private: MotionState _motion_state; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index b4cf5b84bf..1057666596 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -191,8 +191,6 @@ Session::Session (AudioEngine &eng, , _silent (false) , _remaining_latency_preroll (0) , _engine_speed (1.0) - , _last_transport_speed (1.0) - , _requested_transport_speed (std::numeric_limits::max()) , _signalled_varispeed (0) , auto_play_legal (false) , _requested_return_sample (-1) diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc index a87d07795f..8489a65ba6 100644 --- a/libs/ardour/session_export.cc +++ b/libs/ardour/session_export.cc @@ -43,7 +43,7 @@ using namespace ARDOUR; using namespace PBD; #define TFSM_ROLL() { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StartTransport)); } -#define TFSM_SPEED(speed,as_default) { _transport_fsm->enqueue (new TransportFSM::Event (speed,as_default)); } +#define TFSM_SPEED(speed) { _transport_fsm->enqueue (new TransportFSM::Event (speed)); } boost::shared_ptr Session::get_export_handler () @@ -308,7 +308,7 @@ Session::process_export_fw (pframes_t nframes) return; } - TFSM_SPEED (1.0, false); + TFSM_SPEED (1.0); TFSM_ROLL (); _butler->schedule_transport_work (); diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc index 894a86d294..5a135bd25a 100644 --- a/libs/ardour/session_process.cc +++ b/libs/ardour/session_process.cc @@ -63,7 +63,7 @@ using namespace std; #define TFSM_EVENT(evtype) { _transport_fsm->enqueue (new TransportFSM::Event (evtype)); } #define TFSM_ROLL() { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StartTransport)); } #define TFSM_STOP(abort,clear) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StopTransport,abort,clear)); } -#define TFSM_SPEED(speed,as_default) { _transport_fsm->enqueue (new TransportFSM::Event (speed,as_default)); } +#define TFSM_SPEED(speed) { _transport_fsm->enqueue (new TransportFSM::Event (speed)); } #define TFSM_LOCATE(target,ltd,loop,force) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::Locate,target,ltd,loop,force)); } @@ -918,7 +918,7 @@ Session::process_event (SessionEvent* ev) case SessionEvent::SetTransportSpeed: - TFSM_SPEED (ev->speed, ev->yes_or_no); + TFSM_SPEED (ev->speed); break; case SessionEvent::StartRoll: diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 6047603f3d..08dc24fb34 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -86,7 +86,7 @@ using namespace PBD; #define TFSM_EVENT(evtype) { _transport_fsm->enqueue (new TransportFSM::Event (evtype)); } #define TFSM_STOP(abort,clear) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::StopTransport,abort,clear)); } #define TFSM_LOCATE(target,ltd,loop,force) { _transport_fsm->enqueue (new TransportFSM::Event (TransportFSM::Locate,target,ltd,loop,force)); } -#define TFSM_SPEED(speed,as_default) { _transport_fsm->enqueue (new TransportFSM::Event (speed,as_default)); } +#define TFSM_SPEED(speed) { _transport_fsm->enqueue (new TransportFSM::Event (speed)); } /* ***************************************************************************** * REALTIME ACTIONS (to be called on state transitions) @@ -309,6 +309,16 @@ Session::post_locate () } } +/** Set the default speed that is used when we respond to a "play" action. + * @param speed New speed + */ +void +Session::set_default_play_speed (double spd, TransportRequestSource origin) +{ + _transport_fsm->set_default_speed(spd); + TransportStateChange (); /* EMIT SIGNAL */ +} + /** Set the transport speed. * Called from the process thread. * @param speed New speed @@ -743,11 +753,11 @@ Session::request_sync_source (boost::shared_ptr tm) void Session::reset_transport_speed (TransportRequestSource origin) { - request_transport_speed (1.0, true, origin); + request_transport_speed (_transport_fsm->default_speed(), origin); } void -Session::request_transport_speed (double speed, bool as_default, TransportRequestSource origin) +Session::request_transport_speed (double speed, TransportRequestSource origin) { if (synced_to_engine()) { if (speed != 0) { @@ -769,8 +779,7 @@ Session::request_transport_speed (double speed, bool as_default, TransportReques } SessionEvent* ev = new SessionEvent (SessionEvent::SetTransportSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed); - ev->yes_or_no = as_default; // as_default - DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed, as_default)); + DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed)); queue_event (ev); } @@ -779,13 +788,13 @@ Session::request_transport_speed (double speed, bool as_default, TransportReques * be used by callers who are varying transport speed but don't ever want to stop it. */ void -Session::request_transport_speed_nonzero (double speed, bool as_default, TransportRequestSource origin) +Session::request_transport_speed_nonzero (double speed, TransportRequestSource origin) { if (speed == 0) { speed = DBL_EPSILON; } - request_transport_speed (speed, as_default); + request_transport_speed (speed); } void @@ -913,7 +922,7 @@ Session::request_count_in_record () } maybe_enable_record (); _count_in_once = true; - request_transport_speed (1.0, true); + request_transport_speed(_transport_fsm->default_speed()); } void diff --git a/libs/ardour/transport_fsm.cc b/libs/ardour/transport_fsm.cc index c381fbb310..d4ef0cf394 100644 --- a/libs/ardour/transport_fsm.cc +++ b/libs/ardour/transport_fsm.cc @@ -506,7 +506,7 @@ TransportFSM::maybe_reset_speed () if (Config->get_reset_default_speed_on_stop()) { if (most_recently_requested_speed != 1.0) { - state_changed = set_speed (Event (1.0, false)); + state_changed = set_speed (Event (1.0)); } } else { @@ -515,11 +515,11 @@ TransportFSM::maybe_reset_speed () * speed change from whatever we have been rolling at to * whatever the current default is. We could have been * rewinding at -4.5 ... when we restart, we need to play at - * the current _default_transport_speed + * the current _default_speed */ if (most_recently_requested_speed != _default_speed) { - state_changed = set_speed (Event (_default_speed, false)); + state_changed = set_speed (Event (_default_speed)); } } @@ -802,10 +802,6 @@ TransportFSM::set_speed (Event const & ev) most_recently_requested_speed = ev.speed; - if (ev.as_default) { - _default_speed = ev.speed; - } - if (must_reverse) { /* direction change */ diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc index bed2ea464d..8a65cacef6 100644 --- a/libs/surfaces/control_protocol/basic_ui.cc +++ b/libs/surfaces/control_protocol/basic_ui.cc @@ -200,13 +200,13 @@ BasicUI::button_varispeed (bool fwd) if (fwd) { if (transport_speed <= 0) { - session->request_transport_speed (1.0, false); + session->request_transport_speed (1.0); session->request_roll (TRS_UI); return; } } else { if (transport_speed >= 0) { - session->request_transport_speed (-1.0, false); + session->request_transport_speed (-1.0); session->request_roll (TRS_UI); return; } @@ -221,12 +221,12 @@ BasicUI::button_varispeed (bool fwd) if (fwd) { if (transport_speed <= 0) { - session->request_transport_speed (1.0, false); + session->request_transport_speed (1.0); session->request_roll (TRS_UI); } } else { if (transport_speed >= 0) { - session->request_transport_speed (-1.0, false); + session->request_transport_speed (-1.0); session->request_roll (TRS_UI); } } @@ -272,7 +272,7 @@ BasicUI::button_varispeed (bool fwd) speed = semitone_ratio * transport_speed; speed = std::max (-maxspeed, std::min (maxspeed, speed)); - session->request_transport_speed (speed, false); + session->request_transport_speed (speed); session->request_roll (TRS_UI); } @@ -374,7 +374,7 @@ BasicUI::transport_play (bool from_last_start) } if (rolling) { - session->request_transport_speed (1.0, false, TRS_UI); + session->request_transport_speed (1.0, TRS_UI); } else { session->request_roll (); }