summaryrefslogtreecommitdiff
path: root/src/fruits/cmv/cmv.c
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2026-04-13 17:01:47 -0400
committerAndrew Opalach <andrew@akon.city> 2026-04-13 17:01:47 -0400
commit77b54c35bf9587450cd636e0d7df37e190e28bfb (patch)
treea290efdd8b09066847199f3f52a32be70d24ef51 /src/fruits/cmv/cmv.c
parent20617b9c80cf8d8051ecdb53a2c22f68c012f21b (diff)
downloadcamu-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.c138
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;