diff --git a/.vscode/settings.json b/.vscode/settings.json index 3b105d2389..1fde8c11fd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,7 +18,8 @@ "driver.h": "c", "iosfwd": "c", "xlocbuf": "c", - "xmemory0": "c" + "xmemory0": "c", + "ios": "c" }, "C_Cpp.dimInactiveRegions": false, } \ No newline at end of file diff --git a/command.c b/command.c index 1179f6151a..7061918178 100644 --- a/command.c +++ b/command.c @@ -161,7 +161,7 @@ static const struct cmd_map map[] = { { "STATE_SLOT_PLUS", RARCH_STATE_SLOT_PLUS }, { "STATE_SLOT_MINUS", RARCH_STATE_SLOT_MINUS }, { "REWIND", RARCH_REWIND }, - { "MOVIE_RECORD_TOGGLE", RARCH_MOVIE_RECORD_TOGGLE }, + { "BSV_RECORD_TOGGLE", RARCH_BSV_RECORD_TOGGLE }, { "PAUSE_TOGGLE", RARCH_PAUSE_TOGGLE }, { "FRAMEADVANCE", RARCH_FRAMEADVANCE }, { "RESET", RARCH_RESET }, @@ -2172,13 +2172,19 @@ TODO: Add a setting for these tweaks */ video_driver_gpu_record_deinit(); break; case CMD_EVENT_RECORD_DEINIT: - if (!recording_deinit()) - return false; + { + recording_set_state(false); + if (!recording_deinit()) + return false; + } break; case CMD_EVENT_RECORD_INIT: - command_event(CMD_EVENT_HISTORY_DEINIT, NULL); - if (!recording_init()) - return false; + { + command_event(CMD_EVENT_RECORD_DEINIT, NULL); + recording_set_state(true); + if (!recording_init()) + return false; + } break; case CMD_EVENT_HISTORY_DEINIT: if (g_defaults.content_history) diff --git a/config.def.h b/config.def.h index 65653bbfa5..d8aeecfee2 100644 --- a/config.def.h +++ b/config.def.h @@ -657,6 +657,10 @@ static const unsigned libretro_log_level = 1; #define RARCH_DEFAULT_PORT 55435 #endif +#ifndef RARCH_STREAM_DEFAULT_PORT +#define RARCH_STREAM_DEFAULT_PORT 56400 +#endif + /* KEYBINDS, JOYPAD */ /* Axis threshold (between 0.0 and 1.0) diff --git a/config.def.keybinds.h b/config.def.keybinds.h index d941a210cf..bdb13d86ad 100644 --- a/config.def.keybinds.h +++ b/config.def.keybinds.h @@ -75,7 +75,7 @@ static const struct retro_keybind retro_keybinds_1[] = { { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE }, @@ -151,7 +151,7 @@ static const struct retro_keybind retro_keybinds_1[] = { { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE }, - { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE }, diff --git a/configuration.c b/configuration.c index 8ed205fc14..ce54b0b6e1 100644 --- a/configuration.c +++ b/configuration.c @@ -1159,6 +1159,14 @@ static struct config_path_setting *populate_settings_path(settings_t *settings, #ifdef HAVE_OVERLAY SETTING_PATH("input_overlay", settings->paths.path_overlay, false, NULL, true); +#endif +#ifdef HAVE_FFMPEG + SETTING_PATH("video_record_config", + settings->paths.path_record_config, false, NULL, true); + SETTING_PATH("video_stream_config", + settings->paths.path_stream_config, false, NULL, true); + SETTING_PATH("video_stream_url", + settings->paths.path_stream_url, false, NULL, true); #endif SETTING_PATH("video_font_path", settings->paths.path_font, false, NULL, true); @@ -1582,6 +1590,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("aspect_ratio_index", &settings->uints.video_aspect_ratio_idx, true, aspect_ratio_idx, false); #ifdef HAVE_NETWORKING SETTING_UINT("netplay_ip_port", &settings->uints.netplay_port, true, RARCH_DEFAULT_PORT, false); + SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false); SETTING_OVERRIDE(RARCH_OVERRIDE_SETTING_NETPLAY_IP_PORT); SETTING_UINT("netplay_input_latency_frames_min",&settings->uints.netplay_input_latency_frames_min, true, 0, false); SETTING_UINT("netplay_input_latency_frames_range",&settings->uints.netplay_input_latency_frames_range, true, 0, false); @@ -1924,6 +1933,9 @@ static void config_set_defaults(void) *settings->paths.path_menu_wallpaper = '\0'; *settings->paths.path_content_database = '\0'; *settings->paths.path_overlay = '\0'; + *settings->paths.path_record_config = '\0'; + *settings->paths.path_stream_config = '\0'; + *settings->paths.path_stream_url = '\0'; *settings->paths.path_softfilter_plugin = '\0'; *settings->arrays.playlist_names = '\0'; diff --git a/configuration.h b/configuration.h index 04a43cd572..1462a2a4da 100644 --- a/configuration.h +++ b/configuration.h @@ -385,6 +385,7 @@ typedef struct settings unsigned video_msg_bgcolor_red; unsigned video_msg_bgcolor_green; unsigned video_msg_bgcolor_blue; + unsigned video_stream_port; unsigned menu_thumbnails; unsigned menu_left_thumbnails; @@ -489,6 +490,9 @@ typedef struct settings char path_cheat_database[PATH_MAX_LENGTH]; char path_content_database[PATH_MAX_LENGTH]; char path_overlay[PATH_MAX_LENGTH]; + char path_record_config[PATH_MAX_LENGTH]; + char path_stream_config[PATH_MAX_LENGTH]; + char path_stream_url[PATH_MAX_LENGTH]; char path_menu_wallpaper[PATH_MAX_LENGTH]; char path_audio_dsp_plugin[PATH_MAX_LENGTH]; char path_softfilter_plugin[PATH_MAX_LENGTH]; @@ -503,7 +507,6 @@ typedef struct settings char path_shader[PATH_MAX_LENGTH]; char path_font[PATH_MAX_LENGTH]; - char directory_audio_filter[PATH_MAX_LENGTH]; char directory_autoconfig[PATH_MAX_LENGTH]; char directory_video_filter[PATH_MAX_LENGTH]; diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 7339143515..cec0089daa 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1094,8 +1094,8 @@ static void vulkan_init_readback(vk_t *vk) * not initialized yet. */ settings_t *settings = config_get_ptr(); - bool *recording_enabled = recording_is_enabled(); - vk->readback.streamed = settings->bools.video_gpu_record && *recording_enabled; + bool recording_enabled = recording_is_enabled(); + vk->readback.streamed = settings->bools.video_gpu_record && recording_enabled; if (!vk->readback.streamed) return; diff --git a/input/input_defines.h b/input/input_defines.h index fa9a868634..5224297acb 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -85,7 +85,7 @@ enum RARCH_STATE_SLOT_PLUS, RARCH_STATE_SLOT_MINUS, RARCH_REWIND, - RARCH_MOVIE_RECORD_TOGGLE, + RARCH_BSV_RECORD_TOGGLE, RARCH_PAUSE_TOGGLE, RARCH_FRAMEADVANCE, RARCH_RESET, diff --git a/input/input_driver.c b/input/input_driver.c index 8b397d028d..43d3876366 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -325,7 +325,7 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_META_BIND(2, state_slot_increase, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS), DECLARE_META_BIND(2, state_slot_decrease, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS), DECLARE_META_BIND(1, rewind, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND), - DECLARE_META_BIND(2, movie_record_toggle, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE), + DECLARE_META_BIND(2, movie_record_toggle, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE), DECLARE_META_BIND(2, pause_toggle, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE), DECLARE_META_BIND(2, frame_advance, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE), DECLARE_META_BIND(2, reset, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET), diff --git a/intl/msg_hash_ar.c b/intl/msg_hash_ar.c index ced48a7510..55321b55de 100644 --- a/intl/msg_hash_ar.c +++ b/intl/msg_hash_ar.c @@ -209,7 +209,7 @@ int menu_hash_get_help_ar_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Rewinding must be enabled."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; @@ -1929,7 +1929,7 @@ int menu_hash_get_help_ar_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_ar.h b/intl/msg_hash_ar.h index 9a88973b1d..354728b8d7 100644 --- a/intl/msg_hash_ar.h +++ b/intl/msg_hash_ar.h @@ -876,7 +876,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Load state") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Menu toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Movie record toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Audio mute toggle") diff --git a/intl/msg_hash_chs.c b/intl/msg_hash_chs.c index d472380e6a..82a5da215b 100644 --- a/intl/msg_hash_chs.c +++ b/intl/msg_hash_chs.c @@ -189,7 +189,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "回溯功能必须被启用。"); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "在录制和非录制模式切换。"); break; @@ -1773,7 +1773,7 @@ int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 8be0576d58..dfefe88a96 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -815,7 +815,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "加载状态") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "切换菜单") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "视频录制开关") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "静音开关") diff --git a/intl/msg_hash_cht.c b/intl/msg_hash_cht.c index 7ab23e51a8..f37b400068 100644 --- a/intl/msg_hash_cht.c +++ b/intl/msg_hash_cht.c @@ -189,7 +189,7 @@ int menu_hash_get_help_cht_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "回溯功能必須被啟用。"); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "在錄製和非錄製模式切換。"); break; @@ -1770,7 +1770,7 @@ int menu_hash_get_help_cht_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index 0e609f9db8..3e1927e508 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -815,7 +815,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "戴入狀態") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "切換選單") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "視訊錄製開關") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "靜音開關") diff --git a/intl/msg_hash_de.c b/intl/msg_hash_de.c index 38541049d4..d23dfb9de0 100644 --- a/intl/msg_hash_de.c +++ b/intl/msg_hash_de.c @@ -191,7 +191,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Die Zurückspulfunktion muss eingeschaltet sein."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Aufnahme starten/beenden."); break; @@ -1917,7 +1917,7 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Einzelbild-Vorlauf, wenn Inhalt pausiert ist."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Aufnahme starten/beenden."); break; diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 960521f33b..94bb32d950 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -822,7 +822,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Spielstand laden") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Menü aufrufen") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Videoaufzeichnung starten/beenden") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Audio stumm-/lautschalten") diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h index 4c936f0cb3..a64b2ac9c8 100644 --- a/intl/msg_hash_eo.h +++ b/intl/msg_hash_eo.h @@ -735,7 +735,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Load state") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Menu toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Movie record toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Audio mute toggle") diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 048f6bc549..d074e1ef24 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -1119,7 +1119,7 @@ int menu_hash_get_help_es_enum(enum msg_hash_enums msg, char *s, size_t len) "Avanza un fotograma mientras \n" "el contenido esté en pausa."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Activa o desactiva la grabación."); break; diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index 0fc4dc340a..427e31a106 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -1246,7 +1246,7 @@ MSG_HASH( "Mostrar menú" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, + MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Grabar video" ) MSG_HASH( diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 22b227ab82..6fe40b5be3 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -816,7 +816,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Charger un état") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Afficher le menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Activer l'enregistrement") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Sourdine") diff --git a/intl/msg_hash_it.c b/intl/msg_hash_it.c index af465751aa..067b38c31f 100644 --- a/intl/msg_hash_it.c +++ b/intl/msg_hash_it.c @@ -995,7 +995,7 @@ int menu_hash_get_help_it_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 021c7d8f82..2a2079917d 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -824,7 +824,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Pulsante Carica Stato") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Pulsante per il Menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Pulsante registratore Film") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Pulsante per disattivare l'audio ") diff --git a/intl/msg_hash_ja.c b/intl/msg_hash_ja.c index ab209191e5..c727d2e62a 100644 --- a/intl/msg_hash_ja.c +++ b/intl/msg_hash_ja.c @@ -191,7 +191,7 @@ int menu_hash_get_help_jp_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Rewinding must be enabled."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; @@ -1802,7 +1802,7 @@ int menu_hash_get_help_jp_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index efc7a44ca0..ce9762029c 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -921,7 +921,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "保存状態をロード") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "メニューに切り替え") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "録画") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "消音") diff --git a/intl/msg_hash_ko.c b/intl/msg_hash_ko.c index bb76f03e4a..fcf0c1601d 100644 --- a/intl/msg_hash_ko.c +++ b/intl/msg_hash_ko.c @@ -196,7 +196,7 @@ int menu_hash_get_help_ko_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Rewinding must be enabled."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; @@ -1881,7 +1881,7 @@ int menu_hash_get_help_ko_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index 792f798521..1066bf02d9 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -802,7 +802,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "상태 불러오기") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "메뉴 열기/닫기") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "동영상 기록 시작/중지") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "음소거 켜기/끄기") diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index 15a51f9f78..b889772e84 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -735,7 +735,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Load state") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Menu toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Movie record toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Audio mute toggle") diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index e7cec22748..f8b0a262a8 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -880,7 +880,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Wczytaj zapis") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Przełączanie menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Przełącznik nagrywania filmu") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Przełącznik wyciszania dźwięku") diff --git a/intl/msg_hash_pt_br.c b/intl/msg_hash_pt_br.c index 3bb9fe7412..d15f6e2ae3 100644 --- a/intl/msg_hash_pt_br.c +++ b/intl/msg_hash_pt_br.c @@ -203,7 +203,7 @@ int menu_hash_get_help_pt_br_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Voltar Atrás precisa estar habilitado."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Alternar entre gravando ou não."); break; @@ -1984,7 +1984,7 @@ int menu_hash_get_help_pt_br_enum(enum msg_hash_enums msg, char *s, size_t len) "Avanço de quadro quando o conteúdo \n" "estiver pausado."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Alternar entre gravando ou não."); break; diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index bf21da0c83..9131ff0347 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -1246,7 +1246,7 @@ MSG_HASH( "Alternar menu" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, + MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Alternar gravação de filme" ) MSG_HASH( diff --git a/intl/msg_hash_pt_pt.c b/intl/msg_hash_pt_pt.c index 3465d5b7e0..bfb24b202f 100644 --- a/intl/msg_hash_pt_pt.c +++ b/intl/msg_hash_pt_pt.c @@ -901,7 +901,7 @@ int menu_hash_get_help_pt_pt_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "O fotograma avança enquanto o conteúdo está em pausa."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Ativa ou desativa a gravação."); break; diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h index 969b09fc1a..906ec9a75b 100644 --- a/intl/msg_hash_pt_pt.h +++ b/intl/msg_hash_pt_pt.h @@ -802,7 +802,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Carregar estado") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Mostrar/esconder menu") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Iniciar/parar gravação de filme") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Silenciar som/remover silêncio") diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index 0f8c302ce4..1d81e513af 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -825,7 +825,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Загрузить сохраненную игру") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Отобразить меню") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Записать видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Заглушить звук") diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 62651d118f..833aee1915 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -205,7 +205,7 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Rewinding must be enabled."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; @@ -2060,7 +2060,7 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 4c11c5f903..4af60068f1 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1246,8 +1246,8 @@ MSG_HASH( "Menu toggle" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, - "Movie record toggle" + MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, + "Input replay movie record toggle" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, @@ -4159,15 +4159,15 @@ MSG_HASH( ) MSG_HASH( MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, - "Movie file is not a valid BSV1 file." + "Input replay movie file is not a valid BSV1 file." ) MSG_HASH( MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, - "Movie format seems to have a different serializer version. Will most likely fail." + "Input replay movie format seems to have a different serializer version. Will most likely fail." ) MSG_HASH( MSG_MOVIE_PLAYBACK_ENDED, - "Movie playback ended." + "Input replay movie playback ended." ) MSG_HASH( MSG_MOVIE_RECORD_STOPPED, diff --git a/intl/msg_hash_vn.c b/intl/msg_hash_vn.c index 21f6af93be..adb673f778 100644 --- a/intl/msg_hash_vn.c +++ b/intl/msg_hash_vn.c @@ -191,7 +191,7 @@ int menu_hash_get_help_vn_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "Cần phải bật chức năng quay lại."); break; - case RARCH_MOVIE_RECORD_TOGGLE: + case RARCH_BSV_RECORD_TOGGLE: snprintf(s, len, "Bật/tắt ghi chép video."); break; @@ -1803,7 +1803,7 @@ int menu_hash_get_help_vn_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Frame advance when content is paused."); break; - case MENU_ENUM_LABEL_MOVIE_RECORD_TOGGLE: + case MENU_ENUM_LABEL_BSV_RECORD_TOGGLE: snprintf(s, len, "Toggle between recording and not."); break; diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h index c2383e1016..04383f015a 100644 --- a/intl/msg_hash_vn.h +++ b/intl/msg_hash_vn.h @@ -816,7 +816,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, "Tải state") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, "Menu toggle") -MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, "Movie record toggle") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, "Âm thanh mute toggle") diff --git a/menu/menu_setting.c b/menu/menu_setting.c index e1e4f4a8ae..b6c003d832 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -5334,23 +5334,6 @@ static bool setting_append_list( parent_group = msg_hash_to_str(MENU_ENUM_LABEL_RECORDING_SETTINGS); START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group); - - CONFIG_BOOL( - list, list_info, - recording_is_enabled(), - MENU_ENUM_LABEL_RECORD_ENABLE, - MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, - false, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE - ); - CONFIG_PATH( list, list_info, global->record.config, diff --git a/msg_hash.h b/msg_hash.h index 4cea2c7ef9..3fd03aed56 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -634,7 +634,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, - MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, + MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, @@ -1190,7 +1190,7 @@ enum msg_hash_enums MENU_LABEL(FPS_SHOW), MENU_LABEL(STATISTICS_SHOW), MENU_LABEL(FRAMECOUNT_SHOW), - MENU_LABEL(MOVIE_RECORD_TOGGLE), + MENU_LABEL(BSV_RECORD_TOGGLE), MENU_ENUM_LABEL_L_X_PLUS, MENU_ENUM_LABEL_L_X_MINUS, MENU_ENUM_LABEL_L_Y_PLUS, diff --git a/paths.c b/paths.c index fc08a119be..7ad604b80b 100644 --- a/paths.c +++ b/paths.c @@ -721,6 +721,15 @@ enum rarch_content_type path_is_media_type(const char *path) string_to_lower(ext_lower); + /* hack, to detect livestreams so the ffmpeg core can be started */ + if ( + strstr(path, "udp://") || + strstr(path, "tcp://") || + strstr(path, "rtmp://") || + strstr(path, "rtp://") + ) + return RARCH_CONTENT_MOVIE; + switch (msg_hash_to_file_type(msg_hash_calculate(ext_lower))) { #if defined(HAVE_FFMPEG) || defined(HAVE_MPV) diff --git a/record/record_driver.c b/record/record_driver.c index 2426a36dac..b0d3b25513 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -35,6 +35,7 @@ #include "../verbosity.h" #include "../msg_hash.h" #include "../list_special.h" +#include "paths.h" static const record_driver_t *record_drivers[] = { @@ -50,6 +51,7 @@ unsigned recording_height = 0; size_t recording_gpu_width = 0; size_t recording_gpu_height = 0; static bool recording_enable = false; +static bool streaming_enable = false; static bool recording_use_output_dir = false; static const record_driver_t *recording_driver = NULL; @@ -281,9 +283,9 @@ bool recording_deinit(void) return true; } -bool *recording_is_enabled(void) +bool recording_is_enabled(void) { - return &recording_enable; + return recording_enable; } void recording_set_state(bool state) @@ -291,6 +293,16 @@ void recording_set_state(bool state) recording_enable = state; } +bool streaming_is_enabled(void) +{ + return streaming_enable; +} + +void streaming_set_state(bool state) +{ + streaming_enable = state; +} + void recording_push_audio(const int16_t *data, size_t samples) { struct ffemu_audio_data ffemu_data; @@ -309,19 +321,20 @@ void recording_push_audio(const int16_t *data, size_t samples) * * Returns: true (1) if successful, otherwise false (0). **/ -bool recording_init(void) +bool recording_init() { - char recording_file[PATH_MAX_LENGTH]; + char output[PATH_MAX_LENGTH]; + char buf[PATH_MAX_LENGTH]; struct ffemu_params params = {0}; struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); - bool *recording_enabled = recording_is_enabled(); + bool recording_enabled = recording_is_enabled(); settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); - if (!*recording_enabled) + if (!recording_enabled) return false; - recording_file[0] = '\0'; + output[0] = '\0'; if (rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) { @@ -343,19 +356,36 @@ bool recording_init(void) (float)av_info->timing.fps, (float)av_info->timing.sample_rate); - strlcpy(recording_file, global->record.path, sizeof(recording_file)); + if (!string_is_empty(global->record.path)) + strlcpy(output, global->record.path, sizeof(output)); + else + { + if(streaming_is_enabled()) + if (!string_is_empty(settings->paths.path_stream_url)) + strlcpy(output, settings->paths.path_stream_url, sizeof(output)); + else + /* to-do determine the local interface, this won't work for connecting over the internet*/ + snprintf(output, sizeof(output), "udp://127.0.0.1:%u", settings->uints.video_stream_port); + else + { + const char *game_name = path_basename(path_get(RARCH_PATH_BASENAME)); + fill_str_dated_filename(buf, game_name, + "mkv", sizeof(buf)); + fill_pathname_join(output, global->record.output_dir, buf, sizeof(output)); + } + } if (recording_use_output_dir) - fill_pathname_join(recording_file, + fill_pathname_join(output, global->record.output_dir, - global->record.path, sizeof(recording_file)); + global->record.path, sizeof(output)); params.out_width = av_info->geometry.base_width; params.out_height = av_info->geometry.base_height; params.fb_width = av_info->geometry.max_width; params.fb_height = av_info->geometry.max_height; params.channels = 2; - params.filename = recording_file; + params.filename = output; params.fps = av_info->timing.fps; params.samplerate = av_info->timing.sample_rate; params.pix_fmt = (video_driver_get_pixel_format() == RETRO_PIXEL_FORMAT_XRGB8888) ? @@ -364,6 +394,13 @@ bool recording_init(void) if (!string_is_empty(global->record.config)) params.config = global->record.config; + else + { + if (streaming_is_enabled()) + params.config = settings->paths.path_stream_config; + else + params.config = settings->paths.path_record_config; + } if (video_driver_supports_recording()) { @@ -443,7 +480,7 @@ bool recording_init(void) RARCH_LOG("%s %s @ %ux%u. (FB size: %ux%u pix_fmt: %u)\n", msg_hash_to_str(MSG_RECORDING_TO), - global->record.path, + output, params.out_width, params.out_height, params.fb_width, params.fb_height, (unsigned)params.pix_fmt); diff --git a/record/record_driver.h b/record/record_driver.h index a8b087163a..facd30ff83 100644 --- a/record/record_driver.h +++ b/record/record_driver.h @@ -160,7 +160,7 @@ void find_record_driver(void); **/ bool recording_init(void); -bool *recording_is_enabled(void); +bool recording_is_enabled(void); void recording_set_state(bool state); diff --git a/retroarch.c b/retroarch.c index 183025e772..46b1379a35 100644 --- a/retroarch.c +++ b/retroarch.c @@ -884,10 +884,10 @@ static void retroarch_parse_input_and_config(int argc, char *argv[]) strlcpy(global->record.path, optarg, sizeof(global->record.path)); { - bool *recording_enabled = recording_is_enabled(); + bool recording_enabled = recording_is_enabled(); if (recording_enabled) - *recording_enabled = true; + recording_set_state(true); } break; @@ -1320,6 +1320,7 @@ static void retroarch_main_init_media(void) bool retroarch_main_init(int argc, char *argv[]) { bool init_failed = false; + global_t *global = global_get_ptr(); retroarch_init_state(); @@ -1398,7 +1399,8 @@ bool retroarch_main_init(int argc, char *argv[]) command_event(CMD_EVENT_MAPPER_INIT, NULL); command_event(CMD_EVENT_REWIND_INIT, NULL); command_event(CMD_EVENT_CONTROLLERS_INIT, NULL); - command_event(CMD_EVENT_RECORD_INIT, NULL); + if (!string_is_empty(global->record.path)) + command_event(CMD_EVENT_RECORD_INIT, NULL); path_init_savefile(); @@ -3188,10 +3190,16 @@ static enum runloop_state runloop_check_state( { static bool old_pressed = false; bool pressed = BIT256_GET( - current_input, RARCH_MOVIE_RECORD_TOGGLE); + current_input, RARCH_BSV_RECORD_TOGGLE); if (pressed && !old_pressed) + { + if (!recording_is_enabled()) + command_event(CMD_EVENT_RECORD_INIT, NULL); + else + command_event(CMD_EVENT_RECORD_DEINIT, NULL); bsv_movie_check(); + } old_pressed = pressed; }