Merge pull request #7225 from fr500/master

WIP: [record] start whipping some sense into this feature
This commit is contained in:
Twinaphex 2018-09-17 06:16:13 +02:00 committed by GitHub
commit 4f85ca5f9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 155 additions and 92 deletions

View File

@ -18,7 +18,8 @@
"driver.h": "c",
"iosfwd": "c",
"xlocbuf": "c",
"xmemory0": "c"
"xmemory0": "c",
"ios": "c"
},
"C_Cpp.dimInactiveRegions": false,
}

View File

@ -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)

View File

@ -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)

View File

@ -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 },

View File

@ -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';

View File

@ -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];

View File

@ -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;

View File

@ -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,

View File

@ -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),

View File

@ -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;

View File

@ -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")

View File

@ -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;

View File

@ -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,
"静音开关")

View File

@ -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;

View File

@ -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,
"靜音開關")

View File

@ -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;

View File

@ -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")

View File

@ -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")

View File

@ -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;

View File

@ -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(

View File

@ -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")

View File

@ -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;

View File

@ -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 ")

View File

@ -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;

View File

@ -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,
"消音")

View File

@ -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;

View File

@ -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,
"음소거 켜기/끄기")

View File

@ -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")

View File

@ -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")

View File

@ -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;

View File

@ -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(

View File

@ -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;

View File

@ -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")

View File

@ -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,
"Заглушить звук")

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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")

View File

@ -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,

View File

@ -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,

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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;
}