diff options
Diffstat (limited to 'src/fruits/cmv')
| -rw-r--r-- | src/fruits/cmv/cmv.c | 109 |
1 files changed, 92 insertions, 17 deletions
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c index ebc2236..f79ffe2 100644 --- a/src/fruits/cmv/cmv.c +++ b/src/fruits/cmv/cmv.c @@ -53,6 +53,66 @@ static void sigint_handler(int signum) goto out; \ } while (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) +{ + u32 index = al_str_rfind(exe_name, '/'); + if (index == al_str_npos) { + index = al_str_rfind(exe_name, '\\'); + if (index == al_str_npos) goto def; + } + + str sub = al_str_substr(exe_name, index + 1, exe_name->length); + if (al_str_cmp(&sub, &al_str_c("sink-"), 0, 5) != 0) { + goto def; + } + sub = al_str_substr(&sub, 5, sub.length); + + // Skip version. + index = al_str_find(&sub, '-'); + if (index == al_str_npos) goto def; + sub = al_str_substr(&sub, index + 1, sub.length); + + index = al_str_find(&sub, '-'); + if (index == al_str_npos) goto def; + *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_npos) { + index = al_str_find(&sub, '.'); + if (index == al_str_npos) { + 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 |= CAMU_MASK_AUDIO; + } else if (al_str_at(&value, 0) == 'v') { + prefs->enabled_mask |= CAMU_MASK_VIDEO; + } else if (al_str_at(&value, 0) == 's') { + prefs->enabled_mask |= CAMU_MASK_SUBTITLE; + } + al_str_free(&value); + + if (index == sub.length) break; + } + + return true; +def: + prefs->enabled_mask = CAMU_MASK_AUDIO | CAMU_MASK_VIDEO | CAMU_MASK_SUBTITLE; + prefs->audio_lang = CAMU_LANG_ENGLISH; + prefs->subtitle_lang = CAMU_LANG_ENGLISH; + + return false; +} + #ifdef NAUNET_ON_WINDOWS s32 wmain(s32 argc, wchar_t **argv) #else @@ -68,7 +128,7 @@ s32 main(s32 argc, char *argv[]) signal(SIGINT, sigint_handler); #ifdef CAMU_HAVE_FFMPEG - camu_ff_set_default_log_callback(); + camu_ff_common_init(); #endif str home = al_str_null(); @@ -84,30 +144,49 @@ s32 main(s32 argc, char *argv[]) nn_event_loop_init(&c.loop); - u8 type; - str *addr; #ifndef CAMU_SINK_ONLY bool local = argc > 1; - if (local) { +#endif + + u8 type; + str addr; + + str exe_name; +#ifdef NAUNET_ON_WINDOWS + al_wstr_to_str(&al_wstr_cr(argv[0]), &exe_name); +#else + exe_name = al_str_cr(argv[0]); +#endif + if (!parse_exe_name_params(&exe_name, &addr, &c.desktop.sink.prefs)) { +#ifndef CAMU_SINK_ONLY + if (local) { #ifdef NAUNET_ON_WINDOWS - type = NNWT_SOCKET_TCP; addr = &CAMU_LOCALHOST; + type = NNWT_SOCKET_TCP; addr = CAMU_LOCALHOST; +#else + type = NNWT_SOCKET_UNIX; addr = CMV_UNIX_PATH; +#endif + } else { + type = CAMU_TEST_TYPE; + addr = CAMU_TEST_ADDR; + } #else - type = NNWT_SOCKET_UNIX; addr = &CMV_UNIX_PATH; + type = NNWT_SOCKET_TCP; addr = CAMU_TEST_ADDR; #endif + } else { + type = NNWT_SOCKET_TCP; + } + +#ifndef CAMU_SINK_ONLY + if (local) { camu_server_init(&c.server, &c.loop); #ifdef CAMU_DIRECT_MODE camu_server_bind_direct(&c.server); #else - if (!camu_server_listen(&c.server, type, addr, CAMU_PORT)) { + if (!camu_server_listen(&c.server, type, &addr, CAMU_PORT)) { failure(); } #endif - } else { - type = CAMU_TEST_TYPE; - addr = &CAMU_TEST_ADDR; } -#else - type = NNWT_SOCKET_TCP; addr = &CAMU_TEST_ADDR; #endif if (!camu_desktop_init(&c.desktop, "cmv")) failure(); @@ -118,7 +197,7 @@ s32 main(s32 argc, char *argv[]) c.desktop.sink.local_server = &c.server.data.server; } #endif - if (!camu_desktop_connect(&c.desktop, type, &c.loop, addr, CAMU_PORT)) failure(); + if (!camu_desktop_connect(&c.desktop, type, &c.loop, &addr, CAMU_PORT)) failure(); #ifndef CAMU_SINK_ONLY if (local) { @@ -177,10 +256,6 @@ out: al_str_free(&home); -#ifdef CAMU_HAVE_FFMPEG - camu_ff_free_default_log_callback(); -#endif - stl_global_close(); nn_common_close(); |