4-implement-scene-switching-engine #4

Merged
boomjacky merged 16 commits from 4-implement-scene-switching-engine into master 2026-05-13 12:51:04 -04:00
2 changed files with 65 additions and 11 deletions
Showing only changes of commit 1ba98fc768 - Show all commits

View File

@@ -91,9 +91,18 @@ void channel_remove_scene(jack_client_t *client, int idx) {
if (cur[idx].scene_count <= 1) if (cur[idx].scene_count <= 1)
return; return;
int cs = cur[idx].current_scene; 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++) { 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--; cur[idx].scene_count--;
if (cur[idx].current_scene >= cur[idx].scene_count) if (cur[idx].current_scene >= cur[idx].scene_count)

View File

@@ -1135,35 +1135,80 @@ static int write_fifo(const char *cmd) {
static int test_scene_add_remove(void) { static int test_scene_add_remove(void) {
printf("Test: scene add/remove via FIFO\n"); printf("Test: scene add/remove via FIFO\n");
fflush(stdout);
pid_t pid = start_looper(); pid_t pid = start_looper();
if (pid < 0) return 1; if (pid < 0) return 1;
/* add a scene */ printf(" sending scene_add...\n");
fflush(stdout);
if (!write_fifo("scene_add\n")) { if (!write_fifo("scene_add\n")) {
kill(pid, SIGTERM); waitpid(pid, NULL, 0); kill(pid, SIGTERM);
for (int tries = 0; tries < 20; tries++) {
int wstatus;
pid_t ret = waitpid(pid, &wstatus, WNOHANG);
if (ret == pid) break;
if (ret < 0) break;
safe_usleep(100000);
}
kill(pid, SIGKILL); waitpid(pid, NULL, 0);
fprintf(stderr, " FAIL: cannot write to FIFO\n"); fprintf(stderr, " FAIL: cannot write to FIFO\n");
return 1; return 1;
} }
safe_usleep(50000); /* allow processing */ safe_usleep(50000); /* allow processing */
/* verify that scene_next works (doesn't crash) */ printf(" sending scene_next...\n");
fflush(stdout);
if (!write_fifo("scene_next\n")) { if (!write_fifo("scene_next\n")) {
kill(pid, SIGTERM); waitpid(pid, NULL, 0); kill(pid, SIGTERM);
for (int tries = 0; tries < 20; tries++) {
int wstatus;
pid_t ret = waitpid(pid, &wstatus, WNOHANG);
if (ret == pid) break;
if (ret < 0) break;
safe_usleep(100000);
}
kill(pid, SIGKILL); waitpid(pid, NULL, 0);
return 1; return 1;
} }
safe_usleep(50000); safe_usleep(50000);
/* remove scene */ printf(" sending scene_remove...\n");
fflush(stdout);
if (!write_fifo("scene_remove\n")) { if (!write_fifo("scene_remove\n")) {
kill(pid, SIGTERM); waitpid(pid, NULL, 0); kill(pid, SIGTERM);
for (int tries = 0; tries < 20; tries++) {
int wstatus;
pid_t ret = waitpid(pid, &wstatus, WNOHANG);
if (ret == pid) break;
if (ret < 0) break;
safe_usleep(100000);
}
kill(pid, SIGKILL); waitpid(pid, NULL, 0);
return 1; return 1;
} }
safe_usleep(50000); safe_usleep(50000);
kill(pid, SIGTERM); waitpid(pid, NULL, 0); /* kill with timeout */
printf(" PASS (no crash means success)\n"); kill(pid, SIGTERM);
for (int tries = 0; tries < 20; tries++) {
int wstatus;
pid_t ret = waitpid(pid, &wstatus, WNOHANG);
if (ret == pid) {
printf(" PASS (scene add/remove, looper exited)\n");
fflush(stdout);
return 0; return 0;
} }
if (ret < 0) {
perror("waitpid");
break;
}
safe_usleep(100000); /* 100ms */
}
kill(pid, SIGKILL);
waitpid(pid, NULL, 0);
fprintf(stderr, " FAIL: looper did not exit in time\n");
return 1;
}
static int test_scene_next_prev_midi(void) { static int test_scene_next_prev_midi(void) {
printf("Test: scene next/prev via MIDI control key\n"); printf("Test: scene next/prev via MIDI control key\n");