mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 03:36:32 +01:00
fix thinko in TransportFSM's handling of deferred events
If a deferred event was used in process_event() but was deferred again, we deleted it. That was wrong, it should remain in the deferred_events queue.
This commit is contained in:
parent
11416bf9d1
commit
79f1ff3df3
1 changed files with 18 additions and 10 deletions
|
|
@ -83,6 +83,7 @@ TransportFSM::process_events ()
|
|||
|
||||
MotionState oms = _motion_state;
|
||||
ButlerState obs = _butler_state;
|
||||
DirectionState ods = _direction_state;
|
||||
|
||||
Event* ev = &queued_events.front();
|
||||
bool deferred;
|
||||
|
|
@ -98,23 +99,30 @@ TransportFSM::process_events ()
|
|||
|
||||
if (process_event (*ev, false, deferred)) { /* event processed successfully */
|
||||
|
||||
if (oms != _motion_state || obs != _butler_state) {
|
||||
if (oms != _motion_state || obs != _butler_state || ods != _direction_state) {
|
||||
|
||||
/* state changed, so now check deferred events
|
||||
* to see if they can be processed now
|
||||
*/
|
||||
|
||||
if (!deferred_events.empty() ){
|
||||
|
||||
DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("processing %1 deferred events\n", deferred_events.size()));
|
||||
|
||||
for (EventList::iterator e = deferred_events.begin(); e != deferred_events.end(); ) {
|
||||
Event* deferred_ev = &(*e);
|
||||
bool deferred2;
|
||||
if (process_event (*e, true, deferred2)) { /* event processed, remove from deferred */
|
||||
e = deferred_events.erase (e);
|
||||
delete deferred_ev;
|
||||
} else {
|
||||
|
||||
if (process_event (*e, true, deferred2)) {
|
||||
if (!deferred2) { /* event processed and not deferred again, remove from deferred */
|
||||
e = deferred_events.erase (e);
|
||||
delete deferred_ev;
|
||||
} else {
|
||||
++e;
|
||||
}
|
||||
} else { /* process error or deferred (again) */
|
||||
++e;
|
||||
delete deferred_ev;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -210,8 +218,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
|||
case Reversing:
|
||||
if (!already_deferred) {
|
||||
defer (ev);
|
||||
deferred = true;
|
||||
}
|
||||
deferred = true;
|
||||
break;
|
||||
default:
|
||||
switch (_motion_state) {
|
||||
|
|
@ -222,8 +230,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
|||
default:
|
||||
if (!already_deferred) {
|
||||
defer (ev);
|
||||
deferred = true;
|
||||
}
|
||||
deferred = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -241,14 +249,14 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
|||
case WaitingForLocate:
|
||||
if (!already_deferred) {
|
||||
defer (ev);
|
||||
deferred = true;
|
||||
}
|
||||
deferred = true;
|
||||
break;
|
||||
case DeclickToStop:
|
||||
if (!already_deferred) {
|
||||
defer (ev);
|
||||
deferred = true;
|
||||
}
|
||||
deferred = true;
|
||||
break;
|
||||
default:
|
||||
bad_transition (ev); return false;
|
||||
|
|
@ -268,8 +276,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
|||
case WaitingForLocate:
|
||||
if (!already_deferred) {
|
||||
defer (ev);
|
||||
deferred = true;
|
||||
}
|
||||
deferred = true;
|
||||
break;
|
||||
case DeclickToStop:
|
||||
/* already doing it */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue