fix: prevent hang in scene add/remove test and fix unsafe scene copy
Co-authored-by: aider (deepseek/deepseek-reasoner) <aider@aider.chat>
This commit is contained in:
@@ -91,9 +91,18 @@ void channel_remove_scene(jack_client_t *client, int idx) {
|
||||
if (cur[idx].scene_count <= 1)
|
||||
return;
|
||||
int cs = cur[idx].current_scene;
|
||||
/* shift remaining scenes down */
|
||||
/* shift remaining scenes down (safe copy of fields) */
|
||||
for (int i = cs; i < cur[idx].scene_count - 1; i++) {
|
||||
cur[idx].scenes[i] = cur[idx].scenes[i + 1];
|
||||
cur[idx].scenes[i].loop_count = cur[idx].scenes[i+1].loop_count;
|
||||
cur[idx].scenes[i].record_pos = cur[idx].scenes[i+1].record_pos;
|
||||
cur[idx].scenes[i].playback_pos = cur[idx].scenes[i+1].playback_pos;
|
||||
atomic_store(&cur[idx].scenes[i].state,
|
||||
atomic_load(&cur[idx].scenes[i+1].state));
|
||||
cur[idx].scenes[i].prev_state = cur[idx].scenes[i+1].prev_state;
|
||||
/* copy loop data */
|
||||
memcpy(cur[idx].scenes[i].loop.audio_buffer,
|
||||
cur[idx].scenes[i+1].loop.audio_buffer,
|
||||
LOOP_BUF_SIZE * sizeof(float));
|
||||
}
|
||||
cur[idx].scene_count--;
|
||||
if (cur[idx].current_scene >= cur[idx].scene_count)
|
||||
|
||||
Reference in New Issue
Block a user