fix: allocate AppState on heap to prevent stack overflow

Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
This commit is contained in:
Loic Coenen
2026-05-03 18:56:14 +00:00
parent cf181ac67a
commit 124f4620f9

52
main.c
View File

@@ -71,49 +71,51 @@ int main(int argc, char *argv[]) {
}
}
// Create initial state
AppState initial_state;
memset(&initial_state, 0, sizeof(AppState));
initial_state.transport_state = TRANSPORT_STOPPED;
initial_state.clock_source = CLOCK_SOURCE_INTERNAL;
initial_state.bpm = 120.0;
initial_state.quantize_mode = QUANTIZE_OFF;
initial_state.quantize_threshold = 0;
initial_state.running = true;
// Create initial state (heap-allocated to avoid stack overflow)
AppState *initial_state = calloc(1, sizeof(AppState));
if (!initial_state) {
fprintf(stderr, "Failed to allocate initial state\n");
return 1;
}
initial_state->transport_state = TRANSPORT_STOPPED;
initial_state->clock_source = CLOCK_SOURCE_INTERNAL;
initial_state->bpm = 120.0;
initial_state->quantize_mode = QUANTIZE_OFF;
initial_state->quantize_threshold = 0;
initial_state->running = true;
for (int i = 0; i < MAX_CLIPS; i++) {
initial_state.clips[i].state = CLIP_EMPTY;
initial_state.clips[i].buffer = (float *)calloc(MAX_BUFFER_SIZE, sizeof(float));
if (!initial_state.clips[i].buffer) {
initial_state->clips[i].state = CLIP_EMPTY;
initial_state->clips[i].buffer = (float *)calloc(MAX_BUFFER_SIZE, sizeof(float));
if (!initial_state->clips[i].buffer) {
fprintf(stderr, "Failed to allocate buffer for clip %d\n", i);
// Cleanup previously allocated buffers
for (int j = 0; j < i; j++) {
free(initial_state.clips[j].buffer);
free(initial_state->clips[j].buffer);
}
free(initial_state);
return 1;
}
initial_state.clips[i].buffer_size = 0;
initial_state.clips[i].write_position = 0;
initial_state.clips[i].read_position = 0;
initial_state->clips[i].buffer_size = 0;
initial_state->clips[i].write_position = 0;
initial_state->clips[i].read_position = 0;
// Initialize MIDI clips
initial_state.midi_clips[i].state = CLIP_EMPTY;
initial_state.midi_clips[i].event_count = 0;
initial_state.midi_clips[i].read_index = 0;
initial_state->midi_clips[i].state = CLIP_EMPTY;
initial_state->midi_clips[i].event_count = 0;
initial_state->midi_clips[i].read_index = 0;
}
// Initialize channel names
for (int ch = 0; ch < MAX_CHANNELS; ch++) {
snprintf(initial_state.channel_names[ch], 64, "Channel %d", ch);
snprintf(initial_state->channel_names[ch], 64, "Channel %d", ch);
}
initial_state.show_midi_grid = false;
initial_state->show_midi_grid = false;
// Carla host is now initialized in engine_init
// Initialize dispatcher
dispatch = dispatcher_init(&initial_state);
// Free the heap-allocated initial state
// (dispatcher_init copies the state via memcpy)
dispatch = dispatcher_init(initial_state);
free(initial_state);
// Initialize filesystem module (auto-save thread)
fs_init(&initial_state);