#include "pipe.h" #include "command.h" #include "queue.h" #include #include #include #include #include #include #include #include #include #define FIFO_PATH "/tmp/looper_cmd" #define LINE_MAX 256 /* forward‑declare the global queues (defined in looper.c) */ extern spsc_queue_t cmd_queue; extern spsc_queue_t cmd_queue_main_fifo; static void *pipe_thread_func(void *arg) { (void)arg; char line[LINE_MAX]; while (1) { FILE *fifo = fopen(FIFO_PATH, "r"); if (!fifo) { perror("fopen fifo"); return NULL; } 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, cmd); } else if (strcmp(line, "add_midi") == 0) { <<<<<<< HEAD command_t cmd = {.type = CMD_ADD_MIDI_CHANNEL, .channel = -1, .data = 0}; queue_push(&cmd_queue, cmd); ======= command_t cmd = { .type = CMD_ADD_MIDI_CHANNEL, .channel = -1, .data = 0}; queue_push(&cmd_queue_main_fifo, cmd); >>>>>>> 3-integrate-carla } else if (strcmp(line, "remove") == 0) { command_t cmd = {.type = CMD_REMOVE_CHANNEL, .channel = -1, .data = 0}; queue_push(&cmd_queue, 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, cmd); } else if (strcmp(line, "scene_remove") == 0) { command_t cmd = {.type = CMD_REMOVE_SCENE, .channel = -1, .data = 0}; queue_push(&cmd_queue, cmd); } else if (strcmp(line, "scene_next") == 0) { command_t cmd = {.type = CMD_NEXT_SCENE, .channel = -1, .data = 0}; queue_push(&cmd_queue, cmd); } else if (strcmp(line, "scene_prev") == 0) { command_t cmd = {.type = CMD_PREV_SCENE, .channel = -1, .data = 0}; queue_push(&cmd_queue, cmd); } else if (strcmp(line, "load") == 0) { command_t cmd = {.type = CMD_LOAD, .channel = -1, .data = 0}; queue_push(&cmd_queue, cmd); } else if (strcmp(line, "save") == 0) { command_t cmd = {.type = CMD_SAVE, .channel = -1, .data = 0}; queue_push(&cmd_queue, 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 */ } return NULL; /* unreachable */ } int pipe_start_reader(void) { /* create FIFO if it doesn't exist */ if (mkfifo(FIFO_PATH, 0666) != 0 && errno != EEXIST) { perror("mkfifo"); return -1; } pthread_t tid; if (pthread_create(&tid, NULL, pipe_thread_func, NULL) != 0) { perror("pthread_create"); return -1; } pthread_detach(tid); /* we don't need to join */ return 0; }