diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2020-02-21 11:50:52 -0700 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2020-02-21 11:54:08 -0700 |
commit | f0316430c62fcef19bd3eb79054f471bc5bdb34b (patch) | |
tree | 44e3dc27946feec42b4d4d1f416a1e2218503927 | |
parent | 2fb260e6e8d0ba06a34696b2a4d20648fcbed0b3 (diff) |
make "reversing" back into a DirectionState and prohibit speed changes while reversing
-rw-r--r-- | libs/ardour/ardour/transport_fsm.h | 2 | ||||
-rw-r--r-- | libs/ardour/transport_fsm.cc | 33 |
2 files changed, 22 insertions, 13 deletions
diff --git a/libs/ardour/ardour/transport_fsm.h b/libs/ardour/ardour/transport_fsm.h index dce30cb665..9daeaf5b63 100644 --- a/libs/ardour/ardour/transport_fsm.h +++ b/libs/ardour/ardour/transport_fsm.h @@ -184,6 +184,7 @@ struct TransportFSM bool declicking_for_locate() const { return _motion_state == DeclickToLocate; } bool forwards() const { return _direction_state == Forwards; } bool backwards() const { return _direction_state == Backwards; } + bool reversing() const { return _direction_state == Reversing; } bool will_roll_fowards() const; void enqueue (Event* ev); @@ -207,7 +208,6 @@ struct TransportFSM int processing; mutable boost::optional<bool> current_roll_after_locate_status; double most_recently_requested_speed; - bool _reversing; void defer (Event& ev); void bad_transition (Event const &); diff --git a/libs/ardour/transport_fsm.cc b/libs/ardour/transport_fsm.cc index 6b8ee1fd61..85f004f082 100644 --- a/libs/ardour/transport_fsm.cc +++ b/libs/ardour/transport_fsm.cc @@ -203,16 +203,26 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred) switch (ev.type) { case SetSpeed: - switch (_motion_state) { - case Stopped: - case Rolling: - set_speed (ev); - break; - default: + switch (_direction_state) { + case Reversing: if (!already_deferred) { defer (ev); deferred = true; } + break; + default: + switch (_motion_state) { + case Stopped: + case Rolling: + set_speed (ev); + break; + default: + if (!already_deferred) { + defer (ev); + deferred = true; + } + } + break; } break; @@ -315,10 +325,7 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred) switch (_motion_state) { case WaitingForLocate: - if (_reversing) { - - _reversing = false; - transition (Rolling); + if (reversing()) { if (most_recently_requested_speed > 0) { transition (Forwards); @@ -326,6 +333,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred) transition (Forwards); } + transition (Rolling); + api->set_transport_speed (last_speed_request.speed, last_speed_request.abort_capture, last_speed_request.clear_state, last_speed_request.as_default); if (most_recently_requested_speed != 0.0) { @@ -617,7 +626,7 @@ TransportFSM::set_speed (Event const & ev) most_recently_requested_speed = ev.speed; last_speed_request = ev; - _reversing = true; + transition (Reversing); DEBUG_TRACE (DEBUG::TFSMState, string_compose ("reverse, target speed %1 MRRS %2 state %3\n", ev.speed, most_recently_requested_speed, current_state())); @@ -638,7 +647,7 @@ TransportFSM::set_speed (Event const & ev) bool TransportFSM::will_roll_fowards () const { - if (_reversing) { + if (reversing()) { return most_recently_requested_speed >= 0; /* note: future speed of zero is equivalent to Forwards */ } return (_direction_state == Forwards); |