#include #include #include #include #include "engine.h" static Engine engine; static volatile int keep_running = 1; void signal_handler(int sig) { keep_running = 0; } void print_usage(const char *program) { printf("Usage: %s [options]\n", program); printf("Options:\n"); printf(" -n JACK client name (default: jack-looper)\n"); printf(" -c 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"); // Main loop while (keep_running) { sleep(1); } // Cleanup printf("\nShutting down...\n"); engine_stop(&engine); engine_cleanup(&engine); return 0; }