fix: add undo support for transport state changes

Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-01 23:28:33 +00:00
parent 2e0770e95d
commit b0ad3b3d19
2 changed files with 71 additions and 4 deletions

View File

@@ -441,17 +441,53 @@ void engine_process_commands(Engine *engine) {
engine_redo(engine);
break;
case CMD_TRANSPORT_PLAY:
case CMD_TRANSPORT_PLAY: {
// Record undo action
UndoAction action;
action.type = ACTION_TRANSPORT_STATE_CHANGE;
action.index = 0;
action.value = (jack_nframes_t)engine->transport->state;
action.previous_clock_count = engine->transport->clock_count;
action.previous_beat_position = engine->transport->beat_position;
action.previous_bar_position = engine->transport->bar_position;
action.previous_sample_position = engine->transport->sample_position;
engine_push_undo_action(engine, &action);
transport_play(engine->transport);
break;
}
case CMD_TRANSPORT_PAUSE: {
// Record undo action
UndoAction action;
action.type = ACTION_TRANSPORT_STATE_CHANGE;
action.index = 0;
action.value = (jack_nframes_t)engine->transport->state;
action.previous_clock_count = engine->transport->clock_count;
action.previous_beat_position = engine->transport->beat_position;
action.previous_bar_position = engine->transport->bar_position;
action.previous_sample_position = engine->transport->sample_position;
engine_push_undo_action(engine, &action);
case CMD_TRANSPORT_PAUSE:
transport_pause(engine->transport);
break;
}
case CMD_TRANSPORT_STOP: {
// Record undo action
UndoAction action;
action.type = ACTION_TRANSPORT_STATE_CHANGE;
action.index = 0;
action.value = (jack_nframes_t)engine->transport->state;
action.previous_clock_count = engine->transport->clock_count;
action.previous_beat_position = engine->transport->beat_position;
action.previous_bar_position = engine->transport->bar_position;
action.previous_sample_position = engine->transport->sample_position;
engine_push_undo_action(engine, &action);
case CMD_TRANSPORT_STOP:
transport_stop(engine->transport);
break;
}
case CMD_TRANSPORT_TOGGLE_PLAY:
transport_toggle_play(engine->transport);
@@ -571,6 +607,21 @@ void engine_undo(Engine *engine) {
atomic_store(&engine->transport->sample_position_atomic, action->previous_sample_position);
break;
}
case ACTION_TRANSPORT_STATE_CHANGE: {
TransportState prev_state = (TransportState)action->value;
engine->transport->state = prev_state;
engine->transport->clock_count = action->previous_clock_count;
engine->transport->beat_position = action->previous_beat_position;
engine->transport->bar_position = action->previous_bar_position;
engine->transport->sample_position = action->previous_sample_position;
atomic_store(&engine->transport->state_atomic, prev_state);
atomic_store(&engine->transport->clock_count_atomic, action->previous_clock_count);
atomic_store(&engine->transport->beat_position_atomic, action->previous_beat_position);
atomic_store(&engine->transport->bar_position_atomic, action->previous_bar_position);
atomic_store(&engine->transport->sample_position_atomic, action->previous_sample_position);
break;
}
}
history->undo_index--;
@@ -688,6 +739,21 @@ void engine_redo(Engine *engine) {
atomic_store(&engine->transport->sample_position_atomic, 0);
break;
}
case ACTION_TRANSPORT_STATE_CHANGE: {
TransportState prev_state = (TransportState)action->value;
engine->transport->state = prev_state;
engine->transport->clock_count = action->previous_clock_count;
engine->transport->beat_position = action->previous_beat_position;
engine->transport->bar_position = action->previous_bar_position;
engine->transport->sample_position = action->previous_sample_position;
atomic_store(&engine->transport->state_atomic, prev_state);
atomic_store(&engine->transport->clock_count_atomic, action->previous_clock_count);
atomic_store(&engine->transport->beat_position_atomic, action->previous_beat_position);
atomic_store(&engine->transport->bar_position_atomic, action->previous_bar_position);
atomic_store(&engine->transport->sample_position_atomic, action->previous_sample_position);
break;
}
}
history->undo_index++;