summaryrefslogtreecommitdiff
path: root/src/fruits/cmv
diff options
context:
space:
mode:
Diffstat (limited to 'src/fruits/cmv')
-rw-r--r--src/fruits/cmv/cmv.c97
-rw-r--r--src/fruits/cmv/meson.build2
2 files changed, 47 insertions, 52 deletions
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index fe0fbd6..535bf72 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -13,8 +13,6 @@
#include "../../codec/ffmpeg/common.h"
#endif
-#include "../common.h"
-
#if !defined CAMU_SINK_ONLY && !defined NAUNET_ON_WINDOWS
// https://unix.stackexchange.com/a/16884
#define PID_MAX_STR 7 // 0x400000 (2^22).
@@ -46,13 +44,32 @@ static nn_thread_result NNWT_THREADCALL event_loop_thread(void *userdata)
return 0;
}
-// sink-p12-108.52.160.112-aEN-v-sEN.exe
-static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *prefs)
+static bool decode_addr(str *enc, str *addr)
+{
+ char value[4]; // max = 255.
+ for (u32 i = 0; i < 8; i += 2) {
+ str sub = al_str_substr(enc, i, i + 2);
+ bool error;
+ s64 l = al_str_to_long(&sub, 16, &error);
+ al_assert(l >= 0 && l <= 255);
+ if (error) return false;
+ al_snprintf(value, sizeof(value), "%hhu", (u8)l);
+ al_str_cat(addr, &al_str_cs(value));
+ if (i != 6) {
+ al_str_cat(addr, &al_str_c("."));
+ }
+ }
+ return true;
+}
+
+// sink-p12-976502a7.exe
+static bool parse_exe_name(str *exe_name, str *addr)
{
u32 index = al_str_rfind(exe_name, '/');
if (index == AL_STR_NO_POS) {
- index = al_str_rfind(exe_name, '\\');
- if (index == AL_STR_NO_POS) goto def;
+ if ((index = al_str_rfind(exe_name, '\\')) == AL_STR_NO_POS) {
+ goto def;
+ }
}
str sub = al_str_substr(exe_name, index + 1, exe_name->length);
@@ -62,51 +79,20 @@ static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *pr
sub = al_str_substr(&sub, 5, sub.length);
// Skip version.
- index = al_str_find(&sub, '-');
- if (index == AL_STR_NO_POS) goto def;
+ if ((index = al_str_find(&sub, '-')) == AL_STR_NO_POS) {
+ goto def;
+ }
sub = al_str_substr(&sub, index + 1, sub.length);
- index = al_str_find(&sub, '-');
- if (index == AL_STR_NO_POS) goto def;
- al_str_clone(addr, &al_str_substr(&sub, 0, index));
-
- for (;;) {
- sub = al_str_substr(&sub, index + 1, sub.length);
- index = al_str_find(&sub, '-');
- if (index == AL_STR_NO_POS) {
- index = al_str_find(&sub, '.');
- if (index == AL_STR_NO_POS) {
- index = sub.length;
- } else {
- sub.length = index;
- }
- }
-
- str value;
- al_str_clone(&value, &al_str_substr(&sub, 0, index));
- al_str_to_lower(&value);
- if (al_str_at(&value, 0) == 'a') {
- prefs->enabled_mask |= 1 << CAMU_STREAM_AUDIO;
- } else if (al_str_at(&value, 0) == 'v') {
- prefs->enabled_mask |= 1 << CAMU_STREAM_VIDEO;
- } else if (al_str_at(&value, 0) == 's') {
- prefs->enabled_mask |= 1 << CAMU_STREAM_SUBTITLE;
- }
- al_str_free(&value);
-
- if (index == sub.length) break;
+ if ((index = al_str_find(&sub, '.')) != AL_STR_NO_POS) {
+ sub = al_str_substr(&sub, 0, index);
}
+ al_str_from(addr, "");
+ decode_addr(&sub, addr);
+ log_debug("Parsed address %.*s from exe filename.", al_str_x(addr));
return true;
def:
-#ifdef CAMU_HAVE_SUBTITLES
- prefs->enabled_mask = (1 << CAMU_STREAM_AUDIO) | (1 << CAMU_STREAM_VIDEO) | (1 << CAMU_STREAM_SUBTITLE);
-#else
- prefs->enabled_mask = (1 << CAMU_STREAM_AUDIO) | (1 << CAMU_STREAM_VIDEO);
-#endif
- prefs->audio_lang = CAMU_LANG_JAPANESE;
- prefs->subtitle_lang = CAMU_LANG_ENGLISH;
-
return false;
}
@@ -141,12 +127,12 @@ s32 window_system_main(u32 argc, str *argv, void *extra)
u8 type;
str addr;
- if (!parse_exe_name_params(&argv[0], &addr, &c.desktop.sink.prefs)) {
+ if (!parse_exe_name(&argv[0], &addr)) {
#ifndef CAMU_SINK_ONLY
if (local) {
#ifdef NAUNET_ON_WINDOWS
- type = NNWT_SOCKET_TCP;;
- al_str_clone(&addr, &CAMU_LOCALHOST);
+ 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);
@@ -155,17 +141,26 @@ s32 window_system_main(u32 argc, str *argv, void *extra)
al_str_cat(&addr, &al_str_cs(pid_str));
#endif
} else {
- type = CAMU_TEST_TYPE;
- al_str_clone(&addr, &CAMU_TEST_ADDR);
+ type = NNWT_SOCKET_TCP;
+ al_str_clone(&addr, &al_str_c("127.0.0.1"));
}
#else
type = NNWT_SOCKET_TCP;
- al_str_clone(&addr, &CAMU_TEST_ADDR);
+ al_str_clone(&addr, &al_str_c("127.0.0.1"));
#endif
} else {
type = NNWT_SOCKET_TCP;
}
+ 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);
+#else
+ prefs->enabled = (1 << CAMU_STREAM_AUDIO) | (1 << CAMU_STREAM_VIDEO);
+#endif
+ prefs->language.audio = CAMU_LANG_JAPANESE;
+ prefs->language.subtitles = CAMU_LANG_ENGLISH;
+
#ifndef CAMU_SINK_ONLY
if (local) {
camu_server_init(&c.server, &c.loop);
diff --git a/src/fruits/cmv/meson.build b/src/fruits/cmv/meson.build
index bfd2182..3e78f05 100644
--- a/src/fruits/cmv/meson.build
+++ b/src/fruits/cmv/meson.build
@@ -15,7 +15,7 @@ endif
cmv_link_args = []
if is_windows and not is_msvc
- cmv_link_args += ['-static', '-static-libgcc', '-static-libstdc++', '-municode', '-mwindows']
+ cmv_link_args += ['-static', '-static-libgcc', '-static-libstdc++', '-mwindows', '-municode']
endif
executable('cmv', cmv_src, dependencies: cmv_deps, c_args: cmv_args, link_args: cmv_link_args, install: true)