mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-10 08:36:32 +01:00
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
This commit is contained in:
parent
97167ed927
commit
bfd52fd94d
2 changed files with 15 additions and 4 deletions
|
|
@ -209,6 +209,7 @@ struct TransportFSM
|
||||||
mutable boost::optional<bool> current_roll_after_locate_status;
|
mutable boost::optional<bool> current_roll_after_locate_status;
|
||||||
mutable double most_recently_requested_speed;
|
mutable double most_recently_requested_speed;
|
||||||
mutable double _default_speed;
|
mutable double _default_speed;
|
||||||
|
int _reverse_after_declick;
|
||||||
|
|
||||||
void defer (Event& ev);
|
void defer (Event& ev);
|
||||||
void bad_transition (Event const &);
|
void bad_transition (Event const &);
|
||||||
|
|
|
||||||
|
|
@ -88,6 +88,7 @@ TransportFSM::TransportFSM (TransportAPI& tapi)
|
||||||
, processing (0)
|
, processing (0)
|
||||||
, most_recently_requested_speed (std::numeric_limits<double>::max())
|
, most_recently_requested_speed (std::numeric_limits<double>::max())
|
||||||
, _default_speed (1.0)
|
, _default_speed (1.0)
|
||||||
|
, _reverse_after_declick (0)
|
||||||
{
|
{
|
||||||
init ();
|
init ();
|
||||||
}
|
}
|
||||||
|
|
@ -419,6 +420,9 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
||||||
case DeclickDone:
|
case DeclickDone:
|
||||||
switch (_motion_state) {
|
switch (_motion_state) {
|
||||||
case DeclickToLocate:
|
case DeclickToLocate:
|
||||||
|
if (_reverse_after_declick) {
|
||||||
|
transition (Reversing);
|
||||||
|
}
|
||||||
transition (WaitingForLocate);
|
transition (WaitingForLocate);
|
||||||
start_locate_after_declick ();
|
start_locate_after_declick ();
|
||||||
break;
|
break;
|
||||||
|
|
@ -598,7 +602,7 @@ TransportFSM::start_locate_after_declick ()
|
||||||
|
|
||||||
double post_locate_speed;
|
double post_locate_speed;
|
||||||
|
|
||||||
if (api->user_roll_after_locate()) {
|
if (api->user_roll_after_locate() && !_reverse_after_declick) {
|
||||||
post_locate_speed = _default_speed;
|
post_locate_speed = _default_speed;
|
||||||
} else {
|
} else {
|
||||||
post_locate_speed = most_recently_requested_speed;
|
post_locate_speed = most_recently_requested_speed;
|
||||||
|
|
@ -609,6 +613,12 @@ TransportFSM::start_locate_after_declick ()
|
||||||
transition (Reversing);
|
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()) {
|
if (api->user_roll_after_locate()) {
|
||||||
most_recently_requested_speed = post_locate_speed;
|
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));
|
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);
|
Event lev (Locate, api->position(), must_roll ? MustRoll : MustStop, false, true);
|
||||||
|
|
||||||
if (_transport_speed) {
|
if (_transport_speed) {
|
||||||
|
_reverse_after_declick++;
|
||||||
transition (DeclickToLocate);
|
transition (DeclickToLocate);
|
||||||
start_declick_for_locate (lev);
|
start_declick_for_locate (lev);
|
||||||
} else {
|
} else {
|
||||||
|
transition (Reversing);
|
||||||
transition (WaitingForLocate);
|
transition (WaitingForLocate);
|
||||||
start_locate_while_stopped (lev);
|
start_locate_while_stopped (lev);
|
||||||
}
|
}
|
||||||
|
|
@ -814,7 +824,7 @@ TransportFSM::set_speed (Event const & ev)
|
||||||
bool
|
bool
|
||||||
TransportFSM::will_roll_fowards () const
|
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 most_recently_requested_speed >= 0; /* note: future speed of zero is equivalent to Forwards */
|
||||||
}
|
}
|
||||||
return (_direction_state == Forwards);
|
return (_direction_state == Forwards);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue