diff options
Diffstat (limited to 'src/fruits/cmv')
| -rw-r--r-- | src/fruits/cmv/cmv.c | 97 | ||||
| -rw-r--r-- | src/fruits/cmv/meson.build | 2 |
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) |