Files
jack-looper/main.c
Loic Coenen 4573eb0201 feat: add ncurses-based TUI frontend with 8x8 clip grid and keyboard controls
Co-authored-by: aider (deepseek/deepseek-coder) <aider@aider.chat>
2026-05-01 09:48:59 +00:00

87 lines
2.3 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include "engine.h"
#include "tui.h"
static Engine engine;
static volatile int keep_running = 1;
void signal_handler(int sig) {
(void)sig;
keep_running = 0;
}
void print_usage(const char *program) {
printf("Usage: %s [options]\n", program);
printf("Options:\n");
printf(" -n <name> JACK client name (default: jack-looper)\n");
printf(" -c <channel> MIDI control channel (default: 0)\n");
printf(" -h Show this help\n");
}
int main(int argc, char *argv[]) {
const char *client_name = "jack-looper";
int control_channel = 0;
int opt;
while ((opt = getopt(argc, argv, "n:c:h")) != -1) {
switch (opt) {
case 'n':
client_name = optarg;
break;
case 'c':
control_channel = atoi(optarg);
if (control_channel < 0 || control_channel > 15) {
fprintf(stderr, "Control channel must be 0-15\n");
return 1;
}
break;
case 'h':
print_usage(argv[0]);
return 0;
default:
print_usage(argv[0]);
return 1;
}
}
// Initialize engine
if (engine_init(&engine, client_name) != 0) {
fprintf(stderr, "Failed to initialize engine\n");
return 1;
}
engine.control_channel = control_channel;
// Set up signal handler
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
// Start engine
if (engine_start(&engine) != 0) {
fprintf(stderr, "Failed to start engine\n");
engine_cleanup(&engine);
return 1;
}
printf("JACK Looper started\n");
printf("Client name: %s\n", client_name);
printf("Control channel: %d\n", control_channel);
printf("Sample rate: %u Hz\n", engine.sample_rate);
printf("Press Ctrl+C to stop\n\n");
// Initialize and run TUI
tui_init(&engine);
tui_run(&engine);
tui_cleanup();
// Cleanup
printf("\nShutting down...\n"); // This line may not be reached if tui_run returns
engine_stop(&engine);
engine_cleanup(&engine);
return 0;
}