From b0ad3b3d19dfed3ed7942f4fabc5dce55509477b Mon Sep 17 00:00:00 2001 From: Loic Coenen Date: Fri, 1 May 2026 23:28:33 +0000 Subject: [PATCH] fix: add undo support for transport state changes Co-authored-by: aider (deepseek/deepseek-coder) --- engine.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- engine.h | 3 ++- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/engine.c b/engine.c index fc17955..826f2db 100644 --- a/engine.c +++ b/engine.c @@ -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++; diff --git a/engine.h b/engine.h index 88e3c88..288b90e 100644 --- a/engine.h +++ b/engine.h @@ -69,7 +69,8 @@ typedef enum { ACTION_RESET_CLIP, ACTION_SET_QUANTIZE_MODE, ACTION_SET_QUANTIZE_THRESHOLD, - ACTION_RESET_TRANSPORT + ACTION_RESET_TRANSPORT, + ACTION_TRANSPORT_STATE_CHANGE } ActionType; // Undo/Redo action record