diff --git a/src/pipe.c b/src/pipe.c index ae6d553..7fbf8ca 100644 --- a/src/pipe.c +++ b/src/pipe.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -19,58 +20,67 @@ extern spsc_queue_t cmd_queue_main_fifo; static void *pipe_thread_func(void *arg) { (void)arg; - FILE *fifo = fopen(FIFO_PATH, "r"); - if (!fifo) { - perror("fopen fifo"); - return NULL; - } char line[LINE_MAX]; - while (fgets(line, sizeof(line), fifo)) { - /* strip newline */ - size_t len = strlen(line); - if (len > 0 && line[len - 1] == '\n') - line[len - 1] = '\0'; - if (strcmp(line, "add") == 0) { - command_t cmd = {.type = CMD_ADD_CHANNEL, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); - } else if (strcmp(line, "add_midi") == 0) { - command_t cmd = {.type = CMD_ADD_MIDI_CHANNEL, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); - } else if (strcmp(line, "remove") == 0) { - command_t cmd = {.type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); - } else if (strncmp(line, "record ", 7) == 0) { - int ch = atoi(line + 7); - command_t cmd = {.type = CMD_CYCLE, .channel = ch, .data = 0}; - queue_push(&cmd_queue, cmd); - } else if (strcmp(line, "stop") == 0) { - command_t cmd = {.type = CMD_STOP, .channel = -1, .data = 0}; - queue_push(&cmd_queue, cmd); - } else if (strncmp(line, "bind ", 5) == 0) { - int ch = atoi(line + 5); - command_t cmd = {.type = CMD_BIND_CHANNEL, .channel = -1, .data = ch}; - queue_push(&cmd_queue, cmd); - } else if (strcmp(line, "unbind") == 0) { - command_t cmd = {.type = CMD_UNBIND, .channel = -1, .data = 0}; - queue_push(&cmd_queue, cmd); - } else if (strcmp(line, "scene_add") == 0) { - command_t cmd = {.type = CMD_ADD_SCENE, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); - } else if (strcmp(line, "scene_remove") == 0) { - command_t cmd = {.type = CMD_REMOVE_SCENE, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); - } else if (strcmp(line, "scene_next") == 0) { - command_t cmd = {.type = CMD_NEXT_SCENE, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); - } else if (strcmp(line, "scene_prev") == 0) { - command_t cmd = {.type = CMD_PREV_SCENE, .channel = -1, .data = 0}; - queue_push(&cmd_queue_main_fifo, cmd); + while (1) { + FILE *fifo = fopen(FIFO_PATH, "r"); + if (!fifo) { + perror("fopen fifo"); + return NULL; } - /* ignore unknown lines */ + + while (fgets(line, sizeof(line), fifo)) { + /* strip newline */ + size_t len = strlen(line); + if (len > 0 && line[len - 1] == '\n') + line[len - 1] = '\0'; + + if (strcmp(line, "add") == 0) { + command_t cmd = {.type = CMD_ADD_CHANNEL, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } else if (strcmp(line, "add_midi") == 0) { + command_t cmd = {.type = CMD_ADD_MIDI_CHANNEL, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } else if (strcmp(line, "remove") == 0) { + command_t cmd = {.type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } else if (strncmp(line, "record ", 7) == 0) { + int ch = atoi(line + 7); + command_t cmd = {.type = CMD_CYCLE, .channel = ch, .data = 0}; + queue_push(&cmd_queue, cmd); + } else if (strcmp(line, "stop") == 0) { + command_t cmd = {.type = CMD_STOP, .channel = -1, .data = 0}; + queue_push(&cmd_queue, cmd); + } else if (strncmp(line, "bind ", 5) == 0) { + int ch = atoi(line + 5); + command_t cmd = {.type = CMD_BIND_CHANNEL, .channel = -1, .data = ch}; + queue_push(&cmd_queue, cmd); + } else if (strcmp(line, "unbind") == 0) { + command_t cmd = {.type = CMD_UNBIND, .channel = -1, .data = 0}; + queue_push(&cmd_queue, cmd); + } else if (strcmp(line, "scene_add") == 0) { + command_t cmd = {.type = CMD_ADD_SCENE, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } else if (strcmp(line, "scene_remove") == 0) { + command_t cmd = {.type = CMD_REMOVE_SCENE, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } else if (strcmp(line, "scene_next") == 0) { + command_t cmd = {.type = CMD_NEXT_SCENE, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } else if (strcmp(line, "scene_prev") == 0) { + command_t cmd = {.type = CMD_PREV_SCENE, .channel = -1, .data = 0}; + queue_push(&cmd_queue_main_fifo, cmd); + } + /* ignore unknown lines */ + } + /* EOF – all writers closed, reopen for next connection */ + fclose(fifo); + { + struct timespec ts = {.tv_sec = 0, .tv_nsec = 50000000}; + nanosleep(&ts, NULL); + } /* small pause before retrying */ } - fclose(fifo); - return NULL; + return NULL; /* unreachable */ } int pipe_start_reader(void) {