diff options
| author | 2026-04-13 17:01:47 -0400 | |
|---|---|---|
| committer | 2026-04-13 17:01:47 -0400 | |
| commit | 77b54c35bf9587450cd636e0d7df37e190e28bfb (patch) | |
| tree | a290efdd8b09066847199f3f52a32be70d24ef51 /src/fruits/cmv/cmv.c | |
| parent | 20617b9c80cf8d8051ecdb53a2c22f68c012f21b (diff) | |
| download | camu-77b54c35bf9587450cd636e0d7df37e190e28bfb.tar.gz camu-77b54c35bf9587450cd636e0d7df37e190e28bfb.tar.bz2 camu-77b54c35bf9587450cd636e0d7df37e190e28bfb.zip | |
Smaller stuff that went uncommitted
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits/cmv/cmv.c')
| -rw-r--r-- | src/fruits/cmv/cmv.c | 138 |
1 files changed, 84 insertions, 54 deletions
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c index d76adb3..6fe0790 100644 --- a/src/fruits/cmv/cmv.c +++ b/src/fruits/cmv/cmv.c @@ -1,5 +1,6 @@ #define AL_LOG_SECTION "cmv" #include <al/log.h> +#include <nnwt/common.h> #include <nnwt/event_loop.h> #include <nnwt/thread.h> @@ -13,7 +14,11 @@ #include "../../codec/ffmpeg/common.h" #endif -#if !defined CAMU_SINK_ONLY && !defined NAUNET_ON_WINDOWS +#ifdef STELA_ICON_AT_RUNTIME +#include "icon.h" +#endif + +#ifndef NAUNET_ON_WINDOWS // https://unix.stackexchange.com/a/16884 #define PID_MAX_STR 7 // 0x400000 (2^22). static str CMV_UNIX_PATH = al_str_c("/tmp/cmv_sock_"); @@ -27,14 +32,16 @@ struct cmv { #endif }; -#ifndef CAMU_SINK_ONLY static void exit_callback(void *userdata, struct camu_desktop *desktop) { struct cmv *c = (struct cmv *)userdata; (void)desktop; +#ifndef CAMU_SINK_ONLY camu_server_close(&c->server); -} +#else + (void)c; #endif +} static nn_thread_result NNWT_THREADCALL event_loop_thread(void *userdata) { @@ -102,6 +109,14 @@ s32 window_system_main(u32 argc, str *argv, void *extra) { (void)extra; + bool local = argc > 1; +#ifdef CAMU_SINK_ONLY + if (local) { + log_warn("Got arguments in a sink-only configuration."); + return EXIT_FAILURE; + } +#endif + #ifdef CAMU_HAVE_FFMPEG camu_ff_common_init(); #endif @@ -117,53 +132,46 @@ s32 window_system_main(u32 argc, str *argv, void *extra) nn_event_loop_init(&c.loop); -#ifndef CAMU_SINK_ONLY - bool local = argc > 1; -#else - if (argc > 1) { - log_warn("Got arguments in a sink-only configuration."); - } -#endif - u8 type; str addr; - if (parse_exe_name(&argv[0], &addr)) { - type = NNWT_SOCKET_TCP; - } else { -#ifndef CAMU_SINK_ONLY - if (local) { + if (local) { #ifdef NAUNET_ON_WINDOWS - type = NNWT_SOCKET_TCP; - al_str_clone(&addr, &al_str_c("127.0.0.1")); + type = NNWT_SOCKET_TCP; + al_str_clone(&addr, &al_str_c("127.0.0.1")); #else - type = NNWT_SOCKET_UNIX; - al_str_clone(&addr, &CMV_UNIX_PATH); - char pid_str[PID_MAX_STR]; - al_snprintf(pid_str, PID_MAX_STR, "%x", getpid()); - al_str_cat(&addr, &al_str_cs(pid_str)); + type = NNWT_SOCKET_UNIX; + al_str_clone(&addr, &CMV_UNIX_PATH); + char pid_str[PID_MAX_STR]; + al_snprintf(pid_str, PID_MAX_STR, "%x", getpid()); + al_str_cat(&addr, &al_str_cs(pid_str)); #endif - } else { -#endif - type = NNWT_SOCKET_TCP; - char *SINK_IP = getenv("SINK_IP"); - al_str_from(&addr, ""); - if (!SINK_IP || !decode_addr(&addr, &al_str_cr(SINK_IP))) { - al_str_cat(&addr, &al_str_c("127.0.0.1")); - } -#ifndef CAMU_SINK_ONLY + } else if (parse_exe_name(&argv[0], &addr)) { + type = NNWT_SOCKET_TCP; + } else { + type = NNWT_SOCKET_TCP; + char *SINK_IP = getenv("SINK_IP"); + al_str_from(&addr, ""); + if (!SINK_IP || !decode_addr(&addr, &al_str_cr(SINK_IP))) { + al_str_cat(&addr, &al_str_c("127.0.0.1")); } -#endif } struct lia_prefs *prefs = &c.desktop.sink.prefs; #ifdef CAMU_HAVE_SUBTITLES - prefs->enabled = (1 << CAMU_STREAM_AUDIO) | (1 << CAMU_STREAM_VIDEO) | (1 << CAMU_STREAM_SUBTITLE); + prefs->enabled = (1 << CAMU_STREAM_AUDIO) | (1 << CAMU_STREAM_SUBTITLE); #else - prefs->enabled = (1 << CAMU_STREAM_AUDIO) | (1 << CAMU_STREAM_VIDEO); + prefs->enabled = (1 << CAMU_STREAM_AUDIO); #endif + char *SINK_NO_VIDEO = getenv("SINK_NO_VIDEO"); + if (SINK_NO_VIDEO && al_strscmp(SINK_NO_VIDEO, "1") == 0) { + } else { + prefs->enabled |= (1 << CAMU_STREAM_VIDEO); + } prefs->language.audio = CAMU_LANG_JAPANESE; prefs->language.subtitles = CAMU_LANG_ENGLISH; + s32 ret = EXIT_SUCCESS; + #ifndef CAMU_SINK_ONLY if (local) { camu_server_init(&c.server, &c.loop); @@ -171,49 +179,67 @@ s32 window_system_main(u32 argc, str *argv, void *extra) camu_server_bind_direct(&c.server); #else if (!camu_server_listen(&c.server, type, &addr, CAMU_PORT)) { - return EXIT_FAILURE; + ret = EXIT_FAILURE; + goto out; } #endif } #endif - if (!camu_desktop_open(&c.desktop, "cmv")) { - return EXIT_FAILURE; + str window_name; + al_str_from(&window_name, "Sink ("); + if (local) { + al_str_cat(&window_name, &al_str_c("cmv)")); + } else { + al_str_cat(&window_name, &addr); + al_str_cat(&window_name, &al_str_c(")")); } -#ifndef CAMU_SINK_ONLY + char *window_name_c = al_str_to_c_str(&window_name); + bool desktop_opened = camu_desktop_open(&c.desktop, window_name_c); + al_free(window_name_c); + al_str_free(&window_name); + if (!desktop_opened) { + ret = EXIT_FAILURE; + goto out; + } + str *name = local ? &al_str_c("local") : &al_str_c("desktop"); if (local) { c.desktop.exit_callback = exit_callback; c.desktop.userdata = &c; } - str *name = local ? &al_str_c("local") : &al_str_c("desktop"); -#else - str *name = &al_str_c("desktop"); -#endif + char *SINK_FORCE_LOCAL = getenv("SINK_FORCE_LOCAL"); + if (SINK_FORCE_LOCAL && al_strscmp(SINK_FORCE_LOCAL, "1") == 0) { + c.desktop.sink.local = true; + } else { + c.desktop.sink.local = local; + } if (!camu_desktop_connect(&c.desktop, name, &c.loop, type, &addr, CAMU_PORT)) { - return EXIT_FAILURE; + ret = EXIT_FAILURE; + goto out; } - al_str_free(&addr); - -#ifndef CAMU_SINK_ONLY if (local) { for (u32 i = 1; i < argc; i++) { struct nn_packet *packet = nn_packet_create(); nn_packet_write_str(packet, &argv[i]); +#ifndef CAMU_SINK_ONLY camu_server_local_add(&c.server, packet); +#endif nn_packet_free(packet); } } -#endif - struct nn_thread thread0; - nn_thread_create(&thread0, event_loop_thread, &c); + struct nn_thread thread; + nn_thread_create(&thread, event_loop_thread, &c); while (camu_desktop_tick(&c.desktop)) {} camu_desktop_stop(&c.desktop); - nn_thread_join(&thread0); + nn_thread_join(&thread); + +out: + al_str_free(&addr); camu_desktop_free(&c.desktop); #ifndef CAMU_SINK_ONLY @@ -221,15 +247,15 @@ s32 window_system_main(u32 argc, str *argv, void *extra) #endif nn_event_loop_destroy(&c.loop); - return EXIT_SUCCESS; + return ret; } static bool sigint_force = false; -static void sigint_handler(int signum) +static void sigint_handler(s32 signum) { (void)signum; if (sigint_force) { - exit(128+SIGINT); + exit(128 + SIGINT); } else { c.desktop.should_quit = 1; log_warn("Attempting graceful exit. ^C again to force exit."); @@ -252,6 +278,10 @@ s32 main(s32 argc, char *argv[]) return EXIT_FAILURE; } +#ifdef STELA_ICON_AT_RUNTIME + stl_set_icon_data(icon_256, icon_256_len); +#endif + signal(SIGINT, sigint_handler); array(str) args; |