mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 11:46:25 +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;
|
MotionState oms = _motion_state;
|
||||||
ButlerState obs = _butler_state;
|
ButlerState obs = _butler_state;
|
||||||
|
DirectionState ods = _direction_state;
|
||||||
|
|
||||||
Event* ev = &queued_events.front();
|
Event* ev = &queued_events.front();
|
||||||
bool deferred;
|
bool deferred;
|
||||||
|
|
@ -98,23 +99,30 @@ TransportFSM::process_events ()
|
||||||
|
|
||||||
if (process_event (*ev, false, deferred)) { /* event processed successfully */
|
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
|
/* state changed, so now check deferred events
|
||||||
* to see if they can be processed now
|
* to see if they can be processed now
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!deferred_events.empty() ){
|
if (!deferred_events.empty() ){
|
||||||
|
|
||||||
DEBUG_TRACE (DEBUG::TFSMEvents, string_compose ("processing %1 deferred events\n", deferred_events.size()));
|
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(); ) {
|
for (EventList::iterator e = deferred_events.begin(); e != deferred_events.end(); ) {
|
||||||
Event* deferred_ev = &(*e);
|
Event* deferred_ev = &(*e);
|
||||||
bool deferred2;
|
bool deferred2;
|
||||||
if (process_event (*e, true, deferred2)) { /* event processed, remove from deferred */
|
|
||||||
e = deferred_events.erase (e);
|
if (process_event (*e, true, deferred2)) {
|
||||||
delete deferred_ev;
|
if (!deferred2) { /* event processed and not deferred again, remove from deferred */
|
||||||
} else {
|
e = deferred_events.erase (e);
|
||||||
|
delete deferred_ev;
|
||||||
|
} else {
|
||||||
|
++e;
|
||||||
|
}
|
||||||
|
} else { /* process error or deferred (again) */
|
||||||
++e;
|
++e;
|
||||||
|
delete deferred_ev;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -210,8 +218,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
||||||
case Reversing:
|
case Reversing:
|
||||||
if (!already_deferred) {
|
if (!already_deferred) {
|
||||||
defer (ev);
|
defer (ev);
|
||||||
deferred = true;
|
|
||||||
}
|
}
|
||||||
|
deferred = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
switch (_motion_state) {
|
switch (_motion_state) {
|
||||||
|
|
@ -222,8 +230,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
||||||
default:
|
default:
|
||||||
if (!already_deferred) {
|
if (!already_deferred) {
|
||||||
defer (ev);
|
defer (ev);
|
||||||
deferred = true;
|
|
||||||
}
|
}
|
||||||
|
deferred = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -241,14 +249,14 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
||||||
case WaitingForLocate:
|
case WaitingForLocate:
|
||||||
if (!already_deferred) {
|
if (!already_deferred) {
|
||||||
defer (ev);
|
defer (ev);
|
||||||
deferred = true;
|
|
||||||
}
|
}
|
||||||
|
deferred = true;
|
||||||
break;
|
break;
|
||||||
case DeclickToStop:
|
case DeclickToStop:
|
||||||
if (!already_deferred) {
|
if (!already_deferred) {
|
||||||
defer (ev);
|
defer (ev);
|
||||||
deferred = true;
|
|
||||||
}
|
}
|
||||||
|
deferred = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
bad_transition (ev); return false;
|
bad_transition (ev); return false;
|
||||||
|
|
@ -268,8 +276,8 @@ TransportFSM::process_event (Event& ev, bool already_deferred, bool& deferred)
|
||||||
case WaitingForLocate:
|
case WaitingForLocate:
|
||||||
if (!already_deferred) {
|
if (!already_deferred) {
|
||||||
defer (ev);
|
defer (ev);
|
||||||
deferred = true;
|
|
||||||
}
|
}
|
||||||
|
deferred = true;
|
||||||
break;
|
break;
|
||||||
case DeclickToStop:
|
case DeclickToStop:
|
||||||
/* already doing it */
|
/* already doing it */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue