From c66c7c64ebd16287b892f8a780cffcabafba3799 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Mon, 7 Sep 2026 15:06:14 -0400 Subject: Better OSD behavior, lots of build stuff Signed-off-by: Andrew Opalach --- src/fruits/cmsrv/cmsrv.c | 76 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 22 deletions(-) (limited to 'src/fruits/cmsrv') diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c index b0793d1..452254b 100644 --- a/src/fruits/cmsrv/cmsrv.c +++ b/src/fruits/cmsrv/cmsrv.c @@ -30,6 +30,7 @@ struct cmsrv { struct nn_line_processor cli; } local; #endif + bool use_ui; #ifdef CMSRV_USE_UI struct cmsrv_ui ui; struct nn_poll input_poll; @@ -43,14 +44,27 @@ static void close_cmsrv(struct cmsrv *s) nn_line_processor_stop(&s->local.cli); #endif #ifdef CMSRV_USE_UI - nn_poll_stop(&s->input_poll); - nn_timer_stop(&s->render_timer); + if (s->use_ui) { + nn_poll_stop(&s->input_poll); + nn_timer_stop(&s->render_timer); + } #endif camu_server_close(&s->server); nn_signal_stop(&s->quit_signal); } #ifdef CMSRV_LOCAL_SOCKET +static inline void try_parse_arg_from_line(str *line, u32 offset, s32 *n) +{ + str arg = al_str_substr(line, offset, line->length); + bool error; + s64 i = al_str_to_long(&arg, 10, &error); + if (!error) { + if (*n < 0) i = -i; + *n = CLAMP(i, (s64)INT32_MIN, (s64)INT32_MAX); + } +} + static u8 server_line_callback(void *userdata, str *line) { struct cmsrv *s = (struct cmsrv *)userdata; @@ -60,19 +74,13 @@ static u8 server_line_callback(void *userdata, str *line) } else if (al_str_cmp(line, &al_str_c(";NEXT"), 0, 5) == 0) { s32 n = 1; if (line->length > 6) { - str arg = al_str_substr(line, 6, line->length); - bool error; - s64 i = al_str_to_long(&arg, 10, &error); - if (!error) n = CLAMP(i, (s64)INT32_MIN, (s64)INT32_MAX); + try_parse_arg_from_line(line, 6, &n); } lia_list_skip(list, LIANA_SEQUENCE_ANY, n); } else if (al_str_cmp(line, &al_str_c(";PREV"), 0, 5) == 0) { s32 n = -1; if (line->length > 6) { - str arg = al_str_substr(line, 6, line->length); - bool error; - s64 i = -al_str_to_long(&arg, 10, &error); - if (!error) n = CLAMP(i, (s64)INT32_MIN, (s64)INT32_MAX); + try_parse_arg_from_line(line, 6, &n); } lia_list_skip(list, LIANA_SEQUENCE_ANY, n); } else if (al_str_cmp(line, &al_str_c(";SEEK"), 0, 5) == 0) { @@ -93,8 +101,18 @@ static u8 server_line_callback(void *userdata, str *line) lia_list_reverse(list); } else if (al_str_eq(line, &al_str_c(";CLEAR"))) { lia_list_clear(list); + } else if (al_str_cmp(line, &al_str_c(";START_AT"), 0, 9) == 0) { + if (line->length > 6) { + s32 n = 0; + try_parse_arg_from_line(line, 10, &n); + if (n > 0) { + camu_server_local_start_at(&s->server, n); + } + } } else if (al_str_eq(line, &al_str_c(";DISCONNECT"))) { lia_server_force_disconnect_nodes(&s->server.data.server); + } else if (al_str_eq(line, &al_str_c(";QUIT"))) { + close_cmsrv(s); } else { struct nn_packet *packet = nn_packet_create(); nn_packet_write_str(packet, line); @@ -156,10 +174,17 @@ static void quit_signal_callback(void *userdata) static struct cmsrv s = { 0 }; +static bool sigint_force = false; static void sigint_handler(s32 signum) { (void)signum; - nn_signal_send(&s.quit_signal); + if (sigint_force) { + exit(128 + SIGINT); + } else { + nn_signal_send(&s.quit_signal); + log_warn("Attempting graceful exit. ^C again to force exit."); + sigint_force = true; + } } #ifdef NAUNET_ON_WINDOWS @@ -172,11 +197,16 @@ s32 main(s32 argc, char *argv[]) return EXIT_FAILURE; } + s.use_ui = false; #ifdef CMSRV_USE_UI - if (!cmsrv_ui_init(&s.ui, &s.server)) { - return EXIT_FAILURE; + char *CMSRV_UI = getenv("CMSRV_UI"); + if (CMSRV_UI) s.use_ui = al_strscmp(CMSRV_UI, "1") == 0; + if (s.use_ui) { + if (!cmsrv_ui_init(&s.ui, &s.server)) { + return EXIT_FAILURE; + } + al_set_print(log_callback, &s); } - al_set_print(log_callback, &s); #endif #ifdef CAMU_HAVE_FFMPEG @@ -194,7 +224,7 @@ s32 main(s32 argc, char *argv[]) if (CMSRV_IP) addr = al_str_cr(CMSRV_IP); log_info("Serving from %.*s.", al_str_x(&addr)); - camu_server_init(&s.server, &s.loop); + camu_server_init(&s.server, &s.loop, false); if (!camu_server_listen(&s.server, NNWT_SOCKET_TCP, &addr, CAMU_PORT)) { return EXIT_FAILURE; } @@ -212,12 +242,14 @@ s32 main(s32 argc, char *argv[]) #endif #ifdef CMSRV_USE_UI - nn_poll_init(&s.input_poll, input_poll_callback, &s); - nn_poll_set(&s.input_poll, cmsrv_ui_get_input_fd(&s.ui), NNWT_POLL_READ); - nn_poll_start(&s.input_poll, &s.loop); - nn_timer_init(&s.render_timer, &s.loop, render_timer_callback, &s); - nn_timer_set_repeat(&s.render_timer, NNWT_TS_FROM_USEC(100000)); - nn_timer_again(&s.render_timer); + if (s.use_ui) { + nn_poll_init(&s.input_poll, input_poll_callback, &s); + nn_poll_set(&s.input_poll, cmsrv_ui_get_input_fd(&s.ui), NNWT_POLL_READ); + nn_poll_start(&s.input_poll, &s.loop); + nn_timer_init(&s.render_timer, &s.loop, render_timer_callback, &s); + nn_timer_set_repeat(&s.render_timer, NNWT_TS_FROM_USEC(100000)); + nn_timer_again(&s.render_timer); + } #endif nn_event_loop_run(&s.loop); @@ -226,7 +258,7 @@ s32 main(s32 argc, char *argv[]) nn_socket_close(&s.local.sock); #endif #ifdef CMSRV_USE_UI - cmsrv_ui_close(&s.ui); + if (s.use_ui) cmsrv_ui_close(&s.ui); #endif camu_server_free(&s.server); nn_event_loop_destroy(&s.loop); -- cgit v1.2.3-101-g0448