diff --git a/libs/ardour/ardour/transport_fsm.h b/libs/ardour/ardour/transport_fsm.h index 1119f87111..2d88fca555 100644 --- a/libs/ardour/ardour/transport_fsm.h +++ b/libs/ardour/ardour/transport_fsm.h @@ -209,6 +209,7 @@ struct TransportFSM mutable boost::optional current_roll_after_locate_status; mutable double most_recently_requested_speed; mutable double _default_speed; + int _reverse_after_declick; void defer (Event& ev); void bad_transition (Event const &); diff --git a/libs/ardour/transport_fsm.cc b/libs/ardour/transport_fsm.cc index 631320328d..cba4082217 100644 --- a/libs/ardour/transport_fsm.cc +++ b/libs/ardour/transport_fsm.cc @@ -88,6 +88,7 @@ TransportFSM::TransportFSM (TransportAPI& tapi) , processing (0) , most_recently_requested_speed (std::numeric_limits::max()) , _default_speed (1.0) + , _reverse_after_declick (0) { init (); } @@ -419,6 +420,9 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred) case DeclickDone: switch (_motion_state) { case DeclickToLocate: + if (_reverse_after_declick) { + transition (Reversing); + } transition (WaitingForLocate); start_locate_after_declick (); break; @@ -598,7 +602,7 @@ TransportFSM::start_locate_after_declick () double post_locate_speed; - if (api->user_roll_after_locate()) { + if (api->user_roll_after_locate() && !_reverse_after_declick) { post_locate_speed = _default_speed; } else { post_locate_speed = most_recently_requested_speed; @@ -609,6 +613,12 @@ TransportFSM::start_locate_after_declick () transition (Reversing); } + DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("post-locate speed will be %1 based on user-roll-after %2 and r-a-dc %3\n", post_locate_speed, api->user_roll_after_locate(), _reverse_after_declick)); + + if (_reverse_after_declick) { + _reverse_after_declick--; + } + if (api->user_roll_after_locate()) { most_recently_requested_speed = post_locate_speed; } @@ -797,14 +807,14 @@ TransportFSM::set_speed (Event const & ev) DEBUG_TRACE (DEBUG::TFSMState, string_compose ("switch-directions, target speed %1 state %2 IR %3\n", ev.speed, current_state(), initial_reverse)); - transition (Reversing); - Event lev (Locate, api->position(), must_roll ? MustRoll : MustStop, false, true); if (_transport_speed) { + _reverse_after_declick++; transition (DeclickToLocate); start_declick_for_locate (lev); } else { + transition (Reversing); transition (WaitingForLocate); start_locate_while_stopped (lev); } @@ -814,7 +824,7 @@ TransportFSM::set_speed (Event const & ev) bool TransportFSM::will_roll_fowards () const { - if (reversing()) { + if (reversing() || _reverse_after_declick) { return most_recently_requested_speed >= 0; /* note: future speed of zero is equivalent to Forwards */ } return (_direction_state == Forwards);