fix: add undo support for transport state changes
Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
72
engine.c
72
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++;
|
||||
|
||||
Reference in New Issue
Block a user