From bfd52fd94dbe9b28c6e9a57ff9f67042dc826ddc Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 6 May 2021 19:40:00 -0600 Subject: [PATCH] TransportFSM: do not enter Reversing state too early We do need to know that a reversal is intended before we do a locate, but we should not enter Reversing before the declick is finished. So instead, we add a new member, _reverse_after_declick to keep track, and enter Reversing just before we start the locate --- libs/ardour/ardour/transport_fsm.h | 1 + libs/ardour/transport_fsm.cc | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) 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);