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);
|
engine_redo(engine);
|
||||||
break;
|
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);
|
transport_play(engine->transport);
|
||||||
break;
|
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);
|
transport_pause(engine->transport);
|
||||||
break;
|
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);
|
transport_stop(engine->transport);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case CMD_TRANSPORT_TOGGLE_PLAY:
|
case CMD_TRANSPORT_TOGGLE_PLAY:
|
||||||
transport_toggle_play(engine->transport);
|
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);
|
atomic_store(&engine->transport->sample_position_atomic, action->previous_sample_position);
|
||||||
break;
|
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--;
|
history->undo_index--;
|
||||||
@@ -688,6 +739,21 @@ void engine_redo(Engine *engine) {
|
|||||||
atomic_store(&engine->transport->sample_position_atomic, 0);
|
atomic_store(&engine->transport->sample_position_atomic, 0);
|
||||||
break;
|
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++;
|
history->undo_index++;
|
||||||
|
|||||||
3
engine.h
3
engine.h
@@ -69,7 +69,8 @@ typedef enum {
|
|||||||
ACTION_RESET_CLIP,
|
ACTION_RESET_CLIP,
|
||||||
ACTION_SET_QUANTIZE_MODE,
|
ACTION_SET_QUANTIZE_MODE,
|
||||||
ACTION_SET_QUANTIZE_THRESHOLD,
|
ACTION_SET_QUANTIZE_THRESHOLD,
|
||||||
ACTION_RESET_TRANSPORT
|
ACTION_RESET_TRANSPORT,
|
||||||
|
ACTION_TRANSPORT_STATE_CHANGE
|
||||||
} ActionType;
|
} ActionType;
|
||||||
|
|
||||||
// Undo/Redo action record
|
// Undo/Redo action record
|
||||||
|
|||||||
Reference in New Issue
Block a user