From 67c67f566f839d27af0bfd7e55191c2080073a9d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 00:30:10 +0200 Subject: [PATCH 001/274] Cleanups --- audio/audio_driver.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index e9a024e210..e9e8c7055b 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -764,14 +764,12 @@ void audio_driver_monitor_adjust_system_rates(void) { float timing_skew; settings_t *settings = config_get_ptr(); - const struct retro_system_timing *info = NULL; struct retro_system_av_info *av_info = video_viewport_get_system_av_info(); float video_refresh_rate = settings->floats.video_refresh_rate; float max_timing_skew = settings->floats.audio_max_timing_skew; + const struct retro_system_timing *info = av_info ? + (const struct retro_system_timing*)&av_info->timing : NULL; - if (av_info) - info = (const struct retro_system_timing*)&av_info->timing; - if (!info || info->sample_rate <= 0.0) return; From 281dd9b4ac106d11a2c50cc24e1849cf8c1a8ed1 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 00:40:13 +0200 Subject: [PATCH 002/274] bsv_movie_check - cleanup --- movie.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/movie.c b/movie.c index 5b3179b82b..db91d37f06 100644 --- a/movie.c +++ b/movie.c @@ -557,19 +557,15 @@ static bool runloop_check_movie_init(void) bool bsv_movie_check(void) { - if (bsv_movie_state_handle && bsv_movie_state.movie_playback) + if (!bsv_movie_state_handle) + return runloop_check_movie_init(); + + if (bsv_movie_state.movie_playback) { if (!bsv_movie_state.movie_end) return false; return bsv_movie_check_movie_playback(); } - if (!bsv_movie_state_handle) - { - if (bsv_movie_state_handle) - return false; - return runloop_check_movie_init(); - } - return runloop_check_movie_record(); } From bac997335466239844c860f28fba1f454d107062 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 00:58:01 +0200 Subject: [PATCH 003/274] Cleanups --- gfx/drivers/gl.c | 2 +- gfx/drivers/vulkan.c | 2 +- gfx/video_driver.c | 3 +++ gfx/video_driver.h | 53 +++++++++++++++++++++----------------------- input/input_driver.c | 5 +++-- 5 files changed, 33 insertions(+), 32 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 257dd53b44..918ca002ac 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1318,7 +1318,7 @@ static bool gl_frame(void *data, const void *frame, * and pause to prevent flicker. */ if ( video_info->black_frame_insertion - && !input_driver_is_nonblock_state() + && !video_info->input_driver_nonblock_state && !video_info->runloop_is_slowmotion && !video_info->runloop_is_paused) { diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index 9dd26eda12..bbbe535a1e 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -1961,7 +1961,7 @@ static bool vulkan_frame(void *data, const void *frame, * and pause to prevent flicker. */ if ( video_info->black_frame_insertion - && !input_driver_is_nonblock_state() + && !video_info->input_driver_nonblock_state && !video_info->runloop_is_slowmotion && !video_info->runloop_is_paused) { diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 2529a627c5..2b8784b395 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -53,6 +53,7 @@ #include "../driver.h" #include "../retroarch.h" #include "../runloop.h" +#include "../input/input_driver.h" #include "../list_special.h" #include "../core.h" #include "../command.h" @@ -2338,6 +2339,8 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->runloop_is_paused = is_paused; video_info->runloop_is_idle = is_idle; video_info->runloop_is_slowmotion = is_slowmotion; + + video_info->input_driver_nonblock_state = input_driver_is_nonblock_state(); #ifdef HAVE_THREADS video_driver_threaded_unlock(is_threaded); #endif diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 869aae8e47..86931811ab 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -114,60 +114,57 @@ typedef struct video_info typedef struct video_frame_info { - float menu_wallpaper_opacity; - float refresh_rate; + bool input_driver_nonblock_state; bool shared_context; bool black_frame_insertion; bool hard_sync; - unsigned hard_sync_frames; bool fps_show; bool scale_integer; - unsigned aspect_ratio_idx; bool post_filter_record; - unsigned max_swapchain_images; bool windowed_fullscreen; bool fullscreen; - unsigned monitor_index; bool font_enable; - char fps_text[128]; - - unsigned width; - unsigned height; - - float font_msg_pos_x; - float font_msg_pos_y; - float font_msg_color_r; - float font_msg_color_g; - float font_msg_color_b; bool use_rgba; bool libretro_running; - - float menu_header_opacity; - float menu_footer_opacity; - bool xmb_shadows_enable; - float xmb_alpha_factor; - unsigned xmb_theme; - unsigned xmb_color_theme; - unsigned menu_shader_pipeline; - - unsigned materialui_color_theme; - bool battery_level_enable; bool timedate_enable; bool runloop_is_slowmotion; bool runloop_is_idle; bool runloop_is_paused; bool is_perfcnt_enable; - bool menu_is_alive; int custom_vp_x; int custom_vp_y; + + unsigned hard_sync_frames; + unsigned aspect_ratio_idx; + unsigned max_swapchain_images; + unsigned monitor_index; + unsigned width; + unsigned height; + unsigned xmb_theme; + unsigned xmb_color_theme; + unsigned menu_shader_pipeline; + unsigned materialui_color_theme; unsigned custom_vp_width; unsigned custom_vp_height; unsigned custom_vp_full_width; unsigned custom_vp_full_height; + + float menu_wallpaper_opacity; + float refresh_rate; + float font_msg_pos_x; + float font_msg_pos_y; + float font_msg_color_r; + float font_msg_color_g; + float font_msg_color_b; + float menu_header_opacity; + float menu_footer_opacity; + float xmb_alpha_factor; + + char fps_text[128]; } video_frame_info_t; /* Optionally implemented interface to poke more diff --git a/input/input_driver.c b/input/input_driver.c index a7dbaf9c7f..ec0e95619d 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1015,10 +1015,11 @@ void input_driver_poll(void) bool input_driver_init(void) { - settings_t *settings = config_get_ptr(); - if (current_input) + { + settings_t *settings = config_get_ptr(); current_input_data = current_input->init(settings->arrays.input_joypad_driver); + } if (!current_input_data) return false; From fa5d2b992023381d924b75647bd8431e83df2135 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 01:00:42 +0200 Subject: [PATCH 004/274] Remove audiomixer-test.diff --- audiomixer-test.diff | 37 ------------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 audiomixer-test.diff diff --git a/audiomixer-test.diff b/audiomixer-test.diff deleted file mode 100644 index 1581b11694..0000000000 --- a/audiomixer-test.diff +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/audio/audio_driver.c b/audio/audio_driver.c -index 10dcbc5b3..0d2bb4d85 100644 ---- a/audio/audio_driver.c -+++ b/audio/audio_driver.c -@@ -464,6 +464,8 @@ static bool audio_driver_init_internal(bool audio_cb_inited) - - audio_driver_free_samples_count = 0; - -+ audio_mixer_init(48000); -+ - /* Threaded driver is initially stopped. */ - if ( - audio_driver_active -@@ -597,6 +599,8 @@ static bool audio_driver_flush(const int16_t *data, size_t samples) - - audio_driver_resampler->process(audio_driver_resampler_data, &src_data); - -+ audio_mixer_mix(audio_driver_output_samples_buf, src_data.output_frames); -+ - output_data = audio_driver_output_samples_buf; - output_frames = (unsigned)src_data.output_frames; - -diff --git a/runloop.c b/runloop.c -index 0e3a8dc44..4f79b2ed7 100644 ---- a/runloop.c -+++ b/runloop.c -@@ -1021,7 +1021,10 @@ static enum runloop_state runloop_check_state( - command_event(CMD_EVENT_DISK_PREV, NULL); - - if (runloop_cmd_triggered(trigger_input, RARCH_RESET)) -+ { - command_event(CMD_EVENT_RESET, NULL); -+ audio_mixer_load_ogg("/home/squarepusher/SumertimeBlues.ogg"); -+ } - - cheat_manager_state_checks( - runloop_cmd_triggered(trigger_input, RARCH_CHEAT_INDEX_PLUS), From f928e570643b0de6e3bb9c20ae49eb41da0ccdbe Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 01:25:59 +0200 Subject: [PATCH 005/274] Combine video_context_driver.c and video_driver.c --- Makefile.common | 3 +- dynamic.c | 2 +- gfx/common/egl_common.h | 2 +- gfx/common/gl_common.h | 2 +- gfx/common/vulkan_common.h | 2 +- gfx/common/win32_common.h | 2 +- gfx/common/x11_common.h | 1 - gfx/drivers/d3d.h | 2 +- gfx/drivers/dispmanx_gfx.c | 1 - gfx/drivers/drm_gfx.c | 1 - gfx/drivers/gl.c | 1 - gfx/drivers/omap_gfx.c | 2 - gfx/drivers/sdl2_gfx.c | 1 - gfx/drivers/sdl_gfx.c | 2 - gfx/drivers/vg.c | 1 - gfx/drivers/vita2d_gfx.c | 1 - gfx/drivers/vulkan.c | 1 - gfx/drivers_context/cgl_ctx.c | 2 +- gfx/drivers_context/cocoa_gl_ctx.m | 2 +- gfx/drivers_context/emscriptenegl_ctx.c | 2 +- gfx/drivers_context/gdi_ctx.cpp | 2 +- gfx/drivers_context/gfx_null_ctx.c | 2 +- gfx/drivers_context/ps3_ctx.c | 2 +- gfx/drivers_context/vc_egl_ctx.c | 2 +- gfx/drivers_context/wgl_ctx.cpp | 2 +- gfx/drivers_font/gl_raster_font.c | 2 +- gfx/video_context_driver.c | 516 --------------------- gfx/video_context_driver.h | 349 -------------- gfx/video_driver.c | 487 ++++++++++++++++++- gfx/video_driver.h | 319 +++++++++++++ gfx/video_shader_driver.h | 2 +- griffin/griffin.c | 2 - input/drivers/sdl_input.c | 2 +- menu/drivers/xui.cpp | 1 - menu/drivers_display/menu_display_caca.c | 2 +- menu/drivers_display/menu_display_ctr.c | 2 +- menu/drivers_display/menu_display_d3d.cpp | 2 +- menu/drivers_display/menu_display_gdi.c | 2 +- menu/drivers_display/menu_display_gl.c | 2 +- menu/drivers_display/menu_display_null.c | 2 +- menu/drivers_display/menu_display_vga.c | 2 +- menu/drivers_display/menu_display_vita2d.c | 2 +- menu/drivers_display/menu_display_vulkan.c | 2 +- menu/menu_display.h | 2 +- ui/drivers/ui_win32.c | 2 +- 45 files changed, 834 insertions(+), 911 deletions(-) delete mode 100644 gfx/video_context_driver.c delete mode 100644 gfx/video_context_driver.h diff --git a/Makefile.common b/Makefile.common index 62a4f904c7..3d86328675 100644 --- a/Makefile.common +++ b/Makefile.common @@ -769,8 +769,7 @@ endif # Video -OBJ += gfx/video_context_driver.o \ - gfx/drivers_context/gfx_null_ctx.o \ +OBJ += gfx/drivers_context/gfx_null_ctx.o \ gfx/video_state_tracker.o ifeq ($(HAVE_KMS), 1) diff --git a/dynamic.c b/dynamic.c index 9d09cde824..d8341466a4 100644 --- a/dynamic.c +++ b/dynamic.c @@ -50,7 +50,7 @@ #include "core.h" #include "driver.h" #include "performance_counters.h" -#include "gfx/video_context_driver.h" +#include "gfx/video_driver.h" #include "cores/internal_cores.h" #include "frontend/frontend_driver.h" diff --git a/gfx/common/egl_common.h b/gfx/common/egl_common.h index 5e1dbc8ad1..70f48b666d 100644 --- a/gfx/common/egl_common.h +++ b/gfx/common/egl_common.h @@ -26,7 +26,7 @@ #include #include -#include "../video_context_driver.h" +#include "../video_driver.h" #ifndef EGL_CONTEXT_FLAGS_KHR #define EGL_CONTEXT_FLAGS_KHR 0x30FC diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 46514d99f5..636d005618 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -31,7 +31,7 @@ #include "../../verbosity.h" #include "../font_driver.h" #include "../video_coord_array.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../drivers/gl_symlinks.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index a849d40410..69298845c5 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -46,7 +46,7 @@ #include "../../retroarch.h" #include "../../verbosity.h" #include "../font_driver.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../drivers_shader/shader_vulkan.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index d0a2baa31e..0dfca29025 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -27,7 +27,7 @@ #include #include #include "../../driver.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #ifdef _XBOX #include "../../defines/xdk_defines.h" diff --git a/gfx/common/x11_common.h b/gfx/common/x11_common.h index ad745a70a7..96924485c1 100644 --- a/gfx/common/x11_common.h +++ b/gfx/common/x11_common.h @@ -22,7 +22,6 @@ #include #include "../video_driver.h" -#include "../video_context_driver.h" extern Window g_x11_win; extern Display *g_x11_dpy; diff --git a/gfx/drivers/d3d.h b/gfx/drivers/d3d.h index f78d8ccf12..919477fa72 100644 --- a/gfx/drivers/d3d.h +++ b/gfx/drivers/d3d.h @@ -51,7 +51,7 @@ #endif #include "../font_driver.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../common/d3d_common.h" #include "../video_renderchain_driver.h" #ifdef _XBOX diff --git a/gfx/drivers/dispmanx_gfx.c b/gfx/drivers/dispmanx_gfx.c index 0249322e6e..e69504770e 100644 --- a/gfx/drivers/dispmanx_gfx.c +++ b/gfx/drivers/dispmanx_gfx.c @@ -28,7 +28,6 @@ #include "../../driver.h" #include "../../retroarch.h" -#include "../video_context_driver.h" #include "../font_driver.h" struct dispmanx_page diff --git a/gfx/drivers/drm_gfx.c b/gfx/drivers/drm_gfx.c index 99eed65b59..223ab63aaa 100644 --- a/gfx/drivers/drm_gfx.c +++ b/gfx/drivers/drm_gfx.c @@ -37,7 +37,6 @@ #endif #include "../font_driver.h" -#include "../video_context_driver.h" #include "../../retroarch.h" #include "drm_pixformats.h" diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 918ca002ac..fcc51031d1 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -54,7 +54,6 @@ #endif #include "../font_driver.h" -#include "../video_context_driver.h" #ifdef HAVE_GLSL #include "../drivers_shader/shader_glsl.h" diff --git a/gfx/drivers/omap_gfx.c b/gfx/drivers/omap_gfx.c index 3ddfcbd0ba..1adb488de1 100644 --- a/gfx/drivers/omap_gfx.c +++ b/gfx/drivers/omap_gfx.c @@ -49,8 +49,6 @@ #include "../../driver.h" #include "../../retroarch.h" -#include "../video_context_driver.h" - typedef struct omapfb_page { unsigned yoffset; diff --git a/gfx/drivers/sdl2_gfx.c b/gfx/drivers/sdl2_gfx.c index 1585460dad..d7c479d9e1 100644 --- a/gfx/drivers/sdl2_gfx.c +++ b/gfx/drivers/sdl2_gfx.c @@ -41,7 +41,6 @@ #include "../../configuration.h" #include "../../retroarch.h" #include "../../verbosity.h" -#include "../video_context_driver.h" typedef struct sdl2_tex { diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index 25d14d4ce2..9154acc628 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -44,8 +44,6 @@ #include "../../configuration.h" -#include "../video_context_driver.h" - typedef struct sdl_menu_frame { bool active; diff --git a/gfx/drivers/vg.c b/gfx/drivers/vg.c index 9902ab4945..157c1c232f 100644 --- a/gfx/drivers/vg.c +++ b/gfx/drivers/vg.c @@ -37,7 +37,6 @@ #endif #include "../font_driver.h" -#include "../video_context_driver.h" #include "../../retroarch.h" #include "../../driver.h" diff --git a/gfx/drivers/vita2d_gfx.c b/gfx/drivers/vita2d_gfx.c index 7a18ebdff6..c6e6b8b1b9 100644 --- a/gfx/drivers/vita2d_gfx.c +++ b/gfx/drivers/vita2d_gfx.c @@ -33,7 +33,6 @@ #include "../common/vita2d_common.h" #include "../../driver.h" #include "../video_coord_array.h" -#include "../video_context_driver.h" #include "../../verbosity.h" #include "../../configuration.h" diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index bbbe535a1e..2902ec3912 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -47,7 +47,6 @@ #include "../../retroarch.h" #include "../../verbosity.h" -#include "../video_context_driver.h" #include "../video_coord_array.h" static void vulkan_set_viewport(void *data, unsigned viewport_width, diff --git a/gfx/drivers_context/cgl_ctx.c b/gfx/drivers_context/cgl_ctx.c index 74ab9c3f64..95673270a0 100644 --- a/gfx/drivers_context/cgl_ctx.c +++ b/gfx/drivers_context/cgl_ctx.c @@ -29,7 +29,7 @@ #include #include -#include "../video_context_driver.h" +#include "../video_driver.h" typedef int CGSConnectionID; typedef int CGSWindowID; diff --git a/gfx/drivers_context/cocoa_gl_ctx.m b/gfx/drivers_context/cocoa_gl_ctx.m index d43a888bdc..64377471dd 100644 --- a/gfx/drivers_context/cocoa_gl_ctx.m +++ b/gfx/drivers_context/cocoa_gl_ctx.m @@ -39,7 +39,7 @@ #include #import "../../ui/drivers/cocoa/cocoa_common.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../../configuration.h" #include "../../verbosity.h" diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c index 8212507112..3bc7264441 100644 --- a/gfx/drivers_context/emscriptenegl_ctx.c +++ b/gfx/drivers_context/emscriptenegl_ctx.c @@ -25,7 +25,7 @@ #include "../../config.h" #endif -#include "../video_context_driver.h" +#include "../video_driver.h" #ifdef HAVE_EGL #include "../common/egl_common.h" diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index 9e9b770262..f423684ac5 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -35,7 +35,7 @@ #include "../../configuration.h" #include "../../dynamic.h" #include "../../verbosity.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../common/win32_common.h" diff --git a/gfx/drivers_context/gfx_null_ctx.c b/gfx/drivers_context/gfx_null_ctx.c index ff51ea6de4..d045ae797c 100644 --- a/gfx/drivers_context/gfx_null_ctx.c +++ b/gfx/drivers_context/gfx_null_ctx.c @@ -16,7 +16,7 @@ /* Null context. */ -#include "../video_context_driver.h" +#include "../video_driver.h" static void gfx_ctx_null_swap_interval(void *data, unsigned interval) { diff --git a/gfx/drivers_context/ps3_ctx.c b/gfx/drivers_context/ps3_ctx.c index fb3af25cdb..8deafaff37 100644 --- a/gfx/drivers_context/ps3_ctx.c +++ b/gfx/drivers_context/ps3_ctx.c @@ -33,7 +33,7 @@ #include "../../configuration.h" #include "../../defines/ps3_defines.h" #include "../common/gl_common.h" -#include "../video_context_driver.h" +#include "../video_driver.h" typedef struct gfx_ctx_ps3_data { diff --git a/gfx/drivers_context/vc_egl_ctx.c b/gfx/drivers_context/vc_egl_ctx.c index fee7c6f2fe..0872e24636 100644 --- a/gfx/drivers_context/vc_egl_ctx.c +++ b/gfx/drivers_context/vc_egl_ctx.c @@ -32,7 +32,7 @@ #include #include "../../configuration.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../../frontend/frontend_driver.h" diff --git a/gfx/drivers_context/wgl_ctx.cpp b/gfx/drivers_context/wgl_ctx.cpp index 9d082947f1..15fc5c10b9 100644 --- a/gfx/drivers_context/wgl_ctx.cpp +++ b/gfx/drivers_context/wgl_ctx.cpp @@ -41,7 +41,7 @@ #include "../../configuration.h" #include "../../dynamic.h" -#include "../video_context_driver.h" +#include "../video_driver.h" #include "../common/win32_common.h" diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index bb4896ed69..f69e8c2652 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -23,7 +23,7 @@ #include "../common/gl_common.h" #include "../font_driver.h" #include "../video_shader_driver.h" -#include "../video_context_driver.h" +#include "../video_driver.h" /* TODO: Move viewport side effects to the caller: it's a source of bugs. */ diff --git a/gfx/video_context_driver.c b/gfx/video_context_driver.c deleted file mode 100644 index a25bcedeb2..0000000000 --- a/gfx/video_context_driver.c +++ /dev/null @@ -1,516 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2016-2017 - Brad Parker - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#include - -#include -#include - -#include "video_context_driver.h" - -#ifdef HAVE_CONFIG_H -#include "../config.h" -#endif - -#include "../configuration.h" -#include "../runloop.h" -#include "../verbosity.h" - -static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { -#if defined(__CELLOS_LV2__) - &gfx_ctx_ps3, -#endif -#if defined(HAVE_D3D) - &gfx_ctx_d3d, -#endif -#if defined(HAVE_VIDEOCORE) - &gfx_ctx_videocore, -#endif -#if defined(HAVE_MALI_FBDEV) - &gfx_ctx_mali_fbdev, -#endif -#if defined(HAVE_VIVANTE_FBDEV) - &gfx_ctx_vivante_fbdev, -#endif -#if defined(HAVE_OPENDINGUX_FBDEV) - &gfx_ctx_opendingux_fbdev, -#endif -#if defined(_WIN32) && (defined(HAVE_OPENGL) || defined(HAVE_VULKAN)) - &gfx_ctx_wgl, -#endif -#if defined(HAVE_WAYLAND) - &gfx_ctx_wayland, -#endif -#if defined(HAVE_X11) && !defined(HAVE_OPENGLES) -#if defined(HAVE_OPENGL) || defined(HAVE_VULKAN) - &gfx_ctx_x, -#endif -#endif -#if defined(HAVE_X11) && defined(HAVE_OPENGL) && defined(HAVE_EGL) - &gfx_ctx_x_egl, -#endif -#if defined(HAVE_KMS) - &gfx_ctx_drm, -#endif -#if defined(ANDROID) - &gfx_ctx_android, -#endif -#if defined(__QNX__) - &gfx_ctx_qnx, -#endif -#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) - &gfx_ctx_cocoagl, -#endif -#if defined(__APPLE__) && !defined(TARGET_IPHONE_SIMULATOR) && !defined(TARGET_OS_IPHONE) - &gfx_ctx_cgl, -#endif -#if (defined(HAVE_SDL) || defined(HAVE_SDL2)) && defined(HAVE_OPENGL) - &gfx_ctx_sdl_gl, -#endif -#ifdef HAVE_OSMESA - &gfx_ctx_osmesa, -#endif -#ifdef EMSCRIPTEN - &gfx_ctx_emscripten, -#endif -#if defined(HAVE_VULKAN) && defined(HAVE_VULKAN_DISPLAY) - &gfx_ctx_khr_display, -#endif -#if defined(_WIN32) && !defined(_XBOX) - &gfx_ctx_gdi, -#endif - &gfx_ctx_null, - NULL -}; - -const gfx_ctx_driver_t *current_video_context = NULL; -void *video_context_data = NULL; - -/** - * find_video_context_driver_driver_index: - * @ident : Identifier of resampler driver to find. - * - * Finds graphics context driver index by @ident name. - * - * Returns: graphics context driver index if driver was found, otherwise - * -1. - **/ -static int find_video_context_driver_index(const char *ident) -{ - unsigned i; - for (i = 0; gfx_ctx_drivers[i]; i++) - if (string_is_equal_noncase(ident, gfx_ctx_drivers[i]->ident)) - return i; - return -1; -} - -/** - * find_prev_context_driver: - * - * Finds previous driver in graphics context driver array. - **/ -bool video_context_driver_find_prev_driver(void) -{ - settings_t *settings = config_get_ptr(); - int i = find_video_context_driver_index( - settings->arrays.video_context_driver); - - if (i > 0) - { - strlcpy(settings->arrays.video_context_driver, - gfx_ctx_drivers[i - 1]->ident, - sizeof(settings->arrays.video_context_driver)); - return true; - } - - RARCH_WARN("Couldn't find any previous video context driver.\n"); - return false; -} - -/** - * find_next_context_driver: - * - * Finds next driver in graphics context driver array. - **/ -bool video_context_driver_find_next_driver(void) -{ - settings_t *settings = config_get_ptr(); - int i = find_video_context_driver_index(settings->arrays.video_context_driver); - - if (i >= 0 && gfx_ctx_drivers[i + 1]) - { - strlcpy(settings->arrays.video_context_driver, - gfx_ctx_drivers[i + 1]->ident, - sizeof(settings->arrays.video_context_driver)); - return true; - } - - RARCH_WARN("Couldn't find any next video context driver.\n"); - return false; -} - -/** - * video_context_driver_init: - * @data : Input data. - * @ctx : Graphics context driver to initialize. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Initialize graphics context driver. - * - * Returns: graphics context driver if successfully initialized, otherwise NULL. - **/ -static const gfx_ctx_driver_t *video_context_driver_init( - void *data, - const gfx_ctx_driver_t *ctx, - const char *ident, - enum gfx_ctx_api api, unsigned major, - unsigned minor, bool hw_render_ctx) -{ - if (ctx->bind_api(data, api, major, minor)) - { - video_frame_info_t video_info; - void *ctx_data = NULL; - - video_driver_build_info(&video_info); - - ctx_data = ctx->init(&video_info, data); - - if (!ctx_data) - return NULL; - - if (ctx->bind_hw_render) - ctx->bind_hw_render(ctx_data, - video_info.shared_context && hw_render_ctx); - - video_context_driver_set_data(ctx_data); - return ctx; - } - -#ifndef _WIN32 - RARCH_WARN("Failed to bind API (#%u, version %u.%u) on context driver \"%s\".\n", - (unsigned)api, major, minor, ctx->ident); -#endif - - return NULL; -} - -/** - * video_context_driver_find_driver: - * @data : Input data. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Finds graphics context driver and initializes. - * - * Returns: graphics context driver if found, otherwise NULL. - **/ -static const gfx_ctx_driver_t *video_context_driver_find_driver(void *data, - const char *ident, - enum gfx_ctx_api api, unsigned major, - unsigned minor, bool hw_render_ctx) -{ - int i = find_video_context_driver_index(ident); - - if (i >= 0) - return video_context_driver_init(data, gfx_ctx_drivers[i], ident, - api, major, minor, hw_render_ctx); - - for (i = 0; gfx_ctx_drivers[i]; i++) - { - const gfx_ctx_driver_t *ctx = - video_context_driver_init(data, gfx_ctx_drivers[i], ident, - api, major, minor, hw_render_ctx); - - if (ctx) - return ctx; - } - - return NULL; -} - -/** - * video_context_driver_init_first: - * @data : Input data. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Finds first suitable graphics context driver and initializes. - * - * Returns: graphics context driver if found, otherwise NULL. - **/ -const gfx_ctx_driver_t *video_context_driver_init_first(void *data, - const char *ident, enum gfx_ctx_api api, unsigned major, - unsigned minor, bool hw_render_ctx) -{ - return video_context_driver_find_driver(data, ident, api, - major, minor, hw_render_ctx); -} - -bool video_context_driver_check_window(gfx_ctx_size_t *size_data) -{ - if ( video_context_data - && current_video_context - && current_video_context->check_window) - { - bool is_shutdown = runloop_ctl(RUNLOOP_CTL_IS_SHUTDOWN, NULL); - current_video_context->check_window(video_context_data, - size_data->quit, - size_data->resize, - size_data->width, - size_data->height, - is_shutdown); - return true; - } - - return false; -} - -bool video_context_driver_init_image_buffer(const video_info_t *data) -{ - if ( current_video_context - && current_video_context->image_buffer_init - && current_video_context->image_buffer_init(video_context_data, data)) - return true; - return false; -} - -bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img) -{ - if ( current_video_context - && current_video_context->image_buffer_write - && current_video_context->image_buffer_write(video_context_data, - img->frame, img->width, img->height, img->pitch, - img->rgb32, img->index, img->handle)) - return true; - return false; -} - -bool video_context_driver_get_video_output_prev(void) -{ - if (!current_video_context - || !current_video_context->get_video_output_prev) - return false; - current_video_context->get_video_output_prev(video_context_data); - return true; -} - -bool video_context_driver_get_video_output_next(void) -{ - if (!current_video_context || - !current_video_context->get_video_output_next) - return false; - current_video_context->get_video_output_next(video_context_data); - return true; -} - -bool video_context_driver_bind_hw_render(bool *enable) -{ - if (!current_video_context || !current_video_context->bind_hw_render) - return false; - current_video_context->bind_hw_render(video_context_data, *enable); - return true; -} - -void video_context_driver_make_current(bool release) -{ - if (current_video_context && current_video_context->make_current) - current_video_context->make_current(release); -} - -bool video_context_driver_set(const gfx_ctx_driver_t *data) -{ - if (!data) - return false; - current_video_context = data; - return true; -} - -void video_context_driver_destroy(void) -{ - current_video_context = NULL; -} - -bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect) -{ - if (!video_context_data || !aspect) - return false; - if (!current_video_context->translate_aspect) - return false; - *aspect->aspect = current_video_context->translate_aspect( - video_context_data, aspect->width, aspect->height); - return true; -} - -void video_context_driver_free(void) -{ - if (current_video_context->destroy) - current_video_context->destroy(video_context_data); - current_video_context = NULL; - video_context_data = NULL; -} - -bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data) -{ - if (!size_data) - return false; - if (!current_video_context || !current_video_context->get_video_output_size) - return false; - current_video_context->get_video_output_size(video_context_data, - size_data->width, size_data->height); - return true; -} - -bool video_context_driver_swap_interval(unsigned *interval) -{ - if (!current_video_context || !current_video_context->swap_interval) - return false; - current_video_context->swap_interval(video_context_data, *interval); - return true; -} - -bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc) -{ - if (!current_video_context || !current_video_context->get_proc_address) - return false; - - proc->addr = current_video_context->get_proc_address(proc->sym); - - return true; -} - -bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics) -{ - if ( current_video_context - && current_video_context->get_metrics - && current_video_context->get_metrics(video_context_data, - metrics->type, - metrics->value)) - return true; - return false; -} - -bool video_context_driver_input_driver(gfx_ctx_input_t *inp) -{ - settings_t *settings = config_get_ptr(); - const char *joypad_name = settings ? settings->arrays.input_joypad_driver : NULL; - - if (!current_video_context || !current_video_context->input_driver) - return false; - current_video_context->input_driver( - video_context_data, joypad_name, - inp->input, inp->input_data); - return true; -} - -bool video_context_driver_suppress_screensaver(bool *bool_data) -{ - if ( video_context_data - && current_video_context - && current_video_context->suppress_screensaver( - video_context_data, *bool_data)) - return true; - return false; -} - -bool video_context_driver_get_ident(gfx_ctx_ident_t *ident) -{ - if (!ident) - return false; - ident->ident = NULL; - if (current_video_context) - ident->ident = current_video_context->ident; - return true; -} - -bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info) -{ - video_frame_info_t video_info; - - if (!current_video_context || !current_video_context->set_video_mode) - return false; - - video_driver_build_info(&video_info); - - if (!current_video_context->set_video_mode( - video_context_data, &video_info, mode_info->width, - mode_info->height, mode_info->fullscreen)) - return false; - return true; -} - -bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info) -{ - if (!current_video_context || !current_video_context->get_video_size) - return false; - current_video_context->get_video_size(video_context_data, - &mode_info->width, &mode_info->height); - return true; -} - -bool video_context_driver_get_context_data(void *data) -{ - if (!current_video_context || !current_video_context->get_context_data) - return false; - *(void**)data = current_video_context->get_context_data(video_context_data); - return true; -} - -bool video_context_driver_show_mouse(bool *bool_data) -{ - if (!current_video_context || !current_video_context->show_mouse) - return false; - current_video_context->show_mouse(video_context_data, *bool_data); - return true; -} - -void video_context_driver_set_data(void *data) -{ - video_context_data = data; -} - -bool video_context_driver_get_flags(gfx_ctx_flags_t *flags) -{ - if (!flags) - return false; - if (!current_video_context || !current_video_context->get_flags) - return false; - flags->flags = current_video_context->get_flags(video_context_data); - return true; -} - -bool video_context_driver_set_flags(gfx_ctx_flags_t *flags) -{ - if (!flags) - return false; - if (!current_video_context || !current_video_context->set_flags) - return false; - current_video_context->set_flags(video_context_data, flags->flags); - return true; -} diff --git a/gfx/video_context_driver.h b/gfx/video_context_driver.h deleted file mode 100644 index 6bc9b30d4d..0000000000 --- a/gfx/video_context_driver.h +++ /dev/null @@ -1,349 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2016-2017 - Brad Parker - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#ifndef __VIDEO_CONTEXT_DRIVER_H -#define __VIDEO_CONTEXT_DRIVER_H - -#include -#include - -#include "video_driver.h" - -RETRO_BEGIN_DECLS - -#ifndef MAX_EGLIMAGE_TEXTURES -#define MAX_EGLIMAGE_TEXTURES 32 -#endif - -enum gfx_ctx_api -{ - GFX_CTX_NONE = 0, - GFX_CTX_OPENGL_API, - GFX_CTX_OPENGL_ES_API, - GFX_CTX_DIRECT3D8_API, - GFX_CTX_DIRECT3D9_API, - GFX_CTX_OPENVG_API, - GFX_CTX_VULKAN_API, - GFX_CTX_GDI_API -}; - -enum display_metric_types -{ - DISPLAY_METRIC_NONE = 0, - DISPLAY_METRIC_MM_WIDTH, - DISPLAY_METRIC_MM_HEIGHT, - DISPLAY_METRIC_DPI -}; - -enum display_flags -{ - GFX_CTX_FLAGS_NONE = 0, - GFX_CTX_FLAGS_GL_CORE_CONTEXT, - GFX_CTX_FLAGS_MULTISAMPLING, - GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES -}; - - -typedef void (*gfx_ctx_proc_t)(void); - -typedef struct gfx_ctx_driver -{ - /* The opaque pointer is the underlying video driver data (e.g. gl_t for - * OpenGL contexts). Although not advised, the context driver is allowed - * to hold a pointer to it as the context never outlives the video driver. - * - * The context driver is responsible for it's own data.*/ - void* (*init)(video_frame_info_t *video_info, void *video_driver); - void (*destroy)(void *data); - - /* Which API to bind to. */ - bool (*bind_api)(void *video_driver, enum gfx_ctx_api, - unsigned major, unsigned minor); - - /* Sets the swap interval. */ - void (*swap_interval)(void *data, unsigned); - - /* Sets video mode. Creates a window, etc. */ - bool (*set_video_mode)(void*, video_frame_info_t *video_info, unsigned, unsigned, bool); - - /* Gets current window size. - * If not initialized yet, it returns current screen size. */ - void (*get_video_size)(void*, unsigned*, unsigned*); - - void (*get_video_output_size)(void*, unsigned*, unsigned*); - - void (*get_video_output_prev)(void*); - - void (*get_video_output_next)(void*); - - bool (*get_metrics)(void *data, enum display_metric_types type, - float *value); - - /* Translates a window size to an aspect ratio. - * In most cases this will be just width / height, but - * some contexts will better know which actual aspect ratio is used. - * This can be NULL to assume the default behavior. - */ - float (*translate_aspect)(void*, unsigned, unsigned); - - /* Asks driver to update window title (FPS, etc). */ - void (*update_window_title)(void*, video_frame_info_t *video_info); - - /* Queries for resize and quit events. - * Also processes events. */ - void (*check_window)(void*, bool*, bool*, - unsigned*, unsigned*, bool); - - /* Acknowledge a resize event. This is needed for some APIs. - * Most backends will ignore this. */ - bool (*set_resize)(void*, unsigned, unsigned); - - /* Checks if window has input focus. */ - bool (*has_focus)(void*); - - /* Should the screensaver be suppressed? */ - bool (*suppress_screensaver)(void *data, bool enable); - - /* Checks if context driver has windowed support. */ - bool (*has_windowed)(void*); - - /* Swaps buffers. VBlank sync depends on - * earlier calls to swap_interval. */ - void (*swap_buffers)(void*, video_frame_info_t *video_info); - - /* Most video backends will want to use a certain input driver. - * Checks for it here. */ - void (*input_driver)(void*, const char *, const input_driver_t**, void**); - - /* Wraps whatever gl_proc_address() there is. - * Does not take opaque, to avoid lots of ugly wrapper code. */ - gfx_ctx_proc_t (*get_proc_address)(const char*); - - /* Returns true if this context supports EGLImage buffers for - * screen drawing and was initalized correctly. */ - bool (*image_buffer_init)(void*, const video_info_t*); - - /* Writes the frame to the EGLImage and sets image_handle to it. - * Returns true if a new image handle is created. - * Always returns true the first time it's called for a new index. - * The graphics core must handle a change in the handle correctly. */ - bool (*image_buffer_write)(void*, const void *frame, unsigned width, - unsigned height, unsigned pitch, bool rgb32, - unsigned index, void **image_handle); - - /* Shows or hides mouse. Can be NULL if context doesn't - * have a concept of mouse pointer. */ - void (*show_mouse)(void *data, bool state); - - /* Human readable string. */ - const char *ident; - - uint32_t (*get_flags)(void *data); - - void (*set_flags)(void *data, uint32_t flags); - - /* Optional. Binds HW-render offscreen context. */ - void (*bind_hw_render)(void *data, bool enable); - - /* Optional. Gets base data for the context which is used by the driver. - * This is mostly relevant for graphics APIs such as Vulkan - * which do not have global context state. */ - void *(*get_context_data)(void *data); - - /* Optional. Makes driver context (only GLX right now) - * active for this thread. */ - void (*make_current)(bool release); -} gfx_ctx_driver_t; - - -typedef struct gfx_ctx_flags -{ - uint32_t flags; -} gfx_ctx_flags_t; - -typedef struct gfx_ctx_size -{ - bool *quit; - bool *resize; - unsigned *width; - unsigned *height; -} gfx_ctx_size_t; - -typedef struct gfx_ctx_mode -{ - unsigned width; - unsigned height; - bool fullscreen; -} gfx_ctx_mode_t; - -typedef struct gfx_ctx_metrics -{ - enum display_metric_types type; - float *value; -} gfx_ctx_metrics_t; - -typedef struct gfx_ctx_aspect -{ - float *aspect; - unsigned width; - unsigned height; -} gfx_ctx_aspect_t; - -typedef struct gfx_ctx_image -{ - const void *frame; - unsigned width; - unsigned height; - unsigned pitch; - unsigned index; - bool rgb32; - void **handle; -} gfx_ctx_image_t; - -typedef struct gfx_ctx_input -{ - const input_driver_t **input; - void **input_data; -} gfx_ctx_input_t; - -typedef struct gfx_ctx_proc_address -{ - const char *sym; - retro_proc_address_t addr; -} gfx_ctx_proc_address_t; - -typedef struct gfx_ctx_ident -{ - const char *ident; -} gfx_ctx_ident_t; - -extern const gfx_ctx_driver_t gfx_ctx_osmesa; -extern const gfx_ctx_driver_t gfx_ctx_sdl_gl; -extern const gfx_ctx_driver_t gfx_ctx_x_egl; -extern const gfx_ctx_driver_t gfx_ctx_wayland; -extern const gfx_ctx_driver_t gfx_ctx_x; -extern const gfx_ctx_driver_t gfx_ctx_d3d; -extern const gfx_ctx_driver_t gfx_ctx_drm; -extern const gfx_ctx_driver_t gfx_ctx_mali_fbdev; -extern const gfx_ctx_driver_t gfx_ctx_vivante_fbdev; -extern const gfx_ctx_driver_t gfx_ctx_android; -extern const gfx_ctx_driver_t gfx_ctx_ps3; -extern const gfx_ctx_driver_t gfx_ctx_wgl; -extern const gfx_ctx_driver_t gfx_ctx_videocore; -extern const gfx_ctx_driver_t gfx_ctx_qnx; -extern const gfx_ctx_driver_t gfx_ctx_cgl; -extern const gfx_ctx_driver_t gfx_ctx_cocoagl; -extern const gfx_ctx_driver_t gfx_ctx_emscripten; -extern const gfx_ctx_driver_t gfx_ctx_opendingux_fbdev; -extern const gfx_ctx_driver_t gfx_ctx_khr_display; -extern const gfx_ctx_driver_t gfx_ctx_gdi; -extern const gfx_ctx_driver_t gfx_ctx_null; - -/** - * video_context_driver_init_first: - * @data : Input data. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Finds first suitable graphics context driver and initializes. - * - * Returns: graphics context driver if found, otherwise NULL. - **/ -const gfx_ctx_driver_t *video_context_driver_init_first(void *data, const char *ident, - enum gfx_ctx_api api, unsigned major, unsigned minor, bool hw_render_ctx); - -bool video_context_driver_check_window(gfx_ctx_size_t *size_data); - -bool video_context_driver_find_prev_driver(void); - -bool video_context_driver_find_next_driver(void); - -bool video_context_driver_init_image_buffer(const video_info_t *data); - -bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img); - -bool video_context_driver_get_video_output_prev(void); - -bool video_context_driver_get_video_output_next(void); - -bool video_context_driver_bind_hw_render(bool *enable); - -void video_context_driver_make_current(bool restore); - -bool video_context_driver_set(const gfx_ctx_driver_t *data); - -void video_context_driver_destroy(void); - -#define video_context_driver_update_window_title(video_info) \ - if (current_video_context && current_video_context->update_window_title) \ - current_video_context->update_window_title(video_context_data, video_info) - -#define video_context_driver_swap_buffers(video_info) \ - if (current_video_context && current_video_context->swap_buffers) \ - current_video_context->swap_buffers(video_context_data, video_info) - -#define video_context_driver_focus() ((video_context_data && current_video_context->has_focus && current_video_context->has_focus(video_context_data)) ? true : false) - -#define video_context_driver_set_resize(mode_info) \ - if (current_video_context && current_video_context->set_resize) \ - current_video_context->set_resize(video_context_data, mode_info.width, mode_info.height) - -bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data); - -bool video_context_driver_swap_interval(unsigned *interval); - -bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc); - -bool video_context_driver_suppress_screensaver(bool *bool_data); - -bool video_context_driver_get_ident(gfx_ctx_ident_t *ident); - -bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info); - -bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info); - -bool video_context_driver_get_context_data(void *data); - -bool video_context_driver_show_mouse(bool *bool_data); - -void video_context_driver_set_data(void *data); - -bool video_context_driver_get_flags(gfx_ctx_flags_t *flags); - -bool video_context_driver_set_flags(gfx_ctx_flags_t *flags); - -bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics); - -bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect); - -bool video_context_driver_input_driver(gfx_ctx_input_t *inp); - -#define video_context_driver_has_windowed() ((video_context_data && current_video_context->has_windowed && current_video_context->has_windowed(video_context_data)) ? true : false) - -void video_context_driver_free(void); - -extern const gfx_ctx_driver_t *current_video_context; - -extern void *video_context_data; - -RETRO_END_DECLS - -#endif diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 2b8784b395..7e2f630079 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -44,7 +44,7 @@ #endif #include "video_thread_wrapper.h" -#include "video_context_driver.h" +#include "video_driver.h" #include "../frontend/frontend_driver.h" #include "../record/record_driver.h" @@ -196,6 +196,9 @@ static slock_t *display_lock = NULL; static slock_t *context_lock = NULL; #endif +const gfx_ctx_driver_t *current_video_context = NULL; +void *video_context_data = NULL; + struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END] = { { "4:3", 1.3333f }, { "16:9", 1.7778f }, @@ -293,6 +296,73 @@ static const video_driver_t *video_drivers[] = { NULL, }; +static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { +#if defined(__CELLOS_LV2__) + &gfx_ctx_ps3, +#endif +#if defined(HAVE_D3D) + &gfx_ctx_d3d, +#endif +#if defined(HAVE_VIDEOCORE) + &gfx_ctx_videocore, +#endif +#if defined(HAVE_MALI_FBDEV) + &gfx_ctx_mali_fbdev, +#endif +#if defined(HAVE_VIVANTE_FBDEV) + &gfx_ctx_vivante_fbdev, +#endif +#if defined(HAVE_OPENDINGUX_FBDEV) + &gfx_ctx_opendingux_fbdev, +#endif +#if defined(_WIN32) && (defined(HAVE_OPENGL) || defined(HAVE_VULKAN)) + &gfx_ctx_wgl, +#endif +#if defined(HAVE_WAYLAND) + &gfx_ctx_wayland, +#endif +#if defined(HAVE_X11) && !defined(HAVE_OPENGLES) +#if defined(HAVE_OPENGL) || defined(HAVE_VULKAN) + &gfx_ctx_x, +#endif +#endif +#if defined(HAVE_X11) && defined(HAVE_OPENGL) && defined(HAVE_EGL) + &gfx_ctx_x_egl, +#endif +#if defined(HAVE_KMS) + &gfx_ctx_drm, +#endif +#if defined(ANDROID) + &gfx_ctx_android, +#endif +#if defined(__QNX__) + &gfx_ctx_qnx, +#endif +#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) + &gfx_ctx_cocoagl, +#endif +#if defined(__APPLE__) && !defined(TARGET_IPHONE_SIMULATOR) && !defined(TARGET_OS_IPHONE) + &gfx_ctx_cgl, +#endif +#if (defined(HAVE_SDL) || defined(HAVE_SDL2)) && defined(HAVE_OPENGL) + &gfx_ctx_sdl_gl, +#endif +#ifdef HAVE_OSMESA + &gfx_ctx_osmesa, +#endif +#ifdef EMSCRIPTEN + &gfx_ctx_emscripten, +#endif +#if defined(HAVE_VULKAN) && defined(HAVE_VULKAN_DISPLAY) + &gfx_ctx_khr_display, +#endif +#if defined(_WIN32) && !defined(_XBOX) + &gfx_ctx_gdi, +#endif + &gfx_ctx_null, + NULL +}; + /** * video_driver_find_handle: * @idx : index of driver to get handle to. @@ -2416,3 +2486,418 @@ void video_driver_get_status(uint64_t *frame_count, bool * is_alive, *is_alive = video_driver_is_alive(); *is_focused = video_driver_is_focused(); } + +/** + * find_video_context_driver_driver_index: + * @ident : Identifier of resampler driver to find. + * + * Finds graphics context driver index by @ident name. + * + * Returns: graphics context driver index if driver was found, otherwise + * -1. + **/ +static int find_video_context_driver_index(const char *ident) +{ + unsigned i; + for (i = 0; gfx_ctx_drivers[i]; i++) + if (string_is_equal_noncase(ident, gfx_ctx_drivers[i]->ident)) + return i; + return -1; +} + +/** + * find_prev_context_driver: + * + * Finds previous driver in graphics context driver array. + **/ +bool video_context_driver_find_prev_driver(void) +{ + settings_t *settings = config_get_ptr(); + int i = find_video_context_driver_index( + settings->arrays.video_context_driver); + + if (i > 0) + { + strlcpy(settings->arrays.video_context_driver, + gfx_ctx_drivers[i - 1]->ident, + sizeof(settings->arrays.video_context_driver)); + return true; + } + + RARCH_WARN("Couldn't find any previous video context driver.\n"); + return false; +} + +/** + * find_next_context_driver: + * + * Finds next driver in graphics context driver array. + **/ +bool video_context_driver_find_next_driver(void) +{ + settings_t *settings = config_get_ptr(); + int i = find_video_context_driver_index(settings->arrays.video_context_driver); + + if (i >= 0 && gfx_ctx_drivers[i + 1]) + { + strlcpy(settings->arrays.video_context_driver, + gfx_ctx_drivers[i + 1]->ident, + sizeof(settings->arrays.video_context_driver)); + return true; + } + + RARCH_WARN("Couldn't find any next video context driver.\n"); + return false; +} + +/** + * video_context_driver_init: + * @data : Input data. + * @ctx : Graphics context driver to initialize. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Initialize graphics context driver. + * + * Returns: graphics context driver if successfully initialized, otherwise NULL. + **/ +static const gfx_ctx_driver_t *video_context_driver_init( + void *data, + const gfx_ctx_driver_t *ctx, + const char *ident, + enum gfx_ctx_api api, unsigned major, + unsigned minor, bool hw_render_ctx) +{ + if (ctx->bind_api(data, api, major, minor)) + { + video_frame_info_t video_info; + void *ctx_data = NULL; + + video_driver_build_info(&video_info); + + ctx_data = ctx->init(&video_info, data); + + if (!ctx_data) + return NULL; + + if (ctx->bind_hw_render) + ctx->bind_hw_render(ctx_data, + video_info.shared_context && hw_render_ctx); + + video_context_driver_set_data(ctx_data); + return ctx; + } + +#ifndef _WIN32 + RARCH_WARN("Failed to bind API (#%u, version %u.%u) on context driver \"%s\".\n", + (unsigned)api, major, minor, ctx->ident); +#endif + + return NULL; +} + +/** + * video_context_driver_find_driver: + * @data : Input data. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Finds graphics context driver and initializes. + * + * Returns: graphics context driver if found, otherwise NULL. + **/ +static const gfx_ctx_driver_t *video_context_driver_find_driver(void *data, + const char *ident, + enum gfx_ctx_api api, unsigned major, + unsigned minor, bool hw_render_ctx) +{ + int i = find_video_context_driver_index(ident); + + if (i >= 0) + return video_context_driver_init(data, gfx_ctx_drivers[i], ident, + api, major, minor, hw_render_ctx); + + for (i = 0; gfx_ctx_drivers[i]; i++) + { + const gfx_ctx_driver_t *ctx = + video_context_driver_init(data, gfx_ctx_drivers[i], ident, + api, major, minor, hw_render_ctx); + + if (ctx) + return ctx; + } + + return NULL; +} + +/** + * video_context_driver_init_first: + * @data : Input data. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Finds first suitable graphics context driver and initializes. + * + * Returns: graphics context driver if found, otherwise NULL. + **/ +const gfx_ctx_driver_t *video_context_driver_init_first(void *data, + const char *ident, enum gfx_ctx_api api, unsigned major, + unsigned minor, bool hw_render_ctx) +{ + return video_context_driver_find_driver(data, ident, api, + major, minor, hw_render_ctx); +} + +bool video_context_driver_check_window(gfx_ctx_size_t *size_data) +{ + if ( video_context_data + && current_video_context + && current_video_context->check_window) + { + bool is_shutdown = runloop_ctl(RUNLOOP_CTL_IS_SHUTDOWN, NULL); + current_video_context->check_window(video_context_data, + size_data->quit, + size_data->resize, + size_data->width, + size_data->height, + is_shutdown); + return true; + } + + return false; +} + +bool video_context_driver_init_image_buffer(const video_info_t *data) +{ + if ( current_video_context + && current_video_context->image_buffer_init + && current_video_context->image_buffer_init(video_context_data, data)) + return true; + return false; +} + +bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img) +{ + if ( current_video_context + && current_video_context->image_buffer_write + && current_video_context->image_buffer_write(video_context_data, + img->frame, img->width, img->height, img->pitch, + img->rgb32, img->index, img->handle)) + return true; + return false; +} + +bool video_context_driver_get_video_output_prev(void) +{ + if (!current_video_context + || !current_video_context->get_video_output_prev) + return false; + current_video_context->get_video_output_prev(video_context_data); + return true; +} + +bool video_context_driver_get_video_output_next(void) +{ + if (!current_video_context || + !current_video_context->get_video_output_next) + return false; + current_video_context->get_video_output_next(video_context_data); + return true; +} + +bool video_context_driver_bind_hw_render(bool *enable) +{ + if (!current_video_context || !current_video_context->bind_hw_render) + return false; + current_video_context->bind_hw_render(video_context_data, *enable); + return true; +} + +void video_context_driver_make_current(bool release) +{ + if (current_video_context && current_video_context->make_current) + current_video_context->make_current(release); +} + +bool video_context_driver_set(const gfx_ctx_driver_t *data) +{ + if (!data) + return false; + current_video_context = data; + return true; +} + +void video_context_driver_destroy(void) +{ + current_video_context = NULL; +} + +bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect) +{ + if (!video_context_data || !aspect) + return false; + if (!current_video_context->translate_aspect) + return false; + *aspect->aspect = current_video_context->translate_aspect( + video_context_data, aspect->width, aspect->height); + return true; +} + +void video_context_driver_free(void) +{ + if (current_video_context->destroy) + current_video_context->destroy(video_context_data); + current_video_context = NULL; + video_context_data = NULL; +} + +bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data) +{ + if (!size_data) + return false; + if (!current_video_context || !current_video_context->get_video_output_size) + return false; + current_video_context->get_video_output_size(video_context_data, + size_data->width, size_data->height); + return true; +} + +bool video_context_driver_swap_interval(unsigned *interval) +{ + if (!current_video_context || !current_video_context->swap_interval) + return false; + current_video_context->swap_interval(video_context_data, *interval); + return true; +} + +bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc) +{ + if (!current_video_context || !current_video_context->get_proc_address) + return false; + + proc->addr = current_video_context->get_proc_address(proc->sym); + + return true; +} + +bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics) +{ + if ( current_video_context + && current_video_context->get_metrics + && current_video_context->get_metrics(video_context_data, + metrics->type, + metrics->value)) + return true; + return false; +} + +bool video_context_driver_input_driver(gfx_ctx_input_t *inp) +{ + settings_t *settings = config_get_ptr(); + const char *joypad_name = settings ? settings->arrays.input_joypad_driver : NULL; + + if (!current_video_context || !current_video_context->input_driver) + return false; + current_video_context->input_driver( + video_context_data, joypad_name, + inp->input, inp->input_data); + return true; +} + +bool video_context_driver_suppress_screensaver(bool *bool_data) +{ + if ( video_context_data + && current_video_context + && current_video_context->suppress_screensaver( + video_context_data, *bool_data)) + return true; + return false; +} + +bool video_context_driver_get_ident(gfx_ctx_ident_t *ident) +{ + if (!ident) + return false; + ident->ident = NULL; + if (current_video_context) + ident->ident = current_video_context->ident; + return true; +} + +bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info) +{ + video_frame_info_t video_info; + + if (!current_video_context || !current_video_context->set_video_mode) + return false; + + video_driver_build_info(&video_info); + + if (!current_video_context->set_video_mode( + video_context_data, &video_info, mode_info->width, + mode_info->height, mode_info->fullscreen)) + return false; + return true; +} + +bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info) +{ + if (!current_video_context || !current_video_context->get_video_size) + return false; + current_video_context->get_video_size(video_context_data, + &mode_info->width, &mode_info->height); + return true; +} + +bool video_context_driver_get_context_data(void *data) +{ + if (!current_video_context || !current_video_context->get_context_data) + return false; + *(void**)data = current_video_context->get_context_data(video_context_data); + return true; +} + +bool video_context_driver_show_mouse(bool *bool_data) +{ + if (!current_video_context || !current_video_context->show_mouse) + return false; + current_video_context->show_mouse(video_context_data, *bool_data); + return true; +} + +void video_context_driver_set_data(void *data) +{ + video_context_data = data; +} + +bool video_context_driver_get_flags(gfx_ctx_flags_t *flags) +{ + if (!flags) + return false; + if (!current_video_context || !current_video_context->get_flags) + return false; + flags->flags = current_video_context->get_flags(video_context_data); + return true; +} + +bool video_context_driver_set_flags(gfx_ctx_flags_t *flags) +{ + if (!flags) + return false; + if (!current_video_context || !current_video_context->set_flags) + return false; + current_video_context->set_flags(video_context_data, flags->flags); + return true; +} diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 86931811ab..2109ef2323 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -40,6 +40,39 @@ RETRO_BEGIN_DECLS +#ifndef MAX_EGLIMAGE_TEXTURES +#define MAX_EGLIMAGE_TEXTURES 32 +#endif + +enum gfx_ctx_api +{ + GFX_CTX_NONE = 0, + GFX_CTX_OPENGL_API, + GFX_CTX_OPENGL_ES_API, + GFX_CTX_DIRECT3D8_API, + GFX_CTX_DIRECT3D9_API, + GFX_CTX_OPENVG_API, + GFX_CTX_VULKAN_API, + GFX_CTX_GDI_API +}; + +enum display_metric_types +{ + DISPLAY_METRIC_NONE = 0, + DISPLAY_METRIC_MM_WIDTH, + DISPLAY_METRIC_MM_HEIGHT, + DISPLAY_METRIC_DPI +}; + +enum display_flags +{ + GFX_CTX_FLAGS_NONE = 0, + GFX_CTX_FLAGS_GL_CORE_CONTEXT, + GFX_CTX_FLAGS_MULTISAMPLING, + GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES +}; + + typedef struct video_info { /* Width of window. @@ -641,6 +674,292 @@ extern const void *frame_cache_data; extern void *video_driver_data; extern video_driver_t *current_video; +typedef void (*gfx_ctx_proc_t)(void); + +typedef struct gfx_ctx_driver +{ + /* The opaque pointer is the underlying video driver data (e.g. gl_t for + * OpenGL contexts). Although not advised, the context driver is allowed + * to hold a pointer to it as the context never outlives the video driver. + * + * The context driver is responsible for it's own data.*/ + void* (*init)(video_frame_info_t *video_info, void *video_driver); + void (*destroy)(void *data); + + /* Which API to bind to. */ + bool (*bind_api)(void *video_driver, enum gfx_ctx_api, + unsigned major, unsigned minor); + + /* Sets the swap interval. */ + void (*swap_interval)(void *data, unsigned); + + /* Sets video mode. Creates a window, etc. */ + bool (*set_video_mode)(void*, video_frame_info_t *video_info, unsigned, unsigned, bool); + + /* Gets current window size. + * If not initialized yet, it returns current screen size. */ + void (*get_video_size)(void*, unsigned*, unsigned*); + + void (*get_video_output_size)(void*, unsigned*, unsigned*); + + void (*get_video_output_prev)(void*); + + void (*get_video_output_next)(void*); + + bool (*get_metrics)(void *data, enum display_metric_types type, + float *value); + + /* Translates a window size to an aspect ratio. + * In most cases this will be just width / height, but + * some contexts will better know which actual aspect ratio is used. + * This can be NULL to assume the default behavior. + */ + float (*translate_aspect)(void*, unsigned, unsigned); + + /* Asks driver to update window title (FPS, etc). */ + void (*update_window_title)(void*, video_frame_info_t *video_info); + + /* Queries for resize and quit events. + * Also processes events. */ + void (*check_window)(void*, bool*, bool*, + unsigned*, unsigned*, bool); + + /* Acknowledge a resize event. This is needed for some APIs. + * Most backends will ignore this. */ + bool (*set_resize)(void*, unsigned, unsigned); + + /* Checks if window has input focus. */ + bool (*has_focus)(void*); + + /* Should the screensaver be suppressed? */ + bool (*suppress_screensaver)(void *data, bool enable); + + /* Checks if context driver has windowed support. */ + bool (*has_windowed)(void*); + + /* Swaps buffers. VBlank sync depends on + * earlier calls to swap_interval. */ + void (*swap_buffers)(void*, video_frame_info_t *video_info); + + /* Most video backends will want to use a certain input driver. + * Checks for it here. */ + void (*input_driver)(void*, const char *, const input_driver_t**, void**); + + /* Wraps whatever gl_proc_address() there is. + * Does not take opaque, to avoid lots of ugly wrapper code. */ + gfx_ctx_proc_t (*get_proc_address)(const char*); + + /* Returns true if this context supports EGLImage buffers for + * screen drawing and was initalized correctly. */ + bool (*image_buffer_init)(void*, const video_info_t*); + + /* Writes the frame to the EGLImage and sets image_handle to it. + * Returns true if a new image handle is created. + * Always returns true the first time it's called for a new index. + * The graphics core must handle a change in the handle correctly. */ + bool (*image_buffer_write)(void*, const void *frame, unsigned width, + unsigned height, unsigned pitch, bool rgb32, + unsigned index, void **image_handle); + + /* Shows or hides mouse. Can be NULL if context doesn't + * have a concept of mouse pointer. */ + void (*show_mouse)(void *data, bool state); + + /* Human readable string. */ + const char *ident; + + uint32_t (*get_flags)(void *data); + + void (*set_flags)(void *data, uint32_t flags); + + /* Optional. Binds HW-render offscreen context. */ + void (*bind_hw_render)(void *data, bool enable); + + /* Optional. Gets base data for the context which is used by the driver. + * This is mostly relevant for graphics APIs such as Vulkan + * which do not have global context state. */ + void *(*get_context_data)(void *data); + + /* Optional. Makes driver context (only GLX right now) + * active for this thread. */ + void (*make_current)(bool release); +} gfx_ctx_driver_t; + + +typedef struct gfx_ctx_flags +{ + uint32_t flags; +} gfx_ctx_flags_t; + +typedef struct gfx_ctx_size +{ + bool *quit; + bool *resize; + unsigned *width; + unsigned *height; +} gfx_ctx_size_t; + +typedef struct gfx_ctx_mode +{ + unsigned width; + unsigned height; + bool fullscreen; +} gfx_ctx_mode_t; + +typedef struct gfx_ctx_metrics +{ + enum display_metric_types type; + float *value; +} gfx_ctx_metrics_t; + +typedef struct gfx_ctx_aspect +{ + float *aspect; + unsigned width; + unsigned height; +} gfx_ctx_aspect_t; + +typedef struct gfx_ctx_image +{ + const void *frame; + unsigned width; + unsigned height; + unsigned pitch; + unsigned index; + bool rgb32; + void **handle; +} gfx_ctx_image_t; + +typedef struct gfx_ctx_input +{ + const input_driver_t **input; + void **input_data; +} gfx_ctx_input_t; + +typedef struct gfx_ctx_proc_address +{ + const char *sym; + retro_proc_address_t addr; +} gfx_ctx_proc_address_t; + +typedef struct gfx_ctx_ident +{ + const char *ident; +} gfx_ctx_ident_t; + +extern const gfx_ctx_driver_t gfx_ctx_osmesa; +extern const gfx_ctx_driver_t gfx_ctx_sdl_gl; +extern const gfx_ctx_driver_t gfx_ctx_x_egl; +extern const gfx_ctx_driver_t gfx_ctx_wayland; +extern const gfx_ctx_driver_t gfx_ctx_x; +extern const gfx_ctx_driver_t gfx_ctx_d3d; +extern const gfx_ctx_driver_t gfx_ctx_drm; +extern const gfx_ctx_driver_t gfx_ctx_mali_fbdev; +extern const gfx_ctx_driver_t gfx_ctx_vivante_fbdev; +extern const gfx_ctx_driver_t gfx_ctx_android; +extern const gfx_ctx_driver_t gfx_ctx_ps3; +extern const gfx_ctx_driver_t gfx_ctx_wgl; +extern const gfx_ctx_driver_t gfx_ctx_videocore; +extern const gfx_ctx_driver_t gfx_ctx_qnx; +extern const gfx_ctx_driver_t gfx_ctx_cgl; +extern const gfx_ctx_driver_t gfx_ctx_cocoagl; +extern const gfx_ctx_driver_t gfx_ctx_emscripten; +extern const gfx_ctx_driver_t gfx_ctx_opendingux_fbdev; +extern const gfx_ctx_driver_t gfx_ctx_khr_display; +extern const gfx_ctx_driver_t gfx_ctx_gdi; +extern const gfx_ctx_driver_t gfx_ctx_null; + +/** + * video_context_driver_init_first: + * @data : Input data. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Finds first suitable graphics context driver and initializes. + * + * Returns: graphics context driver if found, otherwise NULL. + **/ +const gfx_ctx_driver_t *video_context_driver_init_first(void *data, const char *ident, + enum gfx_ctx_api api, unsigned major, unsigned minor, bool hw_render_ctx); + +bool video_context_driver_check_window(gfx_ctx_size_t *size_data); + +bool video_context_driver_find_prev_driver(void); + +bool video_context_driver_find_next_driver(void); + +bool video_context_driver_init_image_buffer(const video_info_t *data); + +bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img); + +bool video_context_driver_get_video_output_prev(void); + +bool video_context_driver_get_video_output_next(void); + +bool video_context_driver_bind_hw_render(bool *enable); + +void video_context_driver_make_current(bool restore); + +bool video_context_driver_set(const gfx_ctx_driver_t *data); + +void video_context_driver_destroy(void); + +#define video_context_driver_update_window_title(video_info) \ + if (current_video_context && current_video_context->update_window_title) \ + current_video_context->update_window_title(video_context_data, video_info) + +#define video_context_driver_swap_buffers(video_info) \ + if (current_video_context && current_video_context->swap_buffers) \ + current_video_context->swap_buffers(video_context_data, video_info) + +#define video_context_driver_focus() ((video_context_data && current_video_context->has_focus && current_video_context->has_focus(video_context_data)) ? true : false) + +#define video_context_driver_set_resize(mode_info) \ + if (current_video_context && current_video_context->set_resize) \ + current_video_context->set_resize(video_context_data, mode_info.width, mode_info.height) + +bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data); + +bool video_context_driver_swap_interval(unsigned *interval); + +bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc); + +bool video_context_driver_suppress_screensaver(bool *bool_data); + +bool video_context_driver_get_ident(gfx_ctx_ident_t *ident); + +bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info); + +bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info); + +bool video_context_driver_get_context_data(void *data); + +bool video_context_driver_show_mouse(bool *bool_data); + +void video_context_driver_set_data(void *data); + +bool video_context_driver_get_flags(gfx_ctx_flags_t *flags); + +bool video_context_driver_set_flags(gfx_ctx_flags_t *flags); + +bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics); + +bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect); + +bool video_context_driver_input_driver(gfx_ctx_input_t *inp); + +#define video_context_driver_has_windowed() ((video_context_data && current_video_context->has_windowed && current_video_context->has_windowed(video_context_data)) ? true : false) + +void video_context_driver_free(void); + +extern const gfx_ctx_driver_t *current_video_context; + +extern void *video_context_data; + RETRO_END_DECLS #endif diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index fe5996c406..0f29f5b83f 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -53,7 +53,7 @@ #define DEFAULT_SHADER_TYPE RARCH_SHADER_NONE #endif -#include "video_context_driver.h" +#include "video_driver.h" RETRO_BEGIN_DECLS diff --git a/griffin/griffin.c b/griffin/griffin.c index 5be8e8af3a..b1a513415d 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -153,8 +153,6 @@ CHEATS /*============================================================ VIDEO CONTEXT ============================================================ */ - -#include "../gfx/video_context_driver.c" #include "../gfx/drivers_context/gfx_null_ctx.c" #if defined(__CELLOS_LV2__) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 126613892d..385f12b564 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -30,7 +30,7 @@ #include "../input_keymaps.h" #include "../input_keyboard.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../verbosity.h" #include "../../tasks/tasks_internal.h" diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index 24171bbfb4..03fe13f12e 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -41,7 +41,6 @@ #include "../widgets/menu_input_dialog.h" #include "../../gfx/video_driver.h" -#include "../../gfx/video_context_driver.h" #include "../../configuration.h" #include "../../runloop.h" diff --git a/menu/drivers_display/menu_display_caca.c b/menu/drivers_display/menu_display_caca.c index 85973b4300..5b8ba4c1af 100644 --- a/menu/drivers_display/menu_display_caca.c +++ b/menu/drivers_display/menu_display_caca.c @@ -21,7 +21,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../menu_display.h" diff --git a/menu/drivers_display/menu_display_ctr.c b/menu/drivers_display/menu_display_ctr.c index 401929a6ee..427ee610c6 100644 --- a/menu/drivers_display/menu_display_ctr.c +++ b/menu/drivers_display/menu_display_ctr.c @@ -23,7 +23,7 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../gfx/video_shader_driver.h" #include "../../gfx/common/ctr_common.h" #include "../../gfx/drivers/ctr_gu.h" diff --git a/menu/drivers_display/menu_display_d3d.cpp b/menu/drivers_display/menu_display_d3d.cpp index 4ea27cf5c9..1492e427de 100644 --- a/menu/drivers_display/menu_display_d3d.cpp +++ b/menu/drivers_display/menu_display_d3d.cpp @@ -25,7 +25,7 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../gfx/drivers/d3d.h" #include "../../gfx/common/d3d_common.h" diff --git a/menu/drivers_display/menu_display_gdi.c b/menu/drivers_display/menu_display_gdi.c index b131ff9015..b0ae6bff5a 100644 --- a/menu/drivers_display/menu_display_gdi.c +++ b/menu/drivers_display/menu_display_gdi.c @@ -21,7 +21,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../menu_display.h" diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index e0f8b83dbb..9b591b02a1 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -21,7 +21,7 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../gfx/video_shader_driver.h" #include "../../gfx/common/gl_common.h" diff --git a/menu/drivers_display/menu_display_null.c b/menu/drivers_display/menu_display_null.c index 67b2628da2..86cf2d63a7 100644 --- a/menu/drivers_display/menu_display_null.c +++ b/menu/drivers_display/menu_display_null.c @@ -19,7 +19,7 @@ #include #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../menu_display.h" diff --git a/menu/drivers_display/menu_display_vga.c b/menu/drivers_display/menu_display_vga.c index 7ec9814d41..faa362b03d 100644 --- a/menu/drivers_display/menu_display_vga.c +++ b/menu/drivers_display/menu_display_vga.c @@ -21,7 +21,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../menu_display.h" diff --git a/menu/drivers_display/menu_display_vita2d.c b/menu/drivers_display/menu_display_vita2d.c index 385f679a7c..4ef6fcab5b 100644 --- a/menu/drivers_display/menu_display_vita2d.c +++ b/menu/drivers_display/menu_display_vita2d.c @@ -25,7 +25,7 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../gfx/video_shader_driver.h" #include "../../gfx/common/vita2d_common.h" #include "../../defines/psp_defines.h" diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index 669ae31733..3612e5e9c3 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -23,7 +23,7 @@ #include "../menu_display.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../gfx/common/vulkan_common.h" #include "../../gfx/video_shader_driver.h" diff --git a/menu/menu_display.h b/menu/menu_display.h index 11f480705f..1416167bf4 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -27,7 +27,7 @@ #include "../file_path_special.h" #include "../gfx/font_driver.h" -#include "../gfx/video_context_driver.h" +#include "../gfx/video_driver.h" #include "../gfx/video_coord_array.h" RETRO_BEGIN_DECLS diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 13eb35d553..81d17b6a63 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -50,7 +50,7 @@ #include "../../driver.h" #include "../../paths.h" #include "../../runloop.h" -#include "../../gfx/video_context_driver.h" +#include "../../gfx/video_driver.h" #include "../../gfx/video_shader_driver.h" #include "../../tasks/tasks_internal.h" From d75f155eb61a3b44a9c4724fc2363c0c2b746cfe Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 01:37:12 +0200 Subject: [PATCH 006/274] Reorder video_driver.h --- gfx/video_driver.h | 354 ++++++++++++++++++++++----------------------- 1 file changed, 176 insertions(+), 178 deletions(-) diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 2109ef2323..6797492fd1 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -72,6 +72,7 @@ enum display_flags GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES }; +typedef void (*gfx_ctx_proc_t)(void); typedef struct video_info { @@ -200,6 +201,176 @@ typedef struct video_frame_info char fps_text[128]; } video_frame_info_t; +typedef struct gfx_ctx_driver +{ + /* The opaque pointer is the underlying video driver data (e.g. gl_t for + * OpenGL contexts). Although not advised, the context driver is allowed + * to hold a pointer to it as the context never outlives the video driver. + * + * The context driver is responsible for it's own data.*/ + void* (*init)(video_frame_info_t *video_info, void *video_driver); + void (*destroy)(void *data); + + /* Which API to bind to. */ + bool (*bind_api)(void *video_driver, enum gfx_ctx_api, + unsigned major, unsigned minor); + + /* Sets the swap interval. */ + void (*swap_interval)(void *data, unsigned); + + /* Sets video mode. Creates a window, etc. */ + bool (*set_video_mode)(void*, video_frame_info_t *video_info, unsigned, unsigned, bool); + + /* Gets current window size. + * If not initialized yet, it returns current screen size. */ + void (*get_video_size)(void*, unsigned*, unsigned*); + + void (*get_video_output_size)(void*, unsigned*, unsigned*); + + void (*get_video_output_prev)(void*); + + void (*get_video_output_next)(void*); + + bool (*get_metrics)(void *data, enum display_metric_types type, + float *value); + + /* Translates a window size to an aspect ratio. + * In most cases this will be just width / height, but + * some contexts will better know which actual aspect ratio is used. + * This can be NULL to assume the default behavior. + */ + float (*translate_aspect)(void*, unsigned, unsigned); + + /* Asks driver to update window title (FPS, etc). */ + void (*update_window_title)(void*, video_frame_info_t *video_info); + + /* Queries for resize and quit events. + * Also processes events. */ + void (*check_window)(void*, bool*, bool*, + unsigned*, unsigned*, bool); + + /* Acknowledge a resize event. This is needed for some APIs. + * Most backends will ignore this. */ + bool (*set_resize)(void*, unsigned, unsigned); + + /* Checks if window has input focus. */ + bool (*has_focus)(void*); + + /* Should the screensaver be suppressed? */ + bool (*suppress_screensaver)(void *data, bool enable); + + /* Checks if context driver has windowed support. */ + bool (*has_windowed)(void*); + + /* Swaps buffers. VBlank sync depends on + * earlier calls to swap_interval. */ + void (*swap_buffers)(void*, video_frame_info_t *video_info); + + /* Most video backends will want to use a certain input driver. + * Checks for it here. */ + void (*input_driver)(void*, const char *, const input_driver_t**, void**); + + /* Wraps whatever gl_proc_address() there is. + * Does not take opaque, to avoid lots of ugly wrapper code. */ + gfx_ctx_proc_t (*get_proc_address)(const char*); + + /* Returns true if this context supports EGLImage buffers for + * screen drawing and was initalized correctly. */ + bool (*image_buffer_init)(void*, const video_info_t*); + + /* Writes the frame to the EGLImage and sets image_handle to it. + * Returns true if a new image handle is created. + * Always returns true the first time it's called for a new index. + * The graphics core must handle a change in the handle correctly. */ + bool (*image_buffer_write)(void*, const void *frame, unsigned width, + unsigned height, unsigned pitch, bool rgb32, + unsigned index, void **image_handle); + + /* Shows or hides mouse. Can be NULL if context doesn't + * have a concept of mouse pointer. */ + void (*show_mouse)(void *data, bool state); + + /* Human readable string. */ + const char *ident; + + uint32_t (*get_flags)(void *data); + + void (*set_flags)(void *data, uint32_t flags); + + /* Optional. Binds HW-render offscreen context. */ + void (*bind_hw_render)(void *data, bool enable); + + /* Optional. Gets base data for the context which is used by the driver. + * This is mostly relevant for graphics APIs such as Vulkan + * which do not have global context state. */ + void *(*get_context_data)(void *data); + + /* Optional. Makes driver context (only GLX right now) + * active for this thread. */ + void (*make_current)(bool release); +} gfx_ctx_driver_t; + +typedef struct gfx_ctx_flags +{ + uint32_t flags; +} gfx_ctx_flags_t; + +typedef struct gfx_ctx_size +{ + bool *quit; + bool *resize; + unsigned *width; + unsigned *height; +} gfx_ctx_size_t; + +typedef struct gfx_ctx_mode +{ + unsigned width; + unsigned height; + bool fullscreen; +} gfx_ctx_mode_t; + +typedef struct gfx_ctx_metrics +{ + enum display_metric_types type; + float *value; +} gfx_ctx_metrics_t; + +typedef struct gfx_ctx_aspect +{ + float *aspect; + unsigned width; + unsigned height; +} gfx_ctx_aspect_t; + +typedef struct gfx_ctx_image +{ + const void *frame; + unsigned width; + unsigned height; + unsigned pitch; + unsigned index; + bool rgb32; + void **handle; +} gfx_ctx_image_t; + +typedef struct gfx_ctx_input +{ + const input_driver_t **input; + void **input_data; +} gfx_ctx_input_t; + +typedef struct gfx_ctx_proc_address +{ + const char *sym; + retro_proc_address_t addr; +} gfx_ctx_proc_address_t; + +typedef struct gfx_ctx_ident +{ + const char *ident; +} gfx_ctx_ident_t; + /* Optionally implemented interface to poke more * deeply into video driver. */ @@ -669,184 +840,6 @@ extern video_driver_t video_gdi; extern video_driver_t video_vga; extern video_driver_t video_null; -extern const void *frame_cache_data; - -extern void *video_driver_data; -extern video_driver_t *current_video; - -typedef void (*gfx_ctx_proc_t)(void); - -typedef struct gfx_ctx_driver -{ - /* The opaque pointer is the underlying video driver data (e.g. gl_t for - * OpenGL contexts). Although not advised, the context driver is allowed - * to hold a pointer to it as the context never outlives the video driver. - * - * The context driver is responsible for it's own data.*/ - void* (*init)(video_frame_info_t *video_info, void *video_driver); - void (*destroy)(void *data); - - /* Which API to bind to. */ - bool (*bind_api)(void *video_driver, enum gfx_ctx_api, - unsigned major, unsigned minor); - - /* Sets the swap interval. */ - void (*swap_interval)(void *data, unsigned); - - /* Sets video mode. Creates a window, etc. */ - bool (*set_video_mode)(void*, video_frame_info_t *video_info, unsigned, unsigned, bool); - - /* Gets current window size. - * If not initialized yet, it returns current screen size. */ - void (*get_video_size)(void*, unsigned*, unsigned*); - - void (*get_video_output_size)(void*, unsigned*, unsigned*); - - void (*get_video_output_prev)(void*); - - void (*get_video_output_next)(void*); - - bool (*get_metrics)(void *data, enum display_metric_types type, - float *value); - - /* Translates a window size to an aspect ratio. - * In most cases this will be just width / height, but - * some contexts will better know which actual aspect ratio is used. - * This can be NULL to assume the default behavior. - */ - float (*translate_aspect)(void*, unsigned, unsigned); - - /* Asks driver to update window title (FPS, etc). */ - void (*update_window_title)(void*, video_frame_info_t *video_info); - - /* Queries for resize and quit events. - * Also processes events. */ - void (*check_window)(void*, bool*, bool*, - unsigned*, unsigned*, bool); - - /* Acknowledge a resize event. This is needed for some APIs. - * Most backends will ignore this. */ - bool (*set_resize)(void*, unsigned, unsigned); - - /* Checks if window has input focus. */ - bool (*has_focus)(void*); - - /* Should the screensaver be suppressed? */ - bool (*suppress_screensaver)(void *data, bool enable); - - /* Checks if context driver has windowed support. */ - bool (*has_windowed)(void*); - - /* Swaps buffers. VBlank sync depends on - * earlier calls to swap_interval. */ - void (*swap_buffers)(void*, video_frame_info_t *video_info); - - /* Most video backends will want to use a certain input driver. - * Checks for it here. */ - void (*input_driver)(void*, const char *, const input_driver_t**, void**); - - /* Wraps whatever gl_proc_address() there is. - * Does not take opaque, to avoid lots of ugly wrapper code. */ - gfx_ctx_proc_t (*get_proc_address)(const char*); - - /* Returns true if this context supports EGLImage buffers for - * screen drawing and was initalized correctly. */ - bool (*image_buffer_init)(void*, const video_info_t*); - - /* Writes the frame to the EGLImage and sets image_handle to it. - * Returns true if a new image handle is created. - * Always returns true the first time it's called for a new index. - * The graphics core must handle a change in the handle correctly. */ - bool (*image_buffer_write)(void*, const void *frame, unsigned width, - unsigned height, unsigned pitch, bool rgb32, - unsigned index, void **image_handle); - - /* Shows or hides mouse. Can be NULL if context doesn't - * have a concept of mouse pointer. */ - void (*show_mouse)(void *data, bool state); - - /* Human readable string. */ - const char *ident; - - uint32_t (*get_flags)(void *data); - - void (*set_flags)(void *data, uint32_t flags); - - /* Optional. Binds HW-render offscreen context. */ - void (*bind_hw_render)(void *data, bool enable); - - /* Optional. Gets base data for the context which is used by the driver. - * This is mostly relevant for graphics APIs such as Vulkan - * which do not have global context state. */ - void *(*get_context_data)(void *data); - - /* Optional. Makes driver context (only GLX right now) - * active for this thread. */ - void (*make_current)(bool release); -} gfx_ctx_driver_t; - - -typedef struct gfx_ctx_flags -{ - uint32_t flags; -} gfx_ctx_flags_t; - -typedef struct gfx_ctx_size -{ - bool *quit; - bool *resize; - unsigned *width; - unsigned *height; -} gfx_ctx_size_t; - -typedef struct gfx_ctx_mode -{ - unsigned width; - unsigned height; - bool fullscreen; -} gfx_ctx_mode_t; - -typedef struct gfx_ctx_metrics -{ - enum display_metric_types type; - float *value; -} gfx_ctx_metrics_t; - -typedef struct gfx_ctx_aspect -{ - float *aspect; - unsigned width; - unsigned height; -} gfx_ctx_aspect_t; - -typedef struct gfx_ctx_image -{ - const void *frame; - unsigned width; - unsigned height; - unsigned pitch; - unsigned index; - bool rgb32; - void **handle; -} gfx_ctx_image_t; - -typedef struct gfx_ctx_input -{ - const input_driver_t **input; - void **input_data; -} gfx_ctx_input_t; - -typedef struct gfx_ctx_proc_address -{ - const char *sym; - retro_proc_address_t addr; -} gfx_ctx_proc_address_t; - -typedef struct gfx_ctx_ident -{ - const char *ident; -} gfx_ctx_ident_t; - extern const gfx_ctx_driver_t gfx_ctx_osmesa; extern const gfx_ctx_driver_t gfx_ctx_sdl_gl; extern const gfx_ctx_driver_t gfx_ctx_x_egl; @@ -869,6 +862,11 @@ extern const gfx_ctx_driver_t gfx_ctx_khr_display; extern const gfx_ctx_driver_t gfx_ctx_gdi; extern const gfx_ctx_driver_t gfx_ctx_null; +extern const void *frame_cache_data; + +extern void *video_driver_data; +extern video_driver_t *current_video; + /** * video_context_driver_init_first: * @data : Input data. From e3f854092f650c8da9e73f637cf9b491754dc63e Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Tue, 9 May 2017 01:53:03 +0200 Subject: [PATCH 007/274] Remove unused variables --- audio/audio_driver.c | 1 - command.c | 1 - 2 files changed, 2 deletions(-) diff --git a/audio/audio_driver.c b/audio/audio_driver.c index e9e8c7055b..1333d5352e 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -949,7 +949,6 @@ bool audio_driver_has_callback(void) bool audio_driver_toggle_mute(void) { - settings_t *settings = config_get_ptr(); bool new_mute_state = !audio_driver_mute_enable; if (!audio_driver_context_audio_data) return false; diff --git a/command.c b/command.c index f2b426a106..83ceb28e04 100644 --- a/command.c +++ b/command.c @@ -2059,7 +2059,6 @@ bool command_event(enum event_command cmd, void *data) return audio_driver_start(runloop_ctl(RUNLOOP_CTL_IS_SHUTDOWN, NULL)); case CMD_EVENT_AUDIO_MUTE_TOGGLE: { - settings_t *settings = config_get_ptr(); bool audio_mute_enable = *(audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE)); const char *msg = !audio_mute_enable ? msg_hash_to_str(MSG_AUDIO_MUTED): From 3593256a76e8cd431694d880492978f29e7113bf Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 02:29:24 +0200 Subject: [PATCH 008/274] MSVC Buildfix --- libretro-common/formats/wav/rwav.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libretro-common/formats/wav/rwav.c b/libretro-common/formats/wav/rwav.c index 4929495db0..f2d082bc5e 100644 --- a/libretro-common/formats/wav/rwav.c +++ b/libretro-common/formats/wav/rwav.c @@ -56,7 +56,7 @@ void rwav_init(rwav_iterator_t* iter, rwav_t* out, const void* buf, size_t size) out->samples = NULL; } -int rwav_iterate(rwav_iterator_t *iter) +enum rwav_state rwav_iterate(rwav_iterator_t *iter) { size_t s; uint16_t *u16 = NULL; @@ -149,7 +149,10 @@ int rwav_iterate(rwav_iterator_t *iter) s -= 2; } } - return iter->i < rwav->subchunk2size ? RWAV_ITERATE_MORE : RWAV_ITERATE_DONE; + + if (iter->i < rwav->subchunk2size) + return RWAV_ITERATE_MORE; + return RWAV_ITERATE_DONE; } return RWAV_ITERATE_ERROR; From 83b0d3e4126688aeb4064d3a159dd407f85de1c6 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 02:46:32 +0200 Subject: [PATCH 009/274] Update rwav.h --- libretro-common/include/formats/rwav.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/include/formats/rwav.h b/libretro-common/include/formats/rwav.h index 0c7b705d23..5407de832d 100644 --- a/libretro-common/include/formats/rwav.h +++ b/libretro-common/include/formats/rwav.h @@ -70,7 +70,7 @@ void rwav_init(rwav_iterator_t* iter, rwav_t* out, const void* buf, size_t size) * the rwav_t structure passed to rwav_init is ready to be used. The iterator does not * have to be freed. */ -int rwav_iterate(rwav_iterator_t *iter); +enum rwav_state rwav_iterate(rwav_iterator_t *iter); /** * Loads the entire data in one go. From da1ab24c574e2830e442fe999c102ba307806039 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 07:13:47 +0200 Subject: [PATCH 010/274] Cleanups --- tasks/task_image.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/tasks/task_image.c b/tasks/task_image.c index d9240bbb1d..971b720bfb 100644 --- a/tasks/task_image.c +++ b/tasks/task_image.c @@ -226,15 +226,10 @@ static void task_image_load_free_internal(nbio_handle_t *nbio) static int cb_nbio_generic(nbio_handle_t *nbio, size_t *len) { - void *ptr = NULL; struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; + void *ptr = nbio_get_ptr(nbio->handle, len); - if (!image || !image->handle) - goto error; - - ptr = nbio_get_ptr(nbio->handle, len); - - if (!ptr) + if (!ptr || !image || !image->handle) goto error; image_transfer_set_buffer_ptr(image->handle, nbio->image_type, ptr); @@ -369,11 +364,11 @@ bool task_push_image_load(const char *fullpath, retro_task_callback_t cb, void * nbio->status = NBIO_STATUS_INIT; - t->state = nbio; - t->handler = task_file_load_handler; - t->cleanup = task_image_load_free; - t->callback = cb; - t->user_data = user_data; + t->state = nbio; + t->handler = task_file_load_handler; + t->cleanup = task_image_load_free; + t->callback = cb; + t->user_data = user_data; task_queue_ctl(TASK_QUEUE_CTL_PUSH, t); From 7ed57ee77de4304a8c97eec8e24d269032b31590 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 20:01:42 +0200 Subject: [PATCH 011/274] (task_image) Cleanups --- tasks/task_file_transfer.c | 27 +++------- tasks/task_image.c | 105 +++++++++++++++++++++---------------- tasks/tasks_internal.h | 12 ++++- 3 files changed, 78 insertions(+), 66 deletions(-) diff --git a/tasks/task_file_transfer.c b/tasks/task_file_transfer.c index f3ea334268..3fbd775a80 100644 --- a/tasks/task_file_transfer.c +++ b/tasks/task_file_transfer.c @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -76,24 +75,13 @@ void task_file_load_handler(retro_task_t *task) case NBIO_STATUS_INIT: if (nbio && !string_is_empty(nbio->path)) { - const char *fullpath = nbio->path; - struct nbio_t *handle = nbio_open(fullpath, NBIO_READ); + struct nbio_t *handle = nbio_open(nbio->path, NBIO_READ); if (handle) { nbio->handle = handle; nbio->status = NBIO_STATUS_TRANSFER; - if (strstr(fullpath, file_path_str(FILE_PATH_PNG_EXTENSION))) - nbio->image_type = IMAGE_TYPE_PNG; - else if (strstr(fullpath, file_path_str(FILE_PATH_JPEG_EXTENSION)) - || strstr(fullpath, file_path_str(FILE_PATH_JPG_EXTENSION))) - nbio->image_type = IMAGE_TYPE_JPEG; - else if (strstr(fullpath, file_path_str(FILE_PATH_BMP_EXTENSION))) - nbio->image_type = IMAGE_TYPE_BMP; - else if (strstr(fullpath, file_path_str(FILE_PATH_TGA_EXTENSION))) - nbio->image_type = IMAGE_TYPE_TGA; - nbio_begin_read(handle); return; } @@ -116,16 +104,17 @@ void task_file_load_handler(retro_task_t *task) break; } - switch (nbio->image_type) + switch (nbio->type) { - case IMAGE_TYPE_PNG: - case IMAGE_TYPE_JPEG: - case IMAGE_TYPE_TGA: - case IMAGE_TYPE_BMP: + case NBIO_TYPE_PNG: + case NBIO_TYPE_JPEG: + case NBIO_TYPE_TGA: + case NBIO_TYPE_BMP: if (!task_image_load_handler(task)) task_set_finished(task, true); break; - case 0: + case NBIO_TYPE_NONE: + default: if (nbio->is_finished) task_set_finished(task, true); break; diff --git a/tasks/task_image.c b/tasks/task_image.c index 971b720bfb..300456e36d 100644 --- a/tasks/task_image.c +++ b/tasks/task_image.c @@ -43,6 +43,7 @@ enum image_status_enum struct nbio_image_handle { + enum image_type_enum type; struct texture_image ti; bool is_blocking; bool is_blocking_on_processing; @@ -88,29 +89,14 @@ static int cb_image_menu_upload_generic(void *data, size_t len) return 0; } -static int task_image_iterate_transfer_parse(nbio_handle_t *nbio) -{ - struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; - - if (image->handle && image->cb) - { - size_t len = 0; - image->cb(nbio, len); - } - - return 0; -} - static int task_image_process( - nbio_handle_t *nbio, + struct nbio_image_handle *image, unsigned *width, unsigned *height) { - struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; - int retval = image_transfer_process( image->handle, - nbio->image_type, + image->type, &image->ti.pixels, image->size, width, height); if (retval == IMAGE_PROCESS_ERROR) @@ -132,7 +118,7 @@ static int cb_image_menu_generic(nbio_handle_t *nbio) if (!image) return -1; - retval = task_image_process(nbio, &width, &height); + retval = task_image_process(image, &width, &height); switch (retval) { @@ -162,20 +148,19 @@ static int cb_image_menu_thumbnail(void *data, size_t len) return 0; } -static int task_image_iterate_process_transfer(nbio_handle_t *nbio) +static int task_image_iterate_process_transfer(struct nbio_image_handle *image) { unsigned i; int retval = 0; unsigned width = 0; unsigned height = 0; - struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; if (!image) return -1; for (i = 0; i < image->processing_pos_increment; i++) { - retval = task_image_process(nbio, + retval = task_image_process(image, &width, &height); if (retval != IMAGE_PROCESS_NEXT) break; @@ -188,10 +173,9 @@ static int task_image_iterate_process_transfer(nbio_handle_t *nbio) return -1; } -static int task_image_iterate_transfer(nbio_handle_t *nbio) +static int task_image_iterate_transfer(struct nbio_image_handle *image) { unsigned i; - struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; if (!image) goto error; @@ -201,7 +185,7 @@ static int task_image_iterate_transfer(nbio_handle_t *nbio) for (i = 0; i < image->pos_increment; i++) { - if (!image_transfer_iterate(image->handle, nbio->image_type)) + if (!image_transfer_iterate(image->handle, image->type)) goto error; } @@ -211,14 +195,9 @@ error: return -1; } -static void task_image_load_free_internal(nbio_handle_t *nbio) +static void task_image_load_free_internal(struct nbio_image_handle *image) { - struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; - - if (!image) - return; - - image_transfer_free(image->handle, nbio->image_type); + image_transfer_free(image->handle, image->type); image->handle = NULL; image->cb = NULL; @@ -232,14 +211,14 @@ static int cb_nbio_generic(nbio_handle_t *nbio, size_t *len) if (!ptr || !image || !image->handle) goto error; - image_transfer_set_buffer_ptr(image->handle, nbio->image_type, ptr); + image_transfer_set_buffer_ptr(image->handle, image->type, ptr); image->size = *len; image->pos_increment = (*len / 2) ? ((unsigned)(*len / 2)) : 1; image->processing_pos_increment = (*len / 4) ? ((unsigned)(*len / 4)) : 1; - if (!image_transfer_start(image->handle, nbio->image_type)) + if (!image_transfer_start(image->handle, image->type)) goto error; image->is_blocking = false; @@ -249,7 +228,8 @@ static int cb_nbio_generic(nbio_handle_t *nbio, size_t *len) return 0; error: - task_image_load_free_internal(nbio); + if (image) + task_image_load_free_internal(image); if (nbio->data) free(nbio->data); nbio->data = NULL; @@ -258,19 +238,18 @@ error: static int cb_nbio_image_menu_thumbnail(void *data, size_t len) { - struct nbio_image_handle *image = NULL; - void *handle = NULL; - nbio_handle_t *nbio = (nbio_handle_t*)data; + void *handle = NULL; + nbio_handle_t *nbio = (nbio_handle_t*)data; + struct nbio_image_handle *image = nbio ? + (struct nbio_image_handle*)nbio->data : NULL; if (!nbio) goto error; - handle = image_transfer_new(nbio->image_type); + handle = image_transfer_new(image->type); if (!handle) goto error; - - image = (struct nbio_image_handle*)nbio->data; image->handle = handle; image->size = len; @@ -292,21 +271,29 @@ bool task_image_load_handler(retro_task_t *task) switch (image->status) { case IMAGE_STATUS_PROCESS_TRANSFER: - if (task_image_iterate_process_transfer(nbio) == -1) + if (task_image_iterate_process_transfer(image) == -1) image->status = IMAGE_STATUS_PROCESS_TRANSFER_PARSE; break; case IMAGE_STATUS_TRANSFER_PARSE: - task_image_iterate_transfer_parse(nbio); + if (image->handle && image->cb) + { + size_t len = 0; + image->cb(nbio, len); + } if (image->is_blocking_on_processing) image->status = IMAGE_STATUS_PROCESS_TRANSFER; break; case IMAGE_STATUS_TRANSFER: if (!image->is_blocking) - if (task_image_iterate_transfer(nbio) == -1) + if (task_image_iterate_transfer(image) == -1) image->status = IMAGE_STATUS_TRANSFER_PARSE; break; case IMAGE_STATUS_PROCESS_TRANSFER_PARSE: - task_image_iterate_transfer_parse(nbio); + if (image->handle && image->cb) + { + size_t len = 0; + image->cb(nbio, len); + } if (!image->is_finished) break; case IMAGE_STATUS_TRANSFER_PARSE_FREE: @@ -356,6 +343,31 @@ bool task_push_image_load(const char *fullpath, retro_task_callback_t cb, void * if (!image) goto error; + nbio->type = NBIO_TYPE_NONE; + image->type = IMAGE_TYPE_NONE; + + if (strstr(fullpath, file_path_str(FILE_PATH_PNG_EXTENSION))) + { + nbio->type = NBIO_TYPE_PNG; + image->type = IMAGE_TYPE_PNG; + } + else if (strstr(fullpath, file_path_str(FILE_PATH_JPEG_EXTENSION)) + || strstr(fullpath, file_path_str(FILE_PATH_JPG_EXTENSION))) + { + nbio->type = NBIO_TYPE_JPEG; + image->type = IMAGE_TYPE_JPEG; + } + else if (strstr(fullpath, file_path_str(FILE_PATH_BMP_EXTENSION))) + { + nbio->type = NBIO_TYPE_BMP; + image->type = IMAGE_TYPE_BMP; + } + else if (strstr(fullpath, file_path_str(FILE_PATH_TGA_EXTENSION))) + { + nbio->type = NBIO_TYPE_TGA; + image->type = IMAGE_TYPE_TGA; + } + image->status = IMAGE_STATUS_TRANSFER; nbio->data = (struct nbio_image_handle*)image; @@ -393,7 +405,10 @@ void task_image_load_free(retro_task_t *task) if (nbio) { - task_image_load_free_internal(nbio); + struct nbio_image_handle *image = (struct nbio_image_handle*)nbio->data; + + if (image) + task_image_load_free_internal(image); if (nbio->data) free(nbio->data); nbio_free(nbio->handle); diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index 4fe49bc630..9a0b0d5c27 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -24,7 +24,6 @@ #include #include -#include #ifdef HAVE_CONFIG_H #include "../config.h" @@ -62,9 +61,18 @@ enum nbio_status_flags NBIO_FLAG_IMAGE_SUPPORTS_RGBA }; +enum nbio_type +{ + NBIO_TYPE_NONE = 0, + NBIO_TYPE_JPEG, + NBIO_TYPE_PNG, + NBIO_TYPE_TGA, + NBIO_TYPE_BMP +}; + typedef struct nbio_handle { - enum image_type_enum image_type; + enum nbio_type type; void *data; bool is_finished; transfer_cb_t cb; From 739495027b6c2b36ff4607bfe5fdd420ec4c3429 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 20:03:39 +0200 Subject: [PATCH 012/274] Cleanups --- tasks/task_image.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_image.c b/tasks/task_image.c index 300456e36d..98148cf68f 100644 --- a/tasks/task_image.c +++ b/tasks/task_image.c @@ -243,7 +243,7 @@ static int cb_nbio_image_menu_thumbnail(void *data, size_t len) struct nbio_image_handle *image = nbio ? (struct nbio_image_handle*)nbio->data : NULL; - if (!nbio) + if (!image) goto error; handle = image_transfer_new(image->type); From 476738cc5c9da35898ab4aeccbf690f6abdd58bd Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 20:08:40 +0200 Subject: [PATCH 013/274] Cleanups --- tasks/task_file_transfer.c | 4 ---- tasks/task_image.c | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/tasks/task_file_transfer.c b/tasks/task_file_transfer.c index 3fbd775a80..fe8a4abbef 100644 --- a/tasks/task_file_transfer.c +++ b/tasks/task_file_transfer.c @@ -17,15 +17,11 @@ #include #include #include -#include #include -#include -#include #include #include "tasks_internal.h" -#include "../file_path_special.h" #include "../verbosity.h" static int task_file_transfer_iterate_transfer(nbio_handle_t *nbio) diff --git a/tasks/task_image.c b/tasks/task_image.c index 98148cf68f..d915c0462e 100644 --- a/tasks/task_image.c +++ b/tasks/task_image.c @@ -14,16 +14,14 @@ */ #include +#include #include #include #include #include #include -#include #include -#include -#include #include "../gfx/video_driver.h" #include "../file_path_special.h" From 06f5f635ca77db20b58d0422c45b9ddbb49b8f9a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 20:10:58 +0200 Subject: [PATCH 014/274] Cleanups --- tasks/task_http.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/tasks/task_http.c b/tasks/task_http.c index d37186acf8..dce460756d 100644 --- a/tasks/task_http.c +++ b/tasks/task_http.c @@ -13,17 +13,15 @@ * If not, see . */ +#include + #include -#include -#include #include #include #include -#include #include #include -#include "../msg_hash.h" #include "../verbosity.h" #include "tasks_internal.h" @@ -235,7 +233,9 @@ static bool task_http_retriever(retro_task_t *task, void *data) return true; } -static void* task_push_http_transfer_generic(struct http_connection_t *conn, const char *url, bool mute, const char *type, +static void* task_push_http_transfer_generic( + struct http_connection_t *conn, + const char *url, bool mute, const char *type, retro_task_callback_t cb, void *user_data) { task_finder_data_t find_data; @@ -305,7 +305,8 @@ error: return NULL; } -void* task_push_http_transfer(const char *url, bool mute, const char *type, +void* task_push_http_transfer(const char *url, bool mute, + const char *type, retro_task_callback_t cb, void *user_data) { struct http_connection_t *conn; @@ -315,14 +316,16 @@ void* task_push_http_transfer(const char *url, bool mute, const char *type, return task_push_http_transfer_generic(conn, url, mute, type, cb, user_data); } -void* task_push_http_post_transfer(const char *url, const char *post_data, bool mute, +void* task_push_http_post_transfer(const char *url, + const char *post_data, bool mute, const char *type, retro_task_callback_t cb, void *user_data) { struct http_connection_t *conn; conn = net_http_connection_new(url, "POST", post_data); - return task_push_http_transfer_generic(conn, url, mute, type, cb, user_data); + return task_push_http_transfer_generic(conn, + url, mute, type, cb, user_data); } task_retriever_info_t *http_task_get_transfer_list(void) From 5a9f6ad9b723e21c5b7c23b7779bae7481c8f38a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 20:45:09 +0200 Subject: [PATCH 015/274] Try to prevent null pointer dereference --- libretro-common/file/config_file.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 65fe3f96e2..983ef103aa 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -270,8 +270,9 @@ static void add_sub_conf(config_file_t *conf, char *line) real_path[0] = '\0'; #ifdef _WIN32 - fill_pathname_resolve_relative(real_path, conf->path, - path, sizeof(real_path)); + if (!string_is_empty(conf->path)) + fill_pathname_resolve_relative(real_path, conf->path, + path, sizeof(real_path)); #else #ifndef __CELLOS_LV2__ if (*path == '~') @@ -282,8 +283,9 @@ static void add_sub_conf(config_file_t *conf, char *line) } else #endif - fill_pathname_resolve_relative(real_path, conf->path, - path, sizeof(real_path)); + if (!string_is_empty(conf->path)) + fill_pathname_resolve_relative(real_path, conf->path, + path, sizeof(real_path)); #endif sub_conf = (config_file_t*) From 9dff2434ef30bf4bc7034aa000321f5086a050c6 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 9 May 2017 20:54:03 +0200 Subject: [PATCH 016/274] Fix some structurally dead code warnings --- frontend/frontend_driver.c | 11 +---------- gfx/video_shader_driver.c | 10 ++-------- ui/ui_companion_driver.c | 7 +------ 3 files changed, 4 insertions(+), 24 deletions(-) diff --git a/frontend/frontend_driver.c b/frontend/frontend_driver.c index 66683e4821..bb114ee15f 100644 --- a/frontend/frontend_driver.c +++ b/frontend/frontend_driver.c @@ -105,16 +105,7 @@ frontend_ctx_driver_t *frontend_ctx_find_driver(const char *ident) **/ frontend_ctx_driver_t *frontend_ctx_init_first(void) { - unsigned i; - frontend_ctx_driver_t *frontend = NULL; - - for (i = 0; frontend_ctx_drivers[i]; i++) - { - frontend = frontend_ctx_drivers[i]; - break; - } - - return frontend; + return frontend_ctx_drivers[0]; } bool frontend_driver_get_core_extension(char *s, size_t len) diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 160cfe17bc..e2422c25b2 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -138,14 +138,8 @@ bool video_shader_driver_deinit(void) /* Finds first suitable shader context driver. */ bool video_shader_driver_init_first(void) { - unsigned i; - - for (i = 0; shader_ctx_drivers[i]; i++) - { - current_shader = shader_ctx_drivers[i]; - return true; - } - return false; + current_shader = shader_ctx_drivers[0]; + return true; } bool video_shader_driver_init(video_shader_ctx_init_t *init) diff --git a/ui/ui_companion_driver.c b/ui/ui_companion_driver.c index 980d2311fa..78832a4f42 100644 --- a/ui/ui_companion_driver.c +++ b/ui/ui_companion_driver.c @@ -91,12 +91,7 @@ bool ui_companion_is_on_foreground(void) **/ const ui_companion_driver_t *ui_companion_init_first(void) { - unsigned i; - - for (i = 0; ui_companion_drivers[i]; i++) - return ui_companion_drivers[i]; - - return NULL; + return ui_companion_drivers[0]; } const ui_companion_driver_t *ui_companion_get_ptr(void) From 4af9a92f767bd045b989b12e9ae70a2bec7664cc Mon Sep 17 00:00:00 2001 From: radius Date: Tue, 9 May 2017 22:10:46 -0500 Subject: [PATCH 017/274] fix 3829 --- tasks/task_save.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/task_save.c b/tasks/task_save.c index 03a6c34a8d..fafaddf27d 100644 --- a/tasks/task_save.c +++ b/tasks/task_save.c @@ -1139,7 +1139,7 @@ bool content_save_state(const char *path, bool save_to_disk, bool autosave) { if (save_to_disk) { - if (path_file_exists(path)) + if (path_file_exists(path) && !autosave) { /* Before overwritting the savestate file, load it into a buffer to allow undo_save_state() to work */ From ed2dedb233adb09166c2d54eb382921038e8a073 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Wed, 10 May 2017 05:55:34 +0200 Subject: [PATCH 018/274] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 6b8e1c41d7..0c0d28a1a0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,5 @@ # 1.5.1 (future) +- AUTOSAVE/SRAM - Fix bug #3829 / #4820 (https://github.com/libretro/RetroArch/issues/3829) - NET: Fix bug #4703 (https://github.com/libretro/RetroArch/issues/4703) - ANDROID: Runtime permission checking - ANDROID: Improve autoconf fallback From 7f8d4479f4acebe4c8dc3ea57915276cc7270dea Mon Sep 17 00:00:00 2001 From: hunterk Date: Tue, 9 May 2017 23:20:00 -0500 Subject: [PATCH 019/274] fix version directives in GLSL shaders, courtesy of aliaspider --- gfx/drivers_shader/shader_glsl.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 2799559a80..56caac15a3 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -257,10 +257,29 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl, GLint status; const char *source[4]; char version[32]; + const char* existing_version; version[0] = '\0'; + existing_version = strstr(program, "#version"); - if (glsl_core && !strstr(program, "#version")) + if(existing_version) + { + int len = 8; + while(existing_version[len] && isspace(existing_version[len])) + len++; + while(existing_version[len] && !isspace(existing_version[len])) + len++; + + program = existing_version + len; + + if(len > (sizeof(version) - 2)) + len = sizeof(version) - 2; + + strncpy(version, existing_version, len); + version[len] = '\n'; + version[len + 1] = '\0'; + } + else if (glsl_core) { unsigned version_no = 0; unsigned gl_ver = glsl_major * 100 + glsl_minor * 10; From 865ec1eb715c6ccaa839ba1e1664dd4f47b7f4d6 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 10 May 2017 06:23:53 +0200 Subject: [PATCH 020/274] Cleanup --- gfx/drivers_shader/shader_glsl.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 56caac15a3..fae0d4700a 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -257,10 +257,9 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl, GLint status; const char *source[4]; char version[32]; - const char* existing_version; + const char *existing_version = strstr(program, "#version"); - version[0] = '\0'; - existing_version = strstr(program, "#version"); + version[0] = '\0'; if(existing_version) { From 1b302d6e402c11284cf847e5c4933806487e3e83 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 10 May 2017 06:31:06 +0200 Subject: [PATCH 021/274] (shader_vulkan.cpp) Cleanups --- gfx/drivers_shader/shader_vulkan.cpp | 106 ++++++++++++++------------- 1 file changed, 56 insertions(+), 50 deletions(-) diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index fb3e47c1f7..605df95118 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -26,6 +26,7 @@ #include #include +#include #include "slang_reflection.hpp" @@ -45,7 +46,7 @@ static const uint32_t opaque_frag[] = static unsigned num_miplevels(unsigned width, unsigned height) { - unsigned size = std::max(width, height); + unsigned size = MAX(width, height); unsigned levels = 0; while (size) { @@ -280,23 +281,23 @@ class Framebuffer void generate_mips(VkCommandBuffer cmd); private: - VkDevice device = VK_NULL_HANDLE; const VkPhysicalDeviceMemoryProperties &memory_properties; - VkImage image = VK_NULL_HANDLE; - VkImageView view = VK_NULL_HANDLE; + VkDevice device = VK_NULL_HANDLE; + VkImage image = VK_NULL_HANDLE; + VkImageView view = VK_NULL_HANDLE; VkImageView fb_view = VK_NULL_HANDLE; Size2D size; VkFormat format; unsigned max_levels; - unsigned levels = 0; + unsigned levels = 0; VkFramebuffer framebuffer = VK_NULL_HANDLE; - VkRenderPass render_pass = VK_NULL_HANDLE; + VkRenderPass render_pass = VK_NULL_HANDLE; struct { - size_t size = 0; - uint32_t type = 0; + size_t size = 0; + uint32_t type = 0; VkDeviceMemory memory = VK_NULL_HANDLE; } memory; @@ -2267,23 +2268,23 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) } VkImageBlit blit_region = {}; - unsigned src_width = std::max(size.width >> (i - 1), 1u); - unsigned src_height = std::max(size.height >> (i - 1), 1u); - unsigned target_width = std::max(size.width >> i, 1u); - unsigned target_height = std::max(size.height >> i, 1u); + unsigned src_width = MAX(size.width >> (i - 1), 1u); + unsigned src_height = MAX(size.height >> (i - 1), 1u); + unsigned target_width = MAX(size.width >> i, 1u); + unsigned target_height = MAX(size.height >> i, 1u); - blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blit_region.srcSubresource.mipLevel = i - 1; + blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit_region.srcSubresource.mipLevel = i - 1; blit_region.srcSubresource.baseArrayLayer = 0; - blit_region.srcSubresource.layerCount = 1; - blit_region.dstSubresource = blit_region.srcSubresource; - blit_region.dstSubresource.mipLevel = i; - blit_region.srcOffsets[1].x = src_width; - blit_region.srcOffsets[1].y = src_height; - blit_region.srcOffsets[1].z = 1; - blit_region.dstOffsets[1].x = target_width; - blit_region.dstOffsets[1].y = target_height; - blit_region.dstOffsets[1].z = 1; + blit_region.srcSubresource.layerCount = 1; + blit_region.dstSubresource = blit_region.srcSubresource; + blit_region.dstSubresource.mipLevel = i; + blit_region.srcOffsets[1].x = src_width; + blit_region.srcOffsets[1].y = src_height; + blit_region.srcOffsets[1].z = 1; + blit_region.dstOffsets[1].x = target_width; + blit_region.dstOffsets[1].y = target_height; + blit_region.dstOffsets[1].z = 1; vkCmdBlitImage(cmd, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, @@ -2646,6 +2647,7 @@ static unique_ptr vulkan_filter_chain_load_lut(VkCommandBuffer cm vulkan_filter_chain *chain, const video_shader_lut *shader) { + unsigned i; texture_image image; unique_ptr buffer; VkMemoryRequirements mem_reqs; @@ -2728,29 +2730,29 @@ static unique_ptr vulkan_filter_chain_load_lut(VkCommandBuffer cm shader->mipmap ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); - for (unsigned i = 1; i < image_info.mipLevels; i++) + for (i = 1; i < image_info.mipLevels; i++) { VkImageBlit blit_region = {}; - unsigned src_width = std::max(image.width >> (i - 1), 1u); - unsigned src_height = std::max(image.height >> (i - 1), 1u); - unsigned target_width = std::max(image.width >> i, 1u); - unsigned target_height = std::max(image.height >> i, 1u); + unsigned src_width = MAX(image.width >> (i - 1), 1u); + unsigned src_height = MAX(image.height >> (i - 1), 1u); + unsigned target_width = MAX(image.width >> i, 1u); + unsigned target_height = MAX(image.height >> i, 1u); - blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blit_region.srcSubresource.mipLevel = i - 1; + blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit_region.srcSubresource.mipLevel = i - 1; blit_region.srcSubresource.baseArrayLayer = 0; - blit_region.srcSubresource.layerCount = 1; - blit_region.dstSubresource = blit_region.srcSubresource; - blit_region.dstSubresource.mipLevel = i; - blit_region.srcOffsets[1].x = src_width; - blit_region.srcOffsets[1].y = src_height; - blit_region.srcOffsets[1].z = 1; - blit_region.dstOffsets[1].x = target_width; - blit_region.dstOffsets[1].y = target_height; - blit_region.dstOffsets[1].z = 1; + blit_region.srcSubresource.layerCount = 1; + blit_region.dstSubresource = blit_region.srcSubresource; + blit_region.dstSubresource.mipLevel = i; + blit_region.srcOffsets[1].x = src_width; + blit_region.srcOffsets[1].y = src_height; + blit_region.srcOffsets[1].z = 1; + blit_region.dstOffsets[1].x = target_width; + blit_region.dstOffsets[1].y = target_height; + blit_region.dstOffsets[1].z = 1; - // Only injects execution and memory barriers, - // not actual transition. + /* Only injects execution and memory barriers, + * not actual transition. */ image_layout_transition(cmd, tex, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL, @@ -2847,6 +2849,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( const struct vulkan_filter_chain_create_info *info, const char *path, vulkan_filter_chain_filter filter) { + unsigned i; unique_ptr shader{ new video_shader() }; if (!shader) return nullptr; @@ -2873,7 +2876,7 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( shader->num_parameters = 0; - for (unsigned i = 0; i < shader->passes; i++) + for (i = 0; i < shader->passes; i++) { const video_shader_pass *pass = &shader->pass[i]; const video_shader_pass *next_pass = @@ -3061,16 +3064,19 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( if (last_pass_is_fbo) { struct vulkan_filter_chain_pass_info pass_info; - memset(&pass_info, 0, sizeof(pass_info)); - pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT; - pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT; - pass_info.scale_x = 1.0f; - pass_info.scale_y = 1.0f; - pass_info.rt_format = tmpinfo.swapchain.format; + + pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT; + pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT; + pass_info.scale_x = 1.0f; + pass_info.scale_y = 1.0f; + + pass_info.rt_format = tmpinfo.swapchain.format; pass_info.source_filter = filter; - pass_info.mip_filter = VULKAN_FILTER_CHAIN_NEAREST; - pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE; + pass_info.mip_filter = VULKAN_FILTER_CHAIN_NEAREST; + pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE; + + pass_info.max_levels = 0; chain->set_pass_info(shader->passes, pass_info); From e0c0815f427e394dbfafa272c086f5f1e635d443 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 10 May 2017 06:40:21 +0200 Subject: [PATCH 022/274] (shader_vulkan.cpp) cleanups - don't use memset --- gfx/drivers_shader/shader_vulkan.cpp | 47 ++++++++++++++++++---------- gfx/drivers_shader/shader_vulkan.h | 8 ++--- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index 605df95118..bac766cab5 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -2172,17 +2172,18 @@ Framebuffer::Framebuffer( void Framebuffer::clear(VkCommandBuffer cmd) { + VkClearColorValue color; + VkImageSubresourceRange range; + image_layout_transition(cmd, image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - VkClearColorValue color; memset(&color, 0, sizeof(color)); - - VkImageSubresourceRange range; memset(&range, 0, sizeof(range)); + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; range.levelCount = 1; range.layerCount = 1; @@ -2199,6 +2200,7 @@ void Framebuffer::clear(VkCommandBuffer cmd) void Framebuffer::generate_mips(VkCommandBuffer cmd) { + unsigned i; // This is run every frame, so make sure // we aren't opting into the "lazy" way of doing this. :) VkImageMemoryBarrier barriers[2] = { @@ -2245,7 +2247,7 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) 0, nullptr, 2, barriers); - for (unsigned i = 1; i < levels; i++) + for (i = 1; i < levels; i++) { // For subsequent passes, we have to transition from DST_OPTIMAL to SRC_OPTIMAL, // but only do so one mip-level at a time. @@ -2326,20 +2328,22 @@ void Framebuffer::generate_mips(VkCommandBuffer cmd) void Framebuffer::copy(VkCommandBuffer cmd, VkImage src_image, VkImageLayout src_layout) { + VkImageCopy region; + image_layout_transition(cmd, image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT); - VkImageCopy region; memset(®ion, 0, sizeof(region)); + region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; region.srcSubresource.layerCount = 1; - region.dstSubresource = region.srcSubresource; - region.extent.width = size.width; - region.extent.height = size.height; - region.extent.depth = 1; + region.dstSubresource = region.srcSubresource; + region.extent.width = size.width; + region.extent.height = size.height; + region.extent.depth = 1; vkCmdCopyImage(cmd, src_image, src_layout, @@ -2545,7 +2549,6 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_default( if (!chain) return nullptr; - memset(&pass_info, 0, sizeof(pass_info)); pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT; pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_VIEWPORT; pass_info.scale_x = 1.0f; @@ -2554,6 +2557,8 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_default( pass_info.source_filter = filter; pass_info.mip_filter = VULKAN_FILTER_CHAIN_NEAREST; pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE; + pass_info.max_levels = 0; + chain->set_pass_info(0, pass_info); chain->set_shader(0, VK_SHADER_STAGE_VERTEX_BIT, @@ -2878,13 +2883,22 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( for (i = 0; i < shader->passes; i++) { - const video_shader_pass *pass = &shader->pass[i]; + glslang_output output; + struct vulkan_filter_chain_pass_info pass_info; + const video_shader_pass *pass = &shader->pass[i]; const video_shader_pass *next_pass = i + 1 < shader->passes ? &shader->pass[i + 1] : nullptr; - struct vulkan_filter_chain_pass_info pass_info; - memset(&pass_info, 0, sizeof(pass_info)); - glslang_output output; + pass_info.scale_type_x = VULKAN_FILTER_CHAIN_SCALE_ORIGINAL; + pass_info.scale_type_y = VULKAN_FILTER_CHAIN_SCALE_ORIGINAL; + pass_info.scale_x = 0.0f; + pass_info.scale_y = 0.0f; + pass_info.rt_format = VK_FORMAT_UNDEFINED; + pass_info.source_filter = VULKAN_FILTER_CHAIN_LINEAR; + pass_info.mip_filter = VULKAN_FILTER_CHAIN_LINEAR; + pass_info.address = VULKAN_FILTER_CHAIN_ADDRESS_REPEAT; + pass_info.max_levels = 0; + if (!glslang_compile_shader(pass->source.path, &output)) { RARCH_ERR("Failed to compile shader: \"%s\".\n", @@ -2963,15 +2977,14 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( pass->filter == RARCH_FILTER_LINEAR ? VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST; } - pass_info.address = wrap_to_address(pass->wrap); + pass_info.address = wrap_to_address(pass->wrap); + pass_info.max_levels = 1; // TODO: Expose max_levels in slangp. // CGP format is a bit awkward in that it uses mipmap_input, // so we much check if next pass needs the mipmapping. if (next_pass && next_pass->mipmap) pass_info.max_levels = ~0u; - else - pass_info.max_levels = 1; pass_info.mip_filter = pass->filter != RARCH_FILTER_NEAREST && pass_info.max_levels > 1 ? VULKAN_FILTER_CHAIN_LINEAR : VULKAN_FILTER_CHAIN_NEAREST; diff --git a/gfx/drivers_shader/shader_vulkan.h b/gfx/drivers_shader/shader_vulkan.h index 16ec5c1cb4..26c373023e 100644 --- a/gfx/drivers_shader/shader_vulkan.h +++ b/gfx/drivers_shader/shader_vulkan.h @@ -38,10 +38,10 @@ enum vulkan_filter_chain_filter enum vulkan_filter_chain_address { - VULKAN_FILTER_CHAIN_ADDRESS_REPEAT = 0, - VULKAN_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT = 1, - VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE = 2, - VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER = 3, + VULKAN_FILTER_CHAIN_ADDRESS_REPEAT = 0, + VULKAN_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT = 1, + VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE = 2, + VULKAN_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER = 3, VULKAN_FILTER_CHAIN_ADDRESS_MIRROR_CLAMP_TO_EDGE = 4, VULKAN_FILTER_CHAIN_ADDRESS_COUNT }; From ef8094836f5a77c41e5c561904081527ed103a4f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 10 May 2017 07:07:06 +0200 Subject: [PATCH 023/274] Create input_driver_get_float --- configuration.c | 3 ++- configuration.h | 1 - input/drivers/android_input.c | 3 +-- input/input_driver.c | 32 +++++++++++++++++++++++--------- input/input_driver.h | 8 ++++++++ menu/menu_setting.c | 2 +- 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/configuration.c b/configuration.c index f309498123..670ba4b1aa 100644 --- a/configuration.c +++ b/configuration.c @@ -32,6 +32,7 @@ #include "file_path_special.h" #include "audio/audio_driver.h" +#include "input/input_driver.h" #include "configuration.h" #include "content.h" #include "config.def.h" @@ -1283,7 +1284,7 @@ static struct config_float_setting *populate_settings_float(settings_t *settings SETTING_FLOAT("video_font_size", &settings->floats.video_font_size, true, font_size, false); SETTING_FLOAT("fastforward_ratio", &settings->floats.fastforward_ratio, true, fastforward_ratio, false); SETTING_FLOAT("slowmotion_ratio", &settings->floats.slowmotion_ratio, true, slowmotion_ratio, false); - SETTING_FLOAT("input_axis_threshold", &settings->floats.input_axis_threshold, true, axis_threshold, false); + SETTING_FLOAT("input_axis_threshold", input_driver_get_float(INPUT_ACTION_AXIS_THRESHOLD), true, axis_threshold, false); *size = count; diff --git a/configuration.h b/configuration.h index 43d71d40e2..e98ef1adb6 100644 --- a/configuration.h +++ b/configuration.h @@ -231,7 +231,6 @@ typedef struct settings float audio_max_timing_skew; float audio_volume; /* dB scale. */ - float input_axis_threshold; float input_overlay_opacity; float input_overlay_scale; diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 721cf2e290..550443e57e 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -1243,7 +1243,6 @@ static bool android_input_key_pressed(void *data, int key) { rarch_joypad_info_t joypad_info; android_input_t *android = (android_input_t*)data; - settings_t *settings = config_get_ptr(); const struct retro_keybind *keyptr = (const struct retro_keybind*) &input_config_binds[0][key]; @@ -1254,7 +1253,7 @@ static bool android_input_key_pressed(void *data, int key) joypad_info.joy_idx = 0; joypad_info.auto_binds = input_autoconf_binds[0]; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = *(input_driver_get_float(INPUT_ACTION_AXIS_THRESHOLD)); if (keyptr->valid && input_joypad_pressed(android->joypad, joypad_info, diff --git a/input/input_driver.c b/input/input_driver.c index ec0e95619d..65df265627 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -123,6 +123,7 @@ static bool input_driver_block_libretro_input = false; static bool input_driver_nonblock_state = false; static bool input_driver_flushing_input = false; static bool input_driver_data_own = false; +static float input_driver_axis_threshold = 0.0f; /** * input_driver_find_handle: @@ -271,7 +272,6 @@ void input_poll(void) size_t i; settings_t *settings = config_get_ptr(); unsigned max_users = settings->uints.input_max_users; - float axis_threshold = settings->floats.input_axis_threshold; current_input->poll(current_input_data); @@ -285,7 +285,7 @@ void input_poll(void) libretro_input_binds[i][RARCH_TURBO_ENABLE].valid) { rarch_joypad_info_t joypad_info; - joypad_info.axis_threshold = axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; joypad_info.joy_idx = settings->uints.input_joypad_map[i]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; @@ -304,7 +304,7 @@ void input_poll(void) overlay_ptr, settings->floats.input_overlay_opacity, settings->uints.input_analog_dpad_mode[0], - axis_threshold); + input_driver_axis_threshold); #endif #ifdef HAVE_COMMAND @@ -380,7 +380,7 @@ int16_t input_state(unsigned port, unsigned device, { rarch_joypad_info_t joypad_info; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; @@ -497,7 +497,7 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) if (!input_driver_block_libretro_input) { rarch_joypad_info_t joypad_info; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; for (i = 4; i < 16; i++) { @@ -558,7 +558,7 @@ static INLINE bool input_menu_keys_pressed_internal( joypad_info.joy_idx = settings->uints.input_joypad_map[port]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; if (sec && input_joypad_pressed(sec, joypad_info, port, input_config_binds[0], i)) @@ -694,7 +694,7 @@ uint64_t input_menu_keys_pressed( joypad_info.joy_idx = 0; joypad_info.auto_binds = NULL; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; input_driver_block_libretro_input = false; input_driver_block_hotkey = false; @@ -841,7 +841,7 @@ static INLINE bool input_keys_pressed_internal( joypad_info.joy_idx = settings->uints.input_joypad_map[0]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; if (bind_valid && current_input->input_state(current_input_data, joypad_info, &binds, @@ -919,7 +919,7 @@ uint64_t input_keys_pressed( joypad_info.joy_idx = 0; joypad_info.auto_binds = NULL; - joypad_info.axis_threshold = settings->floats.input_axis_threshold; + joypad_info.axis_threshold = input_driver_axis_threshold; input_driver_block_libretro_input = false; input_driver_block_hotkey = false; @@ -1244,6 +1244,20 @@ bool input_driver_grab_mouse(void) return true; } +float *input_driver_get_float(enum input_action action) +{ + switch (action) + { + case INPUT_ACTION_AXIS_THRESHOLD: + return &input_driver_axis_threshold; + default: + case INPUT_ACTION_NONE: + break; + } + + return NULL; +} + bool input_driver_ungrab_mouse(void) { if (!current_input || !current_input->grab_mouse) diff --git a/input/input_driver.h b/input/input_driver.h index 64ef2b9676..41c37d7920 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -48,6 +48,12 @@ enum input_toggle_type INPUT_TOGGLE_LAST }; +enum input_action +{ + INPUT_ACTION_NONE = 0, + INPUT_ACTION_AXIS_THRESHOLD +}; + struct retro_keybind { bool valid; @@ -336,6 +342,8 @@ bool input_driver_grab_mouse(void); bool input_driver_ungrab_mouse(void); +float *input_driver_get_float(enum input_action action); + bool input_driver_is_data_ptr_same(void *data); extern input_driver_t input_android; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 79b841c595..5229ba9801 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -4286,7 +4286,7 @@ static bool setting_append_list( CONFIG_FLOAT( list, list_info, - &settings->floats.input_axis_threshold, + input_driver_get_float(INPUT_ACTION_AXIS_THRESHOLD), MENU_ENUM_LABEL_INPUT_AXIS_THRESHOLD, MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, axis_threshold, From 9a6e137a56c307ac4e2710c5d53d7ac86d2d87d4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 10 May 2017 07:10:05 +0200 Subject: [PATCH 024/274] Get rid of header include --- input/drivers/android_input.c | 1 - 1 file changed, 1 deletion(-) diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 550443e57e..60000de61a 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -42,7 +42,6 @@ #include "../drivers_keyboard/keyboard_event_android.h" #include "../../tasks/tasks_internal.h" #include "../../performance_counters.h" -#include "../../configuration.h" #define MAX_TOUCH 16 #define MAX_NUM_KEYBOARDS 3 From 1e7701bf29b446e3ab19ce47f35613121b0c206b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Garc=C3=ADa=20Garc=C3=ADa?= Date: Thu, 11 May 2017 02:51:10 +0200 Subject: [PATCH 025/274] [VITA] Fix 30 fps menu and frame throttle --- defines/psp_defines.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defines/psp_defines.h b/defines/psp_defines.h index c2b65e1da9..aa8498ea80 100644 --- a/defines/psp_defines.h +++ b/defines/psp_defines.h @@ -106,7 +106,7 @@ int sceClibPrintf ( const char * format, ... ); #if defined(VITA) #define CtrlSetSamplingMode(mode) sceCtrlSetSamplingModeExt(mode) -#define CtrlPeekBufferPositive(port, pad_data, bufs) sceCtrlReadBufferPositiveExt2(port, pad_data, bufs) +#define CtrlPeekBufferPositive(port, pad_data, bufs) sceCtrlPeekBufferPositiveExt2(port, pad_data, bufs) #else #define CtrlSetSamplingMode(mode) sceCtrlSetSamplingMode(mode) #define CtrlPeekBufferPositive(port, pad_data, bufs) sceCtrlPeekBufferPositive(port, pad_data, bufs) From 57089dc1082bf4541b14562c77a11266efb0bcae Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 11 May 2017 02:56:11 +0200 Subject: [PATCH 026/274] Update gl_common.c - update CHANGES.md --- CHANGES.md | 2 ++ gfx/common/gl_common.c | 30 ------------------------ gfx/common/gl_common.h | 38 +++++++++++++++++++++++++++++-- gfx/drivers_shader/shader_gl_cg.c | 9 ++++---- gfx/drivers_shader/shader_glsl.c | 10 ++++---- 5 files changed, 47 insertions(+), 42 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0c0d28a1a0..8be2a7dc48 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -17,6 +17,8 @@ default font - VIDEO: Fix threaded video regression; tickering of menu entries would no longer work. - LOBBIES: Fallback to filename based matching if no CRC matches are found (for people making playlists by hand) - VITA: Fix slow I/O +- VITA: Fix 30fps menu (poke into input now instead of reading the entire input buffer which apparently is slow) +- VITA: Fix frame throttle - VULKAN: Fix some crashes on loading some thumbnails # 1.5.0 diff --git a/gfx/common/gl_common.c b/gfx/common/gl_common.c index 7edbb8a19e..f349938427 100644 --- a/gfx/common/gl_common.c +++ b/gfx/common/gl_common.c @@ -24,36 +24,6 @@ #include "../drivers/gl_symlinks.h" #include "../video_coord_array.h" -void gl_ff_vertex(const struct video_coords *coords) -{ -#ifndef NO_GL_FF_VERTEX - /* Fall back to fixed function-style if needed and possible. */ - glClientActiveTexture(GL_TEXTURE1); - glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glClientActiveTexture(GL_TEXTURE0); - glVertexPointer(2, GL_FLOAT, 0, coords->vertex); - glEnableClientState(GL_VERTEX_ARRAY); - glColorPointer(4, GL_FLOAT, 0, coords->color); - glEnableClientState(GL_COLOR_ARRAY); - glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); -#endif -} - -void gl_ff_matrix(const math_matrix_4x4 *mat) -{ -#ifndef NO_GL_FF_MATRIX - math_matrix_4x4 ident; - - /* Fall back to fixed function-style if needed and possible. */ - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(mat->data); - glMatrixMode(GL_MODELVIEW); - matrix_4x4_identity(ident); - glLoadMatrixf(ident.data); -#endif -} static void gl_size_format(GLint* internalFormat) { diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 636d005618..bf2858d8ca 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -155,6 +155,41 @@ typedef struct gl bool gl_load_luts(const struct video_shader *generic_shader, GLuint *lut_textures); +#ifdef NO_GL_FF_VERTEX +#define gl_ff_vertex(coords) ((void)0) +#else +static INLINE void gl_ff_vertex(const struct video_coords *coords) +{ + /* Fall back to fixed function-style if needed and possible. */ + glClientActiveTexture(GL_TEXTURE1); + glTexCoordPointer(2, GL_FLOAT, 0, coords->lut_tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glClientActiveTexture(GL_TEXTURE0); + glVertexPointer(2, GL_FLOAT, 0, coords->vertex); + glEnableClientState(GL_VERTEX_ARRAY); + glColorPointer(4, GL_FLOAT, 0, coords->color); + glEnableClientState(GL_COLOR_ARRAY); + glTexCoordPointer(2, GL_FLOAT, 0, coords->tex_coord); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); +} +#endif + +#ifdef NO_GL_FF_MATRIX +#define gl_ff_matrix(mat) ((void)0) +#else +static INLINE void gl_ff_matrix(const math_matrix_4x4 *mat) +{ + math_matrix_4x4 ident; + + /* Fall back to fixed function-style if needed and possible. */ + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(mat->data); + glMatrixMode(GL_MODELVIEW); + matrix_4x4_identity(ident); + glLoadMatrixf(ident.data); +} +#endif + static INLINE unsigned gl_wrap_type_to_enum(enum gfx_wrap_type type) { switch (type) @@ -176,9 +211,8 @@ static INLINE unsigned gl_wrap_type_to_enum(enum gfx_wrap_type type) return 0; } + bool gl_query_core_context_in_use(void); -void gl_ff_vertex(const struct video_coords *coords); -void gl_ff_matrix(const math_matrix_4x4 *mat); void gl_load_texture_image(GLenum target, GLint level, GLint internalFormat, diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 3aaec6d1fd..c0c7f1bfb0 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -261,14 +261,13 @@ static bool gl_cg_set_mvp(void *data, void *shader_data, const math_matrix_4x4 * { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; if (!cg || !cg->prg[cg->active_idx].mvp) - goto fallback; + { + gl_ff_matrix(mat); + return false; + } cgGLSetMatrixParameterfc(cg->prg[cg->active_idx].mvp, mat->data); return true; - -fallback: - gl_ff_matrix(mat); - return false; } static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index fae0d4700a..40bde3a2cf 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -1379,7 +1379,10 @@ static bool gl_glsl_set_mvp(void *data, void *shader_data, const math_matrix_4x4 (void)data; if (!glsl || !glsl->shader->modern) - goto fallback; + { + gl_ff_matrix(mat); + return false; + } loc = glsl->uniforms[glsl->active_idx].mvp; if (loc >= 0) @@ -1394,11 +1397,8 @@ static bool gl_glsl_set_mvp(void *data, void *shader_data, const math_matrix_4x4 current_mat_data[glsl->active_idx] = *mat->data; } } - return true; -fallback: - gl_ff_matrix(mat); - return false; + return true; } #define gl_glsl_set_coord_array(attribs, coord1, coord2, coords, size, multiplier) \ From f060863d40861518ce322abc218ccee431dc5d33 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 11 May 2017 03:00:24 +0200 Subject: [PATCH 027/274] Update CHANGES.md --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 8be2a7dc48..e325f62955 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ default font - WINDOWS: Core mouse input should be relative again in cores - MISC: Various frontend optimizations. - VIDEO: Fix threaded video regression; tickering of menu entries would no longer work. +- WII: Fix crashing issues which could occur with the dummy core - LOBBIES: Fallback to filename based matching if no CRC matches are found (for people making playlists by hand) - VITA: Fix slow I/O - VITA: Fix 30fps menu (poke into input now instead of reading the entire input buffer which apparently is slow) From 1223309052671d7ad6cc7e516a418865ce6eff26 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Thu, 11 May 2017 05:14:11 +0100 Subject: [PATCH 028/274] better handling of existing #version directive in glsl shaders. --- gfx/drivers_shader/shader_glsl.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 40bde3a2cf..42d9f1f30d 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -261,22 +261,17 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl, version[0] = '\0'; - if(existing_version) + if (existing_version) { - int len = 8; - while(existing_version[len] && isspace(existing_version[len])) - len++; - while(existing_version[len] && !isspace(existing_version[len])) - len++; - - program = existing_version + len; - - if(len > (sizeof(version) - 2)) - len = sizeof(version) - 2; - - strncpy(version, existing_version, len); - version[len] = '\n'; - version[len + 1] = '\0'; + unsigned version_no = strtoul(existing_version + 8, (char**)&program, 10); +#ifdef HAVE_OPENGLES + if (version_no < 130) + version_no = 100; + else + version_no = 300; +#endif + snprintf(version, sizeof(version), "#version %u\n", version_no); + RARCH_LOG("[GLSL]: Using GLSL version %u.\n", version_no); } else if (glsl_core) { From 2906bec7a846395ff30dfc956fe01c213ea76cb4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 11 May 2017 07:36:21 +0200 Subject: [PATCH 029/274] Create input_driver_get_uint --- configuration.c | 2 +- configuration.h | 2 - dynamic.c | 19 +++++---- input/input_driver.c | 25 +++++++++--- input/input_driver.h | 5 ++- input/input_remapping.c | 3 +- menu/menu_displaylist.c | 22 +++++----- menu/menu_setting.c | 58 +++++++++++++++------------ menu/widgets/menu_input_bind_dialog.c | 4 +- runloop.c | 2 +- tasks/task_autodetect.c | 2 +- 11 files changed, 88 insertions(+), 56 deletions(-) diff --git a/configuration.c b/configuration.c index 670ba4b1aa..00d816d859 100644 --- a/configuration.c +++ b/configuration.c @@ -1300,7 +1300,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("input_bind_timeout", &settings->uints.input_bind_timeout, true, input_bind_timeout, false); SETTING_UINT("input_turbo_period", &settings->uints.input_turbo_period, true, turbo_period, false); SETTING_UINT("input_duty_cycle", &settings->uints.input_turbo_duty_cycle, true, turbo_duty_cycle, false); - SETTING_UINT("input_max_users", &settings->uints.input_max_users, true, input_max_users, false); + SETTING_UINT("input_max_users", input_driver_get_uint(INPUT_ACTION_MAX_USERS), true, input_max_users, false); SETTING_UINT("input_menu_toggle_gamepad_combo", &settings->uints.input_menu_toggle_gamepad_combo, true, menu_toggle_gamepad_combo, false); SETTING_UINT("audio_latency", &settings->uints.audio_latency, false, 0 /* TODO */, false); SETTING_UINT("audio_block_frames", &settings->uints.audio_block_frames, true, 0, false); diff --git a/configuration.h b/configuration.h index e98ef1adb6..4d7bafd647 100644 --- a/configuration.h +++ b/configuration.h @@ -255,8 +255,6 @@ typedef struct settings unsigned audio_latency; unsigned input_remap_ids[MAX_USERS][RARCH_BIND_LIST_END]; - unsigned input_max_users; - /* Set by autoconfiguration in joypad_autoconfig_dir. * Does not override main binds. */ unsigned input_libretro_device[MAX_USERS]; diff --git a/dynamic.c b/dynamic.c index d8341466a4..7928715481 100644 --- a/dynamic.c +++ b/dynamic.c @@ -1190,17 +1190,22 @@ bool rarch_environment_cb(unsigned cmd, void *data) } RARCH_LOG("Environ SET_INPUT_DESCRIPTORS:\n"); - for (p = 0; p < settings->uints.input_max_users; p++) + { - for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + + for (p = 0; p < max_users; p++) { - const char *description = system->input_desc_btn[p][retro_id]; + for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND; retro_id++) + { + const char *description = system->input_desc_btn[p][retro_id]; - if (!description) - continue; + if (!description) + continue; - RARCH_LOG("\tRetroPad, User %u, Button \"%s\" => \"%s\"\n", - p + 1, libretro_btn_desc[retro_id], description); + RARCH_LOG("\tRetroPad, User %u, Button \"%s\" => \"%s\"\n", + p + 1, libretro_btn_desc[retro_id], description); + } } } diff --git a/input/input_driver.c b/input/input_driver.c index 65df265627..212931a5dc 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -124,6 +124,7 @@ static bool input_driver_nonblock_state = false; static bool input_driver_flushing_input = false; static bool input_driver_data_own = false; static float input_driver_axis_threshold = 0.0f; +static unsigned input_driver_max_users = 0; /** * input_driver_find_handle: @@ -271,7 +272,7 @@ void input_poll(void) { size_t i; settings_t *settings = config_get_ptr(); - unsigned max_users = settings->uints.input_max_users; + unsigned max_users = input_driver_max_users; current_input->poll(current_input_data); @@ -478,7 +479,7 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) unsigned i; const struct retro_keybind *binds[MAX_USERS]; settings_t *settings = config_get_ptr(); - unsigned max_users = settings->uints.input_max_users; + unsigned max_users = input_driver_max_users; for (i = 0; i < max_users; i++) { @@ -679,7 +680,7 @@ uint64_t input_menu_keys_pressed( settings_t *settings = (settings_t*)data; const struct retro_keybind *binds_norm = NULL; const struct retro_keybind *binds_auto = NULL; - unsigned max_users = settings->uints.input_max_users; + unsigned max_users = input_driver_max_users; if (settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb()) return input_keys_pressed(settings, old_input, last_input, @@ -1209,7 +1210,7 @@ void input_driver_deinit_remote(void) settings_t *settings = config_get_ptr(); input_remote_free(input_driver_remote, - settings->uints.input_max_users); + input_driver_max_users); } input_driver_remote = NULL; #endif @@ -1225,7 +1226,7 @@ bool input_driver_init_remote(void) input_driver_remote = input_remote_new( settings->uints.network_remote_base_port, - settings->uints.input_max_users); + input_driver_max_users); if (input_driver_remote) return true; @@ -1258,6 +1259,20 @@ float *input_driver_get_float(enum input_action action) return NULL; } +unsigned *input_driver_get_uint(enum input_action action) +{ + switch (action) + { + case INPUT_ACTION_MAX_USERS: + return &input_driver_max_users; + default: + case INPUT_ACTION_NONE: + break; + } + + return NULL; +} + bool input_driver_ungrab_mouse(void) { if (!current_input || !current_input->grab_mouse) diff --git a/input/input_driver.h b/input/input_driver.h index 41c37d7920..b824a24518 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -51,7 +51,8 @@ enum input_toggle_type enum input_action { INPUT_ACTION_NONE = 0, - INPUT_ACTION_AXIS_THRESHOLD + INPUT_ACTION_AXIS_THRESHOLD, + INPUT_ACTION_MAX_USERS }; struct retro_keybind @@ -344,6 +345,8 @@ bool input_driver_ungrab_mouse(void); float *input_driver_get_float(enum input_action action); +unsigned *input_driver_get_uint(enum input_action action); + bool input_driver_is_data_ptr_same(void *data); extern input_driver_t input_android; diff --git a/input/input_remapping.c b/input/input_remapping.c index 7871be75d2..5dfccaa040 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -105,6 +105,7 @@ bool input_remapping_save_file(const char *path) char buf[PATH_MAX_LENGTH]; char remap_file[PATH_MAX_LENGTH]; config_file_t *conf = NULL; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); settings_t *settings = config_get_ptr(); buf[0] = remap_file[0] = '\0'; @@ -123,7 +124,7 @@ bool input_remapping_save_file(const char *path) return false; } - for (i = 0; i < settings->uints.input_max_users; i++) + for (i = 0; i < max_users; i++) { char buf[64]; char key_ident[RARCH_FIRST_CUSTOM_BIND + 4][128] = {{0}}; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 4d227ffadf..f005dc708b 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3211,12 +3211,12 @@ static int menu_displaylist_parse_options_remappings( unsigned p, retro_id; rarch_system_info_t *system = NULL; menu_handle_t *menu = NULL; - settings_t *settings = config_get_ptr(); + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); if (!menu_driver_ctl(RARCH_MENU_CTL_DRIVER_DATA_GET, &menu)) return -1; - for (p = 0; p < settings->uints.input_max_users; p++) + for (p = 0; p < max_users; p++) { char key_type[PATH_MAX_LENGTH]; char key_analog[PATH_MAX_LENGTH]; @@ -3255,7 +3255,7 @@ static int menu_displaylist_parse_options_remappings( if (system) { - for (p = 0; p < settings->uints.input_max_users; p++) + for (p = 0; p < max_users; p++) { for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 4; retro_id++) { @@ -4925,12 +4925,15 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) PARSE_ONLY_UINT, false) != -1) count++; - for(user = 0; user < settings->uints.input_max_users; user++) { - if (menu_displaylist_parse_settings_enum(menu, info, - (enum msg_hash_enums)(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user), - PARSE_ONLY_BOOL, false) != -1) - count++; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + for(user = 0; user < max_users; user++) + { + if (menu_displaylist_parse_settings_enum(menu, info, + (enum msg_hash_enums)(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user), + PARSE_ONLY_BOOL, false) != -1) + count++; + } } if (menu_displaylist_parse_settings_enum(menu, info, @@ -5381,7 +5384,8 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) { unsigned user; - for (user = 0; user < settings->uints.input_max_users; user++) + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + for (user = 0; user < max_users; user++) { menu_displaylist_parse_settings_enum(menu, info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_USER_1_BINDS + user), diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 5229ba9801..66afd2652c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1246,6 +1246,7 @@ static int setting_action_left_bind_device(void *data, bool wraparound) { unsigned index_offset; unsigned *p = NULL; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); rarch_setting_t *setting = (rarch_setting_t*)data; settings_t *settings = config_get_ptr(); @@ -1256,8 +1257,8 @@ static int setting_action_left_bind_device(void *data, bool wraparound) p = &settings->uints.input_joypad_map[index_offset]; - if ((*p) >= settings->uints.input_max_users) - *p = settings->uints.input_max_users - 1; + if ((*p) >= max_users) + *p = max_users - 1; else if ((*p) > 0) (*p)--; @@ -1268,6 +1269,7 @@ static int setting_action_right_bind_device(void *data, bool wraparound) { unsigned index_offset; unsigned *p = NULL; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); rarch_setting_t *setting = (rarch_setting_t*)data; settings_t *settings = config_get_ptr(); @@ -1278,7 +1280,7 @@ static int setting_action_right_bind_device(void *data, bool wraparound) p = &settings->uints.input_joypad_map[index_offset]; - if (*p < settings->uints.input_max_users) + if (*p < max_users) (*p)++; return 0; @@ -1405,6 +1407,7 @@ static void get_string_representation_bind_device(void * data, char *s, size_t len) { unsigned index_offset, map = 0; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); rarch_setting_t *setting = (rarch_setting_t*)data; settings_t *settings = config_get_ptr(); @@ -1414,7 +1417,7 @@ static void get_string_representation_bind_device(void * data, char *s, index_offset = setting->index_offset; map = settings->uints.input_joypad_map[index_offset]; - if (map < settings->uints.input_max_users) + if (map < max_users) { const char *device_name = input_config_get_device_name(map); @@ -4037,7 +4040,7 @@ static bool setting_append_list( CONFIG_UINT( list, list_info, - &settings->uints.input_max_users, + input_driver_get_uint(INPUT_ACTION_MAX_USERS), MENU_ENUM_LABEL_INPUT_MAX_USERS, MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, input_max_users, @@ -6055,31 +6058,34 @@ static bool setting_append_list( settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED); /* TODO/FIXME - add enum_idx */ - for(user = 0; user < settings->uints.input_max_users; user++) { - char s1[64], s2[64]; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + for(user = 0; user < max_users; user++) + { + char s1[64], s2[64]; - snprintf(s1, sizeof(s1), "%s_user_p%d", msg_hash_to_str(MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE), user + 1); - snprintf(s2, sizeof(s2), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE), user + 1); + snprintf(s1, sizeof(s1), "%s_user_p%d", msg_hash_to_str(MENU_ENUM_LABEL_NETWORK_REMOTE_ENABLE), user + 1); + snprintf(s2, sizeof(s2), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE), user + 1); - CONFIG_BOOL_ALT( - list, list_info, - &settings->bools.network_remote_enable_user[user], - /* todo: figure out this value, it's working fine but I don't think this is correct */ - strdup(s1), - strdup(s2), - 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_ADVANCED); - settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT); - menu_settings_list_current_add_enum_idx(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user)); + CONFIG_BOOL_ALT( + list, list_info, + &settings->bools.network_remote_enable_user[user], + /* todo: figure out this value, it's working fine but I don't think this is correct */ + strdup(s1), + strdup(s2), + 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_ADVANCED); + settings_data_list_current_add_free_flags(list, list_info, SD_FREE_FLAG_NAME | SD_FREE_FLAG_SHORT); + menu_settings_list_current_add_enum_idx(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_NETWORK_REMOTE_USER_1_ENABLE + user)); + } } CONFIG_BOOL( diff --git a/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index 0e23e163f1..79bf82248c 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -347,12 +347,12 @@ static bool menu_input_key_bind_poll_find_trigger( struct menu_bind_state *new_state) { unsigned i; - settings_t *settings = config_get_ptr(); + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); if (!state || !new_state) return false; - for (i = 0; i < settings->uints.input_max_users; i++) + for (i = 0; i < max_users; i++) { if (!menu_input_key_bind_poll_find_trigger_pad( state, new_state, i)) diff --git a/runloop.c b/runloop.c index 0e3a8dc44f..68b574317a 100644 --- a/runloop.c +++ b/runloop.c @@ -1085,7 +1085,7 @@ int runloop_iterate(unsigned *sleep_ms) #else bool menu_is_alive = false; #endif - unsigned max_users = settings->uints.input_max_users; + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); uint64_t current_input = #ifdef HAVE_MENU diff --git a/tasks/task_autodetect.c b/tasks/task_autodetect.c index 000e72d3c7..ff917c9230 100644 --- a/tasks/task_autodetect.c +++ b/tasks/task_autodetect.c @@ -453,7 +453,7 @@ bool input_autoconfigure_connect( state->idx = idx; state->vid = vid; state->pid = pid; - state->max_users = settings->uints.input_max_users; + state->max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); input_config_set_device_name(state->idx, state->name); input_config_set_pid(state->idx, state->pid); From cc9e951b44183a779baacaa4d6fdff153d475a4a Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Thu, 11 May 2017 07:37:20 +0200 Subject: [PATCH 030/274] Cleanup --- input/input_driver.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 212931a5dc..1833280e8b 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1206,12 +1206,8 @@ void input_driver_deinit_remote(void) { #ifdef HAVE_NETWORKGAMEPAD if (input_driver_remote) - { - settings_t *settings = config_get_ptr(); - input_remote_free(input_driver_remote, input_driver_max_users); - } input_driver_remote = NULL; #endif } From 42ebe7a7ad3d2b148e9c6c13b34f89ffe56d5c5b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 11 May 2017 09:11:46 +0200 Subject: [PATCH 031/274] Merge runloop.c and retroarch.c --- Makefile.common | 1 - audio/audio_driver.c | 1 - camera/camera_driver.c | 1 - cheevos/cheevos.c | 2 +- command.c | 2 +- configuration.c | 1 - core_info.c | 2 +- dirs.c | 2 +- driver.c | 2 +- dynamic.c | 1 - frontend/drivers/platform_darwin.m | 2 +- frontend/drivers/platform_emscripten.c | 1 - frontend/drivers/platform_wiiu.c | 2 +- frontend/drivers/platform_win32.c | 2 +- frontend/frontend.c | 2 +- gfx/common/win32_common.cpp | 2 +- gfx/video_driver.c | 1 - gfx/video_thread_wrapper.c | 2 +- griffin/griffin.c | 1 - input/drivers_keyboard/keyboard_event_apple.c | 2 +- .../drivers_keyboard/keyboard_event_win32.cpp | 2 +- input/input_keyboard.c | 6 +- input/input_remapping.c | 1 - location/location_driver.c | 1 - managers/cheat_manager.c | 2 +- menu/cbs/menu_cbs_deferred_push.c | 2 +- menu/cbs/menu_cbs_get_value.c | 2 +- menu/cbs/menu_cbs_left.c | 1 - menu/cbs/menu_cbs_ok.c | 1 - menu/cbs/menu_cbs_right.c | 1 - menu/cbs/menu_cbs_start.c | 1 - menu/drivers/materialui.c | 1 - menu/drivers/nuklear.c | 2 +- menu/drivers/rgui.c | 2 +- menu/drivers/xmb.c | 2 +- menu/drivers/xui.cpp | 2 +- menu/drivers/zarch.c | 2 +- menu/menu_display.c | 1 - menu/menu_displaylist.c | 1 - menu/menu_driver.c | 1 - menu/menu_entries.c | 2 +- menu/menu_setting.c | 1 - movie.c | 1 - network/httpserver/httpserver.c | 2 +- network/netplay/netplay_discovery.c | 2 +- network/netplay/netplay_frontend.c | 6 +- network/netplay/netplay_handshake.c | 1 - network/netplay/netplay_init.c | 2 +- network/netplay/netplay_io.c | 2 +- paths.c | 1 - performance_counters.c | 2 +- record/record_driver.c | 1 - retroarch.c | 1177 +++++++++++++++- retroarch.h | 195 ++- runloop.c | 1233 ----------------- runloop.h | 222 --- tasks/task_content.c | 1 - tasks/task_database.c | 2 +- tasks/task_netplay_find_content.c | 2 +- tasks/task_screenshot.c | 2 +- ui/drivers/cocoa/cocoatouch_menu.m | 2 +- ui/drivers/ui_cocoa.m | 1 - ui/drivers/ui_cocoatouch.m | 2 +- ui/drivers/ui_qt.cpp | 2 +- ui/drivers/ui_win32.c | 2 +- ui/drivers/win32/ui_win32_window.cpp | 2 +- wifi/drivers/connmanctl.c | 2 +- 67 files changed, 1412 insertions(+), 1524 deletions(-) delete mode 100644 runloop.c delete mode 100644 runloop.h diff --git a/Makefile.common b/Makefile.common index 3d86328675..bd46db375e 100644 --- a/Makefile.common +++ b/Makefile.common @@ -160,7 +160,6 @@ OBJ += frontend/frontend.o \ command.o \ msg_hash.o \ intl/msg_hash_us.o \ - runloop.o \ $(LIBRETRO_COMM_DIR)/queues/task_queue.o \ tasks/task_content.o \ tasks/task_save.o \ diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 1333d5352e..3750dc8f0b 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -41,7 +41,6 @@ #include "../driver.h" #include "../configuration.h" #include "../retroarch.h" -#include "../runloop.h" #include "../verbosity.h" #include "../list_special.h" diff --git a/camera/camera_driver.c b/camera/camera_driver.c index ce35c4797b..34a5a31d88 100644 --- a/camera/camera_driver.c +++ b/camera/camera_driver.c @@ -25,7 +25,6 @@ #include "../configuration.h" #include "../driver.h" #include "../retroarch.h" -#include "../runloop.h" #include "../list_special.h" #include "../verbosity.h" diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 60379436a6..f3ff53455d 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -38,7 +38,7 @@ #include "../configuration.h" #include "../performance_counters.h" #include "../msg_hash.h" -#include "../runloop.h" +#include "../retroarch.h" #include "../core.h" #include "../network/net_http_special.h" diff --git a/command.c b/command.c index 83ceb28e04..bd5af8a8d9 100644 --- a/command.c +++ b/command.c @@ -87,7 +87,7 @@ #include "core.h" #include "verbosity.h" -#include "runloop.h" +#include "retroarch.h" #include "configuration.h" #include "input/input_remapping.h" diff --git a/configuration.c b/configuration.c index 00d816d859..b7b516ecc5 100644 --- a/configuration.c +++ b/configuration.c @@ -44,7 +44,6 @@ #include "dirs.h" #include "paths.h" #include "retroarch.h" -#include "runloop.h" #include "verbosity.h" #include "lakka.h" diff --git a/core_info.c b/core_info.c index 749ae7ec55..9376b797d5 100644 --- a/core_info.c +++ b/core_info.c @@ -27,7 +27,7 @@ #include "config.h" #endif -#include "runloop.h" +#include "retroarch.h" #include "verbosity.h" #include "config.def.h" diff --git a/dirs.c b/dirs.c index c830af1f20..d41cc5bc6a 100644 --- a/dirs.c +++ b/dirs.c @@ -32,7 +32,7 @@ #include "msg_hash.h" #include "paths.h" #include "content.h" -#include "runloop.h" +#include "retroarch.h" #include "verbosity.h" struct rarch_dir_list diff --git a/driver.c b/driver.c index 9ab8c2fe9a..494d18302f 100644 --- a/driver.c +++ b/driver.c @@ -40,7 +40,7 @@ #include "core.h" #include "core_info.h" #include "driver.h" -#include "runloop.h" +#include "retroarch.h" #include "verbosity.h" #define HASH_LOCATION_DRIVER 0x09189689U diff --git a/dynamic.c b/dynamic.c index 7928715481..c0be244829 100644 --- a/dynamic.c +++ b/dynamic.c @@ -58,7 +58,6 @@ #include "dirs.h" #include "paths.h" #include "retroarch.h" -#include "runloop.h" #include "configuration.h" #include "msg_hash.h" #include "verbosity.h" diff --git a/frontend/drivers/platform_darwin.m b/frontend/drivers/platform_darwin.m index 36e0f0449f..a0787d967c 100644 --- a/frontend/drivers/platform_darwin.m +++ b/frontend/drivers/platform_darwin.m @@ -60,7 +60,7 @@ #include "../../file_path_special.h" #include "../../configuration.h" #include "../../defaults.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../ui/ui_companion_driver.h" diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index e1f6b66955..481e0dc849 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -37,7 +37,6 @@ #include "../../defaults.h" #include "../../content.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../command.h" #include "../../tasks/tasks_internal.h" #include "../../file_path_special.h" diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index 955a7f82d1..822c437d1d 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -37,7 +37,7 @@ #include "tasks/tasks_internal.h" -#include "runloop.h" +#include "../../retroarch.h" #include #include "fs/fs_utils.h" #include "fs/sd_fat_devoptab.h" diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index d62df7c9c4..f294186ceb 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -37,7 +37,7 @@ #include "../frontend_driver.h" #include "../../configuration.h" #include "../../defaults.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* We only load this library once, so we let it be diff --git a/frontend/frontend.c b/frontend/frontend.c index 82d7ba1f9f..13eacec33e 100644 --- a/frontend/frontend.c +++ b/frontend/frontend.c @@ -36,7 +36,7 @@ #include "../retroarch.h" #ifndef HAVE_MAIN -#include "../runloop.h" +#include "../retroarch.h" #endif /** diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 05cbd428d0..d900882a53 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -26,7 +26,7 @@ #include "../../verbosity.h" #include "../../driver.h" #include "../../paths.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../tasks/tasks_internal.h" #include "../../core_info.h" diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 7e2f630079..96ee681a97 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -52,7 +52,6 @@ #include "../configuration.h" #include "../driver.h" #include "../retroarch.h" -#include "../runloop.h" #include "../input/input_driver.h" #include "../list_special.h" #include "../core.h" diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index f573e397aa..c3995aaed4 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -26,7 +26,7 @@ #include "font_driver.h" #include "video_shader_driver.h" -#include "../runloop.h" +#include "../retroarch.h" #include "../verbosity.h" enum thread_cmd diff --git a/griffin/griffin.c b/griffin/griffin.c index b1a513415d..b53d7783cb 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -832,7 +832,6 @@ RETROARCH #include "../retroarch.c" #include "../dirs.c" #include "../paths.c" -#include "../runloop.c" #include "../libretro-common/queues/task_queue.c" #include "../msg_hash.c" diff --git a/input/drivers_keyboard/keyboard_event_apple.c b/input/drivers_keyboard/keyboard_event_apple.c index 507d8640b9..4373204562 100644 --- a/input/drivers_keyboard/keyboard_event_apple.c +++ b/input/drivers_keyboard/keyboard_event_apple.c @@ -25,8 +25,8 @@ #include "../input_keymaps.h" #include "../input_keyboard.h" -#include "../../runloop.h" #include "../../driver.h" +#include "../../retroarch.h" #include "keyboard_event_apple.h" diff --git a/input/drivers_keyboard/keyboard_event_win32.cpp b/input/drivers_keyboard/keyboard_event_win32.cpp index 936607cba9..e81d365838 100644 --- a/input/drivers_keyboard/keyboard_event_win32.cpp +++ b/input/drivers_keyboard/keyboard_event_win32.cpp @@ -21,7 +21,7 @@ #include "../input_config.h" #include "../input_keymaps.h" #include "../input_keyboard.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../gfx/common/win32_common.h" LRESULT win32_handle_keyboard_event(HWND hwnd, UINT message, diff --git a/input/input_keyboard.c b/input/input_keyboard.c index ddf97e9a73..1a85e21f3f 100644 --- a/input/input_keyboard.c +++ b/input/input_keyboard.c @@ -19,13 +19,13 @@ #include #include +#include + #include "input_keyboard.h" #include "input_driver.h" -#include - -#include "../runloop.h" +#include "../retroarch.h" struct input_keyboard_line { diff --git a/input/input_remapping.c b/input/input_remapping.c index 5dfccaa040..17aae07ab3 100644 --- a/input/input_remapping.c +++ b/input/input_remapping.c @@ -22,7 +22,6 @@ #include "input_remapping.h" #include "../configuration.h" #include "../retroarch.h" -#include "../runloop.h" /** * input_remapping_load_file: diff --git a/location/location_driver.c b/location/location_driver.c index d1dd32d782..193f36c90b 100644 --- a/location/location_driver.c +++ b/location/location_driver.c @@ -26,7 +26,6 @@ #include "../core.h" #include "../driver.h" #include "../retroarch.h" -#include "../runloop.h" #include "../list_special.h" #include "../verbosity.h" diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index 10d4974d51..b0e824f3b1 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -36,7 +36,7 @@ #include "cheat_manager.h" #include "../msg_hash.h" -#include "../runloop.h" +#include "../retroarch.h" #include "../dynamic.h" #include "../core.h" #include "../verbosity.h" diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index bc159d93f0..0ff2f66845 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -33,7 +33,7 @@ #include "../../configuration.h" #include "../../core.h" #include "../../core_info.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../verbosity.h" #ifndef BIND_ACTION_DEFERRED_PUSH diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index 2b5e775f24..778339bdf9 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -39,7 +39,7 @@ #include "../../managers/cheat_manager.h" #include "../../performance_counters.h" #include "../../paths.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../wifi/wifi_driver.h" #ifndef BIND_ACTION_GET_VALUE diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 3f7210ad67..112977a96e 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -38,7 +38,6 @@ #include "../../managers/cheat_manager.h" #include "../../file_path_special.h" #include "../../retroarch.h" -#include "../../runloop.h" #ifndef BIND_ACTION_LEFT #define BIND_ACTION_LEFT(cbs, name) \ diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 036c31efa6..66e0e0118e 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -48,7 +48,6 @@ #include "../../input/input_remapping.h" #include "../../paths.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../verbosity.h" #include "../../lakka.h" #include "../../wifi/wifi_driver.h" diff --git a/menu/cbs/menu_cbs_right.c b/menu/cbs/menu_cbs_right.c index 1f2b05a302..c8bdfacd4c 100644 --- a/menu/cbs/menu_cbs_right.c +++ b/menu/cbs/menu_cbs_right.c @@ -38,7 +38,6 @@ #include "../../managers/cheat_manager.h" #include "../../file_path_special.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../ui/ui_companion_driver.h" #ifndef BIND_ACTION_RIGHT diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index 0c07b0656d..6deacaa7fa 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -34,7 +34,6 @@ #include "../../managers/core_option_manager.h" #include "../../managers/cheat_manager.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../performance_counters.h" #include "../../gfx/video_shader_driver.h" diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 02b68e5580..c0374cc2af 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -54,7 +54,6 @@ #include "../../core.h" #include "../../configuration.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../verbosity.h" #include "../../tasks/tasks_internal.h" diff --git a/menu/drivers/nuklear.c b/menu/drivers/nuklear.c index 8d0dcc773b..7a0e119be4 100644 --- a/menu/drivers/nuklear.c +++ b/menu/drivers/nuklear.c @@ -44,7 +44,7 @@ #include "../../core_info.h" #include "../../configuration.h" #include "../../frontend/frontend_driver.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../tasks/tasks_internal.h" diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index eea6d6d7eb..c4b759b41c 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -46,7 +46,7 @@ #include "../widgets/menu_input_dialog.h" #include "../../configuration.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../gfx/drivers_font_renderer/bitmap.h" #define RGUI_TERM_START_X(width) (width / 21) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 09b72eab23..91f1131c25 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -57,7 +57,7 @@ #include "../../configuration.h" #include "../../retroarch.h" #include "../../playlist.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../tasks/tasks_internal.h" diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index 03fe13f12e..a9f3f89fb1 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -43,7 +43,7 @@ #include "../../gfx/video_driver.h" #include "../../configuration.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../gfx/drivers/d3d.h" diff --git a/menu/drivers/zarch.c b/menu/drivers/zarch.c index 497adb73ac..8b7ce607c7 100644 --- a/menu/drivers/zarch.c +++ b/menu/drivers/zarch.c @@ -50,7 +50,7 @@ #include "../../core_info.h" #include "../../configuration.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../tasks/tasks_internal.h" diff --git a/menu/menu_display.c b/menu/menu_display.c index 05576bb547..a2913fa5fc 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -35,7 +35,6 @@ #include "../config.def.h" #include "../retroarch.h" #include "../configuration.h" -#include "../runloop.h" #include "../core.h" #include "../gfx/video_driver.h" #include "../gfx/video_thread_wrapper.h" diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index f005dc708b..dda0f6a537 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -65,7 +65,6 @@ #include "../managers/core_option_manager.h" #include "../paths.h" #include "../retroarch.h" -#include "../runloop.h" #include "../core.h" #include "../frontend/frontend_driver.h" #include "../ui/ui_companion_driver.h" diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 6060df062f..9b19644a09 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -45,7 +45,6 @@ #include "../list_special.h" #include "../tasks/tasks_internal.h" #include "../ui/ui_companion_driver.h" -#include "../runloop.h" #include "../verbosity.h" static const menu_ctx_driver_t *menu_ctx_drivers[] = { diff --git a/menu/menu_entries.c b/menu/menu_entries.c index 413e7f745f..1bb745120c 100644 --- a/menu/menu_entries.c +++ b/menu/menu_entries.c @@ -27,7 +27,7 @@ #include "widgets/menu_list.h" #include "../core.h" -#include "../runloop.h" +#include "../retroarch.h" #include "../version.h" void menu_entries_get_at_offset(const file_list_t *list, size_t idx, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 66afd2652c..37594d6f0e 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -67,7 +67,6 @@ #include "../paths.h" #include "../dynamic.h" #include "../list_special.h" -#include "../runloop.h" #include "../verbosity.h" #include "../camera/camera_driver.h" #include "../wifi/wifi_driver.h" diff --git a/movie.c b/movie.c index db91d37f06..4034ee3712 100644 --- a/movie.c +++ b/movie.c @@ -27,7 +27,6 @@ #include "core.h" #include "content.h" #include "retroarch.h" -#include "runloop.h" #include "msg_hash.h" #include "verbosity.h" diff --git a/network/httpserver/httpserver.c b/network/httpserver/httpserver.c index 77b7c79a16..7844230b99 100644 --- a/network/httpserver/httpserver.c +++ b/network/httpserver/httpserver.c @@ -25,7 +25,7 @@ #include #include "../../core.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../core.h" #include "../../gfx/video_driver.h" #include "../../managers/core_option_manager.h" diff --git a/network/netplay/netplay_discovery.c b/network/netplay/netplay_discovery.c index 36d720fde4..8d45a86a3e 100644 --- a/network/netplay/netplay_discovery.c +++ b/network/netplay/netplay_discovery.c @@ -43,7 +43,7 @@ #include #include -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../version.h" #include "netplay.h" #include "netplay_discovery.h" diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 2c471f063b..56543d3a91 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -24,17 +24,17 @@ #include #include +#include + #include "netplay_private.h" #include "../../configuration.h" #include "../../input/input_driver.h" -#include "../../runloop.h" - #include "../../tasks/tasks_internal.h" -#include #include "../../file_path_special.h" #include "../../paths.h" #include "../../command.h" +#include "../../retroarch.h" /* Only used before init_netplay */ static bool netplay_enabled = false; diff --git a/network/netplay/netplay_handshake.c b/network/netplay/netplay_handshake.c index 95464ae402..7ff75230ab 100644 --- a/network/netplay/netplay_handshake.c +++ b/network/netplay/netplay_handshake.c @@ -33,7 +33,6 @@ #include "../../configuration.h" #include "../../content.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../version.h" #include "../../input/input_config.h" diff --git a/network/netplay/netplay_init.c b/network/netplay/netplay_init.c index cf02a2d001..6325918f7e 100644 --- a/network/netplay/netplay_init.c +++ b/network/netplay/netplay_init.c @@ -31,7 +31,7 @@ #include "netplay_discovery.h" #include "../../autosave.h" -#include "../../runloop.h" +#include "../../retroarch.h" #if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) #define HAVE_INET6 1 diff --git a/network/netplay/netplay_io.c b/network/netplay/netplay_io.c index f1106dad1d..fdba8ebf74 100644 --- a/network/netplay/netplay_io.c +++ b/network/netplay/netplay_io.c @@ -25,7 +25,7 @@ #include "netplay_private.h" #include "../../configuration.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../tasks/tasks_internal.h" #if 0 diff --git a/paths.c b/paths.c index 3752c9193b..fd36464cc4 100644 --- a/paths.c +++ b/paths.c @@ -42,7 +42,6 @@ #include "core.h" #include "msg_hash.h" #include "retroarch.h" -#include "runloop.h" #include "verbosity.h" #include "tasks/tasks_internal.h" diff --git a/performance_counters.c b/performance_counters.c index e1661ffcc6..0b275fc2e7 100644 --- a/performance_counters.c +++ b/performance_counters.c @@ -27,7 +27,7 @@ #include "performance_counters.h" -#include "runloop.h" +#include "retroarch.h" #include "verbosity.h" #ifdef _WIN32 diff --git a/record/record_driver.c b/record/record_driver.c index 5adb9842db..467d24e9d5 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -31,7 +31,6 @@ #include "../driver.h" #include "../gfx/video_driver.h" #include "../retroarch.h" -#include "../runloop.h" #include "../verbosity.h" #include "../msg_hash.h" #include "../list_special.h" diff --git a/retroarch.c b/retroarch.c index 259827db50..045fc7fc93 100644 --- a/retroarch.c +++ b/retroarch.c @@ -25,11 +25,13 @@ #endif #include +#include #include #include #include #include #include +#include #include #include @@ -42,6 +44,8 @@ #include #include #include +#include +#include #include #include @@ -55,33 +59,55 @@ #ifdef HAVE_MENU #include "menu/menu_driver.h" +#include "menu/menu_display.h" +#include "menu/menu_event.h" +#include "menu/widgets/menu_dialog.h" +#endif + +#ifdef HAVE_CHEEVOS +#include "cheevos/cheevos.h" #endif #ifdef HAVE_NETWORKING #include "network/netplay/netplay.h" #endif +#if defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB) +#include "network/httpserver/httpserver.h" +#endif + +#ifdef HAVE_THREADS +#include +#endif + +#include "autosave.h" #include "config.features.h" #include "content.h" #include "core_type.h" #include "core_info.h" #include "dynamic.h" #include "driver.h" +#include "input/input_driver.h" #include "input/input_config.h" +#include "input/input_keyboard.h" #include "msg_hash.h" #include "movie.h" #include "dirs.h" #include "paths.h" #include "file_path_special.h" +#include "ui/ui_companion_driver.h" #include "verbosity.h" #include "frontend/frontend_driver.h" #include "audio/audio_driver.h" +#include "camera/camera_driver.h" #include "record/record_driver.h" #include "core.h" #include "configuration.h" -#include "runloop.h" +#include "list_special.h" +#include "managers/core_option_manager.h" #include "managers/cheat_manager.h" +#include "managers/state_manager.h" #include "tasks/tasks_internal.h" #include "version.h" @@ -98,6 +124,15 @@ retroarch_fail(1, "validate_cpu_features()"); \ } while(0) +#ifdef HAVE_ZLIB +#define DEFAULT_EXT "zip" +#else +#define DEFAULT_EXT "" +#endif + +#define runloop_cmd_triggered(trigger_input, id) (BIT64_GET(trigger_input, id)) +#define runloop_cmd_pressed(old_input, id) (BIT64_GET(old_input, id)) + /* Descriptive names for options without short variant. * * Please keep the name in sync with the option name. @@ -125,6 +160,24 @@ enum RA_OPT_MAX_FRAMES }; +enum runloop_state +{ + RUNLOOP_STATE_NONE = 0, + RUNLOOP_STATE_ITERATE, + RUNLOOP_STATE_SLEEP, + RUNLOOP_STATE_MENU_ITERATE, + RUNLOOP_STATE_END, + RUNLOOP_STATE_QUIT +}; + +typedef struct runloop_ctx_msg_info +{ + const char *msg; + unsigned prio; + unsigned duration; + bool flush; +} runloop_ctx_msg_info_t; + static jmp_buf error_sjlj_context; static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN; static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN; @@ -151,6 +204,33 @@ static bool has_set_ups_pref = false; static bool has_set_bps_pref = false; static bool has_set_ips_pref = false; +static rarch_system_info_t runloop_system; +static struct retro_frame_time_callback runloop_frame_time; +static retro_keyboard_event_t runloop_key_event = NULL; +static retro_keyboard_event_t runloop_frontend_key_event = NULL; +static core_option_manager_t *runloop_core_options = NULL; +#ifdef HAVE_THREADS +static slock_t *_runloop_msg_queue_lock = NULL; +#endif +static msg_queue_t *runloop_msg_queue = NULL; +static unsigned runloop_pending_windowed_scale = 0; +static retro_usec_t runloop_frame_time_last = 0; +static unsigned runloop_max_frames = false; +static bool runloop_force_nonblock = false; +static bool runloop_paused = false; +static bool runloop_idle = false; +static bool runloop_exec = false; +static bool runloop_slowmotion = false; +static bool runloop_shutdown_initiated = false; +static bool runloop_core_shutdown_initiated = false; +static bool runloop_perfcnt_enable = false; +static bool runloop_overrides_active = false; +static bool runloop_game_options_active = false; +static bool runloop_missing_bios = false; +static bool runloop_autosave = false; +static retro_time_t frame_limit_minimum_time = 0.0; +static retro_time_t frame_limit_last_time = 0.0; + static void retroarch_print_features(void) { puts(""); @@ -1683,3 +1763,1098 @@ bool retroarch_main_quit(void) return true; } + +global_t *global_get_ptr(void) +{ + static struct global g_extern; + return &g_extern; +} + +void runloop_msg_queue_push(const char *msg, + unsigned prio, unsigned duration, + bool flush) +{ + runloop_ctx_msg_info_t msg_info; + +#ifdef HAVE_THREADS + slock_lock(_runloop_msg_queue_lock); +#endif + + if (flush) + msg_queue_clear(runloop_msg_queue); + + msg_info.msg = msg; + msg_info.prio = prio; + msg_info.duration = duration; + msg_info.flush = flush; + + if (runloop_msg_queue) + { + msg_queue_push(runloop_msg_queue, msg_info.msg, + msg_info.prio, msg_info.duration); + + if (ui_companion_is_on_foreground()) + { + const ui_companion_driver_t *ui = ui_companion_get_ptr(); + if (ui->msg_queue_push) + ui->msg_queue_push(msg_info.msg, + msg_info.prio, msg_info.duration, msg_info.flush); + } + } + +#ifdef HAVE_THREADS + slock_unlock(_runloop_msg_queue_lock); +#endif +} + +/** + * rarch_game_specific_options: + * + * Returns: true (1) if a game specific core + * options path has been found, + * otherwise false (0). + **/ +static bool rarch_game_specific_options(char **output) +{ + char game_path[8192]; + + game_path[0] ='\0'; + + if (!retroarch_validate_game_options(game_path, + sizeof(game_path), false)) + return false; + + if (!config_file_exists(game_path)) + return false; + + RARCH_LOG("%s %s\n", + msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), + game_path); + *output = strdup(game_path); + return true; +} + +void runloop_get_status(bool *is_paused, bool *is_idle, + bool *is_slowmotion, bool *is_perfcnt_enable) +{ + *is_paused = runloop_paused; + *is_idle = runloop_idle; + *is_slowmotion = runloop_slowmotion; + *is_perfcnt_enable = runloop_perfcnt_enable; +} + +bool runloop_msg_queue_pull(const char **ret) +{ + if (!ret) + return false; +#ifdef HAVE_THREADS + slock_lock(_runloop_msg_queue_lock); +#endif + *ret = msg_queue_pull(runloop_msg_queue); +#ifdef HAVE_THREADS + slock_unlock(_runloop_msg_queue_lock); +#endif + return true; +} + +bool runloop_ctl(enum runloop_ctl_state state, void *data) +{ + + switch (state) + { + case RUNLOOP_CTL_SYSTEM_INFO_INIT: + core_get_system_info(&runloop_system.info); + + if (!runloop_system.info.library_name) + runloop_system.info.library_name = msg_hash_to_str(MSG_UNKNOWN); + if (!runloop_system.info.library_version) + runloop_system.info.library_version = "v0"; + + video_driver_set_title_buf(); + + strlcpy(runloop_system.valid_extensions, + runloop_system.info.valid_extensions ? + runloop_system.info.valid_extensions : DEFAULT_EXT, + sizeof(runloop_system.valid_extensions)); + break; + case RUNLOOP_CTL_GET_CORE_OPTION_SIZE: + { + unsigned *idx = (unsigned*)data; + if (!idx) + return false; + *idx = (unsigned)core_option_manager_size(runloop_core_options); + } + break; + case RUNLOOP_CTL_HAS_CORE_OPTIONS: + return runloop_core_options; + case RUNLOOP_CTL_CORE_OPTIONS_LIST_GET: + { + core_option_manager_t **coreopts = (core_option_manager_t**)data; + if (!coreopts) + return false; + *coreopts = runloop_core_options; + } + break; + case RUNLOOP_CTL_SYSTEM_INFO_FREE: + + /* No longer valid. */ + if (runloop_system.subsystem.data) + free(runloop_system.subsystem.data); + runloop_system.subsystem.data = NULL; + runloop_system.subsystem.size = 0; + + if (runloop_system.ports.data) + free(runloop_system.ports.data); + runloop_system.ports.data = NULL; + runloop_system.ports.size = 0; + + if (runloop_system.mmaps.descriptors) + free((void *)runloop_system.mmaps.descriptors); + runloop_system.mmaps.descriptors = NULL; + runloop_system.mmaps.num_descriptors = 0; + + runloop_key_event = NULL; + runloop_frontend_key_event = NULL; + + audio_driver_unset_callback(); + memset(&runloop_system, 0, sizeof(rarch_system_info_t)); + break; + case RUNLOOP_CTL_SET_FRAME_TIME_LAST: + runloop_frame_time_last = 0; + break; + case RUNLOOP_CTL_SET_OVERRIDES_ACTIVE: + runloop_overrides_active = true; + break; + case RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE: + runloop_overrides_active = false; + break; + case RUNLOOP_CTL_IS_OVERRIDES_ACTIVE: + return runloop_overrides_active; + case RUNLOOP_CTL_SET_MISSING_BIOS: + runloop_missing_bios = true; + break; + case RUNLOOP_CTL_UNSET_MISSING_BIOS: + runloop_missing_bios = false; + break; + case RUNLOOP_CTL_IS_MISSING_BIOS: + return runloop_missing_bios; + case RUNLOOP_CTL_IS_GAME_OPTIONS_ACTIVE: + return runloop_game_options_active; + case RUNLOOP_CTL_SET_FRAME_LIMIT: + { + settings_t *settings = config_get_ptr(); + struct retro_system_av_info *av_info = + video_viewport_get_system_av_info(); + float fastforward_ratio = + (settings->floats.fastforward_ratio == 0.0f) + ? 1.0f : settings->floats.fastforward_ratio; + + frame_limit_last_time = cpu_features_get_time_usec(); + frame_limit_minimum_time = (retro_time_t)roundf(1000000.0f + / (av_info->timing.fps * fastforward_ratio)); + } + break; + case RUNLOOP_CTL_GET_PERFCNT: + { + bool **perfcnt = (bool**)data; + if (!perfcnt) + return false; + *perfcnt = &runloop_perfcnt_enable; + } + break; + case RUNLOOP_CTL_SET_PERFCNT_ENABLE: + runloop_perfcnt_enable = true; + break; + case RUNLOOP_CTL_UNSET_PERFCNT_ENABLE: + runloop_perfcnt_enable = false; + break; + case RUNLOOP_CTL_IS_PERFCNT_ENABLE: + return runloop_perfcnt_enable; + case RUNLOOP_CTL_SET_NONBLOCK_FORCED: + runloop_force_nonblock = true; + break; + case RUNLOOP_CTL_UNSET_NONBLOCK_FORCED: + runloop_force_nonblock = false; + break; + case RUNLOOP_CTL_IS_NONBLOCK_FORCED: + return runloop_force_nonblock; + case RUNLOOP_CTL_SET_FRAME_TIME: + { + const struct retro_frame_time_callback *info = + (const struct retro_frame_time_callback*)data; +#ifdef HAVE_NETWORKING + /* retro_run() will be called in very strange and + * mysterious ways, have to disable it. */ + if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL)) + return false; +#endif + runloop_frame_time = *info; + } + break; + case RUNLOOP_CTL_GET_WINDOWED_SCALE: + { + unsigned **scale = (unsigned**)data; + if (!scale) + return false; + *scale = (unsigned*)&runloop_pending_windowed_scale; + } + break; + case RUNLOOP_CTL_SET_WINDOWED_SCALE: + { + unsigned *idx = (unsigned*)data; + if (!idx) + return false; + runloop_pending_windowed_scale = *idx; + } + break; + case RUNLOOP_CTL_SET_LIBRETRO_PATH: + return path_set(RARCH_PATH_CORE, (const char*)data); + case RUNLOOP_CTL_FRAME_TIME_FREE: + memset(&runloop_frame_time, 0, + sizeof(struct retro_frame_time_callback)); + runloop_frame_time_last = 0; + runloop_max_frames = 0; + break; + case RUNLOOP_CTL_STATE_FREE: + runloop_perfcnt_enable = false; + runloop_idle = false; + runloop_paused = false; + runloop_slowmotion = false; + runloop_overrides_active = false; + runloop_autosave = false; + runloop_ctl(RUNLOOP_CTL_FRAME_TIME_FREE, NULL); + break; + case RUNLOOP_CTL_GLOBAL_FREE: + { + global_t *global = NULL; + command_event(CMD_EVENT_TEMPORARY_CONTENT_DEINIT, NULL); + + path_deinit_subsystem(); + command_event(CMD_EVENT_RECORD_DEINIT, NULL); + command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); + + rarch_ctl(RARCH_CTL_UNSET_BLOCK_CONFIG_READ, NULL); + rarch_ctl(RARCH_CTL_UNSET_SRAM_LOAD_DISABLED, NULL); + rarch_ctl(RARCH_CTL_UNSET_SRAM_SAVE_DISABLED, NULL); + rarch_ctl(RARCH_CTL_UNSET_SRAM_ENABLE, NULL); + rarch_ctl(RARCH_CTL_UNSET_BPS_PREF, NULL); + rarch_ctl(RARCH_CTL_UNSET_IPS_PREF, NULL); + rarch_ctl(RARCH_CTL_UNSET_UPS_PREF, NULL); + rarch_ctl(RARCH_CTL_UNSET_PATCH_BLOCKED, NULL); + runloop_overrides_active = false; + + core_unset_input_descriptors(); + + global = global_get_ptr(); + path_clear_all(); + dir_clear_all(); + memset(global, 0, sizeof(struct global)); + retroarch_override_setting_free_state(); + } + break; + case RUNLOOP_CTL_CLEAR_STATE: + driver_ctl(RARCH_DRIVER_CTL_DEINIT, NULL); + runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL); + runloop_ctl(RUNLOOP_CTL_GLOBAL_FREE, NULL); + break; + case RUNLOOP_CTL_SET_MAX_FRAMES: + { + unsigned *ptr = (unsigned*)data; + if (!ptr) + return false; + runloop_max_frames = *ptr; + } + break; + case RUNLOOP_CTL_IS_IDLE: + return runloop_idle; + case RUNLOOP_CTL_SET_IDLE: + { + bool *ptr = (bool*)data; + if (!ptr) + return false; + runloop_idle = *ptr; + } + break; + case RUNLOOP_CTL_SET_PAUSED: + { + bool *ptr = (bool*)data; + if (!ptr) + return false; + runloop_paused = *ptr; + } + break; + case RUNLOOP_CTL_IS_PAUSED: + return runloop_paused; + case RUNLOOP_CTL_MSG_QUEUE_DEINIT: + if (!runloop_msg_queue) + return true; + +#ifdef HAVE_THREADS + slock_lock(_runloop_msg_queue_lock); +#endif + + msg_queue_free(runloop_msg_queue); + +#ifdef HAVE_THREADS + slock_unlock(_runloop_msg_queue_lock); +#endif + +#ifdef HAVE_THREADS + slock_free(_runloop_msg_queue_lock); + _runloop_msg_queue_lock = NULL; +#endif + + runloop_msg_queue = NULL; + break; + case RUNLOOP_CTL_MSG_QUEUE_INIT: + runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_DEINIT, NULL); + runloop_msg_queue = msg_queue_new(8); + retro_assert(runloop_msg_queue); + +#ifdef HAVE_THREADS + _runloop_msg_queue_lock = slock_new(); + retro_assert(_runloop_msg_queue_lock); +#endif + break; + case RUNLOOP_CTL_TASK_INIT: + { +#ifdef HAVE_THREADS + settings_t *settings = config_get_ptr(); + bool threaded_enable = settings->bools.threaded_data_runloop_enable; +#else + bool threaded_enable = false; +#endif + task_queue_deinit(); + task_queue_init(threaded_enable, runloop_msg_queue_push); + } + break; + case RUNLOOP_CTL_SET_CORE_SHUTDOWN: + runloop_core_shutdown_initiated = true; + break; + case RUNLOOP_CTL_SET_SHUTDOWN: + runloop_shutdown_initiated = true; + break; + case RUNLOOP_CTL_IS_SHUTDOWN: + return runloop_shutdown_initiated; + case RUNLOOP_CTL_DATA_DEINIT: + task_queue_deinit(); + break; + case RUNLOOP_CTL_IS_CORE_OPTION_UPDATED: + if (!runloop_core_options) + return false; + return core_option_manager_updated(runloop_core_options); + case RUNLOOP_CTL_CORE_OPTION_PREV: + { + unsigned *idx = (unsigned*)data; + if (!idx) + return false; + core_option_manager_prev(runloop_core_options, *idx); + if (ui_companion_is_on_foreground()) + ui_companion_driver_notify_refresh(); + } + break; + case RUNLOOP_CTL_CORE_OPTION_NEXT: + { + unsigned *idx = (unsigned*)data; + if (!idx) + return false; + core_option_manager_next(runloop_core_options, *idx); + if (ui_companion_is_on_foreground()) + ui_companion_driver_notify_refresh(); + } + break; + case RUNLOOP_CTL_CORE_OPTIONS_GET: + { + struct retro_variable *var = (struct retro_variable*)data; + + if (!runloop_core_options || !var) + return false; + + RARCH_LOG("Environ GET_VARIABLE %s:\n", var->key); + core_option_manager_get(runloop_core_options, var); + RARCH_LOG("\t%s\n", var->value ? var->value : + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); + } + break; + case RUNLOOP_CTL_CORE_OPTIONS_INIT: + { + settings_t *settings = config_get_ptr(); + char *game_options_path = NULL; + bool ret = false; + const struct retro_variable *vars = + (const struct retro_variable*)data; + + if (settings && settings->bools.game_specific_options) + ret = rarch_game_specific_options(&game_options_path); + + if(ret) + { + runloop_game_options_active = true; + runloop_core_options = + core_option_manager_new(game_options_path, vars); + free(game_options_path); + } + else + { + char buf[PATH_MAX_LENGTH]; + const char *options_path = NULL; + + buf[0] = '\0'; + + if (settings) + options_path = settings->paths.path_core_options; + + if (string_is_empty(options_path) && !path_is_empty(RARCH_PATH_CONFIG)) + { + fill_pathname_resolve_relative(buf, path_get(RARCH_PATH_CONFIG), + file_path_str(FILE_PATH_CORE_OPTIONS_CONFIG), sizeof(buf)); + options_path = buf; + } + + runloop_game_options_active = false; + + if (!string_is_empty(options_path)) + runloop_core_options = + core_option_manager_new(options_path, vars); + } + + } + break; + case RUNLOOP_CTL_CORE_OPTIONS_FREE: + if (runloop_core_options) + core_option_manager_free(runloop_core_options); + runloop_core_options = NULL; + break; + case RUNLOOP_CTL_CORE_OPTIONS_DEINIT: + { + if (!runloop_core_options) + return false; + + /* check if game options file was just created and flush + to that file instead */ + if(!path_is_empty(RARCH_PATH_CORE_OPTIONS)) + { + core_option_manager_flush_game_specific(runloop_core_options, + path_get(RARCH_PATH_CORE_OPTIONS)); + path_clear(RARCH_PATH_CORE_OPTIONS); + } + else + core_option_manager_flush(runloop_core_options); + + if (runloop_game_options_active) + runloop_game_options_active = false; + + runloop_ctl(RUNLOOP_CTL_CORE_OPTIONS_FREE, NULL); + } + break; + case RUNLOOP_CTL_KEY_EVENT_GET: + { + retro_keyboard_event_t **key_event = + (retro_keyboard_event_t**)data; + if (!key_event) + return false; + *key_event = &runloop_key_event; + } + break; + case RUNLOOP_CTL_FRONTEND_KEY_EVENT_GET: + { + retro_keyboard_event_t **key_event = + (retro_keyboard_event_t**)data; + if (!key_event) + return false; + *key_event = &runloop_frontend_key_event; + } + break; + case RUNLOOP_CTL_HTTPSERVER_INIT: +#if defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB) + httpserver_init(8888); +#endif + break; + case RUNLOOP_CTL_HTTPSERVER_DESTROY: +#if defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB) + httpserver_destroy(); +#endif + break; + case RUNLOOP_CTL_NONE: + default: + break; + } + + return true; +} + +/* Time to exit out of the main loop? + * Reasons for exiting: + * a) Shutdown environment callback was invoked. + * b) Quit key was pressed. + * c) Frame count exceeds or equals maximum amount of frames to run. + * d) Video driver no longer alive. + * e) End of BSV movie and BSV EOF exit is true. (TODO/FIXME - explain better) + */ +#define time_to_exit(quit_key_pressed) (runloop_shutdown_initiated || quit_key_pressed || !is_alive || bsv_movie_is_end_of_file() || (runloop_max_frames && (frame_count >= runloop_max_frames)) || runloop_exec) + +#define runloop_check_cheevos() (settings->bools.cheevos_enable && cheevos_loaded && (!cheats_are_enabled && !cheats_were_enabled)) + +static enum runloop_state runloop_check_state( + settings_t *settings, + uint64_t current_input, + uint64_t old_input, + uint64_t trigger_input, + bool input_driver_is_nonblock, + unsigned *sleep_ms) +{ + static bool old_focus = true; +#ifdef HAVE_OVERLAY + static char prev_overlay_restore = false; +#endif +#ifdef HAVE_NETWORKING + bool tmp = false; +#endif + bool is_focused = false; + bool is_alive = false; + uint64_t frame_count = 0; + bool focused = true; + bool pause_pressed = runloop_cmd_triggered(trigger_input, RARCH_PAUSE_TOGGLE); + + video_driver_get_status(&frame_count, &is_alive, &is_focused); + + if (runloop_cmd_triggered(trigger_input, RARCH_OVERLAY_NEXT)) + command_event(CMD_EVENT_OVERLAY_NEXT, NULL); + + if (runloop_cmd_triggered(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY)) + { + bool fullscreen_toggled = !runloop_paused +#ifdef HAVE_MENU + || menu_driver_is_alive(); +#endif + ; + + if (fullscreen_toggled) + command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL); + } + + if (runloop_cmd_triggered(trigger_input, RARCH_GRAB_MOUSE_TOGGLE)) + command_event(CMD_EVENT_GRAB_MOUSE_TOGGLE, NULL); + + +#ifdef HAVE_OVERLAY + if (input_keyboard_ctl( + RARCH_INPUT_KEYBOARD_CTL_IS_LINEFEED_ENABLED, NULL)) + { + prev_overlay_restore = false; + command_event(CMD_EVENT_OVERLAY_INIT, NULL); + } + else if (prev_overlay_restore) + { + if (!settings->bools.input_overlay_hide_in_menu) + command_event(CMD_EVENT_OVERLAY_INIT, NULL); + prev_overlay_restore = false; + } +#endif + + if (time_to_exit(runloop_cmd_press(trigger_input, RARCH_QUIT_KEY))) + { + if (runloop_exec) + runloop_exec = false; + + if (runloop_core_shutdown_initiated && settings->bools.load_dummy_on_core_shutdown) + { + content_ctx_info_t content_info; + + content_info.argc = 0; + content_info.argv = NULL; + content_info.args = NULL; + content_info.environ_get = NULL; + + if (!task_push_start_dummy_core(&content_info)) + { + retroarch_main_quit(); + return RUNLOOP_STATE_QUIT; + } + + /* Loads dummy core instead of exiting RetroArch completely. + * Aborts core shutdown if invoked. */ + runloop_shutdown_initiated = false; + runloop_core_shutdown_initiated = false; + } + else + { + retroarch_main_quit(); + return RUNLOOP_STATE_QUIT; + } + } + +#ifdef HAVE_MENU + if (menu_driver_is_alive()) + { + menu_ctx_iterate_t iter; + core_poll(); + + { + enum menu_action action = (enum menu_action)menu_event(current_input, trigger_input); + bool focused = settings->bools.pause_nonactive ? is_focused : true; + + focused = focused && !ui_companion_is_on_foreground(); + + iter.action = action; + + if (!menu_driver_iterate(&iter)) + rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); + + if (focused || !runloop_idle) + menu_driver_render(runloop_idle); + + if (!focused) + return RUNLOOP_STATE_SLEEP; + + if (action == MENU_ACTION_QUIT && !menu_driver_is_binding_state()) + return RUNLOOP_STATE_QUIT; + } + } +#endif + + if (runloop_idle) + return RUNLOOP_STATE_SLEEP; + + if (runloop_cmd_triggered(trigger_input, RARCH_GAME_FOCUS_TOGGLE)) + command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, (void*)(intptr_t)0); + +#ifdef HAVE_MENU + if (menu_event_kb_is_set(RETROK_F1) == 1) + { + if (menu_driver_is_alive()) + { + if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) && + !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + { + rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); + menu_event_kb_set(false, RETROK_F1); + } + } + } + else if ((!menu_event_kb_is_set(RETROK_F1) && + runloop_cmd_triggered(trigger_input, RARCH_MENU_TOGGLE)) || + rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + { + if (menu_driver_is_alive()) + { + if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) && + !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); + } + else + { + menu_display_toggle_set_reason(MENU_TOGGLE_REASON_USER); + rarch_ctl(RARCH_CTL_MENU_RUNNING, NULL); + } + } + else + menu_event_kb_set(false, RETROK_F1); + + if (menu_driver_is_alive()) + { + if (!settings->bools.menu_throttle_framerate && !settings->floats.fastforward_ratio) + return RUNLOOP_STATE_MENU_ITERATE; + + return RUNLOOP_STATE_END; + } +#endif + + if (settings->bools.pause_nonactive) + focused = is_focused; + + if (runloop_cmd_triggered(trigger_input, RARCH_SCREENSHOT)) + command_event(CMD_EVENT_TAKE_SCREENSHOT, NULL); + + if (runloop_cmd_triggered(trigger_input, RARCH_MUTE)) + command_event(CMD_EVENT_AUDIO_MUTE_TOGGLE, NULL); + + if (runloop_cmd_triggered(trigger_input, RARCH_OSK)) + { + if (input_keyboard_ctl( + RARCH_INPUT_KEYBOARD_CTL_IS_LINEFEED_ENABLED, NULL)) + input_keyboard_ctl( + RARCH_INPUT_KEYBOARD_CTL_UNSET_LINEFEED_ENABLED, NULL); + else + input_keyboard_ctl( + RARCH_INPUT_KEYBOARD_CTL_SET_LINEFEED_ENABLED, NULL); + } + + if (runloop_cmd_press(current_input, RARCH_VOLUME_UP)) + command_event(CMD_EVENT_VOLUME_UP, NULL); + else if (runloop_cmd_press(current_input, RARCH_VOLUME_DOWN)) + command_event(CMD_EVENT_VOLUME_DOWN, NULL); + +#ifdef HAVE_NETWORKING + tmp = runloop_cmd_triggered(trigger_input, RARCH_NETPLAY_FLIP); + netplay_driver_ctl(RARCH_NETPLAY_CTL_FLIP_PLAYERS, &tmp); + tmp = runloop_cmd_triggered(trigger_input, RARCH_NETPLAY_GAME_WATCH); + if (tmp) + netplay_driver_ctl(RARCH_NETPLAY_CTL_GAME_WATCH, NULL); + tmp = runloop_cmd_triggered(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY); +#endif + + /* Check if libretro pause key was pressed. If so, pause or + * unpause the libretro core. */ + + /* FRAMEADVANCE will set us into pause mode. */ + pause_pressed |= !runloop_paused + && runloop_cmd_triggered(trigger_input, RARCH_FRAMEADVANCE); + + if (focused && pause_pressed) + command_event(CMD_EVENT_PAUSE_TOGGLE, NULL); + else if (focused && !old_focus) + command_event(CMD_EVENT_UNPAUSE, NULL); + else if (!focused && old_focus) + command_event(CMD_EVENT_PAUSE, NULL); + + old_focus = focused; + + if (!focused) + return RUNLOOP_STATE_SLEEP; + + if (runloop_paused) + { + /* check pause state */ + + bool check_is_oneshot = runloop_cmd_triggered(trigger_input, + RARCH_FRAMEADVANCE) + || runloop_cmd_press(current_input, RARCH_REWIND); + if (runloop_cmd_triggered(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY)) + { + command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL); + if (!runloop_idle) + video_driver_cached_frame(); + } + + if (!check_is_oneshot) + return RUNLOOP_STATE_SLEEP; + } + + /* To avoid continous switching if we hold the button down, we require + * that the button must go from pressed to unpressed back to pressed + * to be able to toggle between then. + */ + if (runloop_cmd_triggered(trigger_input, RARCH_FAST_FORWARD_KEY)) + { + if (input_driver_is_nonblock) + input_driver_unset_nonblock_state(); + else + input_driver_set_nonblock_state(); + driver_set_nonblock_state(); + } + else if ((runloop_cmd_pressed(old_input, RARCH_FAST_FORWARD_HOLD_KEY) + != runloop_cmd_press(current_input, RARCH_FAST_FORWARD_HOLD_KEY))) + { + if (runloop_cmd_press(current_input, RARCH_FAST_FORWARD_HOLD_KEY)) + input_driver_set_nonblock_state(); + else + input_driver_unset_nonblock_state(); + driver_set_nonblock_state(); + } + + /* Checks if the state increase/decrease keys have been pressed + * for this frame. */ + if (runloop_cmd_triggered(trigger_input, RARCH_STATE_SLOT_PLUS)) + { + char msg[128]; + int new_state_slot = settings->ints.state_slot + 1; + + msg[0] = '\0'; + + configuration_set_int(settings, settings->ints.state_slot, new_state_slot); + + snprintf(msg, sizeof(msg), "%s: %d", + msg_hash_to_str(MSG_STATE_SLOT), + settings->ints.state_slot); + + runloop_msg_queue_push(msg, 2, 180, true); + + RARCH_LOG("%s\n", msg); + } + else if (runloop_cmd_triggered(trigger_input, RARCH_STATE_SLOT_MINUS)) + { + char msg[128]; + int new_state_slot = settings->ints.state_slot - 1; + + msg[0] = '\0'; + + if (settings->ints.state_slot > 0) + { + configuration_set_int(settings, settings->ints.state_slot, new_state_slot); + } + + snprintf(msg, sizeof(msg), "%s: %d", + msg_hash_to_str(MSG_STATE_SLOT), + settings->ints.state_slot); + + runloop_msg_queue_push(msg, 2, 180, true); + + RARCH_LOG("%s\n", msg); + } + + if (runloop_cmd_triggered(trigger_input, RARCH_SAVE_STATE_KEY)) + command_event(CMD_EVENT_SAVE_STATE, NULL); + else if (runloop_cmd_triggered(trigger_input, RARCH_LOAD_STATE_KEY)) + command_event(CMD_EVENT_LOAD_STATE, NULL); + +#ifdef HAVE_CHEEVOS + if (!settings->bools.cheevos_hardcore_mode_enable) +#endif + { + char s[128]; + unsigned t = 0; + + s[0] = '\0'; + + if (state_manager_check_rewind(runloop_cmd_press(current_input, RARCH_REWIND), + settings->uints.rewind_granularity, runloop_paused, s, sizeof(s), &t)) + runloop_msg_queue_push(s, 0, t, true); + } + + runloop_slowmotion = runloop_cmd_press(current_input, RARCH_SLOWMOTION); + + if (runloop_slowmotion) + { + /* Checks if slowmotion toggle/hold was being pressed and/or held. */ + if (settings->bools.video_black_frame_insertion) + { + if (!runloop_idle) + video_driver_cached_frame(); + } + + if (state_manager_frame_is_reversed()) + runloop_msg_queue_push( + msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 2, 30, true); + else + runloop_msg_queue_push( + msg_hash_to_str(MSG_SLOW_MOTION), 2, 30, true); + } + + if (runloop_cmd_triggered(trigger_input, RARCH_MOVIE_RECORD_TOGGLE)) + bsv_movie_check(); + + if (runloop_cmd_triggered(trigger_input, RARCH_SHADER_NEXT) || + runloop_cmd_triggered(trigger_input, RARCH_SHADER_PREV)) + dir_check_shader( + runloop_cmd_triggered(trigger_input, RARCH_SHADER_NEXT), + runloop_cmd_triggered(trigger_input, RARCH_SHADER_PREV)); + + if (runloop_cmd_triggered(trigger_input, RARCH_DISK_EJECT_TOGGLE)) + command_event(CMD_EVENT_DISK_EJECT_TOGGLE, NULL); + else if (runloop_cmd_triggered(trigger_input, RARCH_DISK_NEXT)) + command_event(CMD_EVENT_DISK_NEXT, NULL); + else if (runloop_cmd_triggered(trigger_input, RARCH_DISK_PREV)) + command_event(CMD_EVENT_DISK_PREV, NULL); + + if (runloop_cmd_triggered(trigger_input, RARCH_RESET)) + command_event(CMD_EVENT_RESET, NULL); + + cheat_manager_state_checks( + runloop_cmd_triggered(trigger_input, RARCH_CHEAT_INDEX_PLUS), + runloop_cmd_triggered(trigger_input, RARCH_CHEAT_INDEX_MINUS), + runloop_cmd_triggered(trigger_input, RARCH_CHEAT_TOGGLE)); + + return RUNLOOP_STATE_ITERATE; +} + +#ifdef HAVE_NETWORKING +/* FIXME: This is an ugly way to tell Netplay this... */ +#define runloop_netplay_pause() netplay_driver_ctl(RARCH_NETPLAY_CTL_PAUSE, NULL) +#else +#define runloop_netplay_pause() ((void)0) +#endif + +void runloop_set(enum runloop_action action) +{ + switch (action) + { + case RUNLOOP_ACTION_AUTOSAVE: + runloop_autosave = true; + break; + case RUNLOOP_ACTION_NONE: + break; + } +} + +void runloop_unset(enum runloop_action action) +{ + switch (action) + { + case RUNLOOP_ACTION_AUTOSAVE: + runloop_autosave = false; + break; + case RUNLOOP_ACTION_NONE: + break; + } +} + +/** + * runloop_iterate: + * + * Run Libretro core in RetroArch for one frame. + * + * Returns: 0 on success, 1 if we have to wait until + * button input in order to wake up the loop, + * -1 if we forcibly quit out of the RetroArch iteration loop. + **/ +int runloop_iterate(unsigned *sleep_ms) +{ + unsigned i; + retro_time_t current, target, to_sleep_ms; + uint64_t trigger_input = 0; + static uint64_t last_input = 0; + bool input_driver_is_nonblock = false; + settings_t *settings = config_get_ptr(); + uint64_t old_input = last_input; +#ifdef HAVE_MENU + bool menu_is_alive = menu_driver_is_alive(); +#else + bool menu_is_alive = false; +#endif + unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); + uint64_t current_input = + +#ifdef HAVE_MENU + menu_is_alive ? + input_menu_keys_pressed(settings, old_input, + &last_input, &trigger_input, runloop_paused, + &input_driver_is_nonblock) : +#endif + input_keys_pressed(settings, old_input, &last_input, + &trigger_input, runloop_paused, + &input_driver_is_nonblock); + + if (runloop_frame_time.callback) + { + /* Updates frame timing if frame timing callback is in use by the core. + * Limits frame time if fast forward ratio throttle is enabled. */ + + retro_time_t current = cpu_features_get_time_usec(); + retro_time_t delta = current - runloop_frame_time_last; + bool is_locked_fps = (runloop_paused || + input_driver_is_nonblock) | + !!recording_data; + + + if (!runloop_frame_time_last || is_locked_fps) + delta = runloop_frame_time.reference; + + if (!is_locked_fps && runloop_slowmotion) + delta /= settings->floats.slowmotion_ratio; + + runloop_frame_time_last = current; + + if (is_locked_fps) + runloop_frame_time_last = 0; + + runloop_frame_time.callback(delta); + } + + switch ((enum runloop_state) + runloop_check_state( + settings, + current_input, + old_input, + trigger_input, + input_driver_is_nonblock, + sleep_ms)) + { + case RUNLOOP_STATE_QUIT: + frame_limit_last_time = 0.0; + command_event(CMD_EVENT_QUIT, NULL); + return -1; + case RUNLOOP_STATE_SLEEP: + core_poll(); + runloop_netplay_pause(); + *sleep_ms = 10; + return 1; + case RUNLOOP_STATE_END: + core_poll(); + runloop_netplay_pause(); + goto end; + case RUNLOOP_STATE_MENU_ITERATE: + core_poll(); + runloop_netplay_pause(); + return 0; + case RUNLOOP_STATE_ITERATE: + case RUNLOOP_STATE_NONE: + break; + } + + if (runloop_autosave) + autosave_lock(); + + bsv_movie_set_frame_start(); + + camera_driver_poll(); + + /* Update binds for analog dpad modes. */ + for (i = 0; i < max_users; i++) + { + struct retro_keybind *general_binds = input_config_binds[i]; + struct retro_keybind *auto_binds = input_autoconf_binds[i]; + enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)settings->uints.input_analog_dpad_mode[i]; + + if (dpad_mode == ANALOG_DPAD_NONE) + continue; + + input_push_analog_dpad(general_binds, dpad_mode); + input_push_analog_dpad(auto_binds, dpad_mode); + } + + if ((settings->uints.video_frame_delay > 0) && !input_driver_is_nonblock) + retro_sleep(settings->uints.video_frame_delay); + + core_run(); + +#ifdef HAVE_CHEEVOS + if (runloop_check_cheevos()) + cheevos_test(); +#endif + + for (i = 0; i < max_users; i++) + { + struct retro_keybind *general_binds = input_config_binds[i]; + struct retro_keybind *auto_binds = input_autoconf_binds[i]; + enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)settings->uints.input_analog_dpad_mode[i]; + + if (dpad_mode == ANALOG_DPAD_NONE) + continue; + + input_pop_analog_dpad(general_binds); + input_pop_analog_dpad(auto_binds); + } + + bsv_movie_set_frame_end(); + + if (runloop_autosave) + autosave_unlock(); + + if (!settings->floats.fastforward_ratio) + return 0; + +end: + + current = cpu_features_get_time_usec(); + target = frame_limit_last_time + + frame_limit_minimum_time; + to_sleep_ms = (target - current) / 1000; + + if (to_sleep_ms > 0) + { + *sleep_ms = (unsigned)to_sleep_ms; + /* Combat jitter a bit. */ + frame_limit_last_time += frame_limit_minimum_time; + return 1; + } + + frame_limit_last_time = cpu_features_get_time_usec(); + + return 0; +} + +rarch_system_info_t *runloop_get_system_info(void) +{ + return &runloop_system; +} diff --git a/retroarch.h b/retroarch.h index 3e22d5ac08..bea653751a 100644 --- a/retroarch.h +++ b/retroarch.h @@ -17,11 +17,16 @@ #ifndef __RETROARCH_H #define __RETROARCH_H -#include +#include +#include +#include #include +#include #include "core_type.h" +#include "core.h" +#include "runloop_defines.h" RETRO_BEGIN_DECLS @@ -129,6 +134,96 @@ enum rarch_override_setting RARCH_OVERRIDE_SETTING_LAST }; +enum runloop_action +{ + RUNLOOP_ACTION_NONE = 0, + RUNLOOP_ACTION_AUTOSAVE +}; + +enum runloop_ctl_state +{ + RUNLOOP_CTL_NONE = 0, + + RUNLOOP_CTL_SET_FRAME_LIMIT, + + RUNLOOP_CTL_TASK_INIT, + + RUNLOOP_CTL_FRAME_TIME_FREE, + RUNLOOP_CTL_SET_FRAME_TIME_LAST, + RUNLOOP_CTL_SET_FRAME_TIME, + + RUNLOOP_CTL_IS_IDLE, + RUNLOOP_CTL_SET_IDLE, + + RUNLOOP_CTL_GET_WINDOWED_SCALE, + RUNLOOP_CTL_SET_WINDOWED_SCALE, + + RUNLOOP_CTL_IS_OVERRIDES_ACTIVE, + RUNLOOP_CTL_SET_OVERRIDES_ACTIVE, + RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE, + + RUNLOOP_CTL_IS_MISSING_BIOS, + RUNLOOP_CTL_SET_MISSING_BIOS, + RUNLOOP_CTL_UNSET_MISSING_BIOS, + + RUNLOOP_CTL_IS_GAME_OPTIONS_ACTIVE, + + RUNLOOP_CTL_IS_NONBLOCK_FORCED, + RUNLOOP_CTL_SET_NONBLOCK_FORCED, + RUNLOOP_CTL_UNSET_NONBLOCK_FORCED, + + RUNLOOP_CTL_SET_LIBRETRO_PATH, + + RUNLOOP_CTL_IS_PAUSED, + RUNLOOP_CTL_SET_PAUSED, + RUNLOOP_CTL_SET_MAX_FRAMES, + RUNLOOP_CTL_GLOBAL_FREE, + + RUNLOOP_CTL_SET_CORE_SHUTDOWN, + + RUNLOOP_CTL_SET_SHUTDOWN, + RUNLOOP_CTL_IS_SHUTDOWN, + + /* Runloop state */ + RUNLOOP_CTL_CLEAR_STATE, + RUNLOOP_CTL_STATE_FREE, + + /* Performance counters */ + RUNLOOP_CTL_GET_PERFCNT, + RUNLOOP_CTL_SET_PERFCNT_ENABLE, + RUNLOOP_CTL_UNSET_PERFCNT_ENABLE, + RUNLOOP_CTL_IS_PERFCNT_ENABLE, + + /* Key event */ + RUNLOOP_CTL_FRONTEND_KEY_EVENT_GET, + RUNLOOP_CTL_KEY_EVENT_GET, + RUNLOOP_CTL_DATA_DEINIT, + + /* Message queue */ + RUNLOOP_CTL_MSG_QUEUE_INIT, + RUNLOOP_CTL_MSG_QUEUE_DEINIT, + + /* Core options */ + RUNLOOP_CTL_HAS_CORE_OPTIONS, + RUNLOOP_CTL_GET_CORE_OPTION_SIZE, + RUNLOOP_CTL_IS_CORE_OPTION_UPDATED, + RUNLOOP_CTL_CORE_OPTIONS_LIST_GET, + RUNLOOP_CTL_CORE_OPTION_PREV, + RUNLOOP_CTL_CORE_OPTION_NEXT, + RUNLOOP_CTL_CORE_OPTIONS_GET, + RUNLOOP_CTL_CORE_OPTIONS_INIT, + RUNLOOP_CTL_CORE_OPTIONS_DEINIT, + RUNLOOP_CTL_CORE_OPTIONS_FREE, + + /* System info */ + RUNLOOP_CTL_SYSTEM_INFO_INIT, + RUNLOOP_CTL_SYSTEM_INFO_FREE, + + /* HTTP server */ + RUNLOOP_CTL_HTTPSERVER_INIT, + RUNLOOP_CTL_HTTPSERVER_DESTROY +}; + struct rarch_main_wrap { int argc; @@ -144,6 +239,73 @@ struct rarch_main_wrap bool touched; }; +typedef struct rarch_resolution +{ + unsigned idx; + unsigned id; +} rarch_resolution_t; + +/* All run-time- / command line flag-related globals go here. */ + +typedef struct global +{ + struct + { + char savefile[8192]; + char savestate[8192]; + char cheatfile[8192]; + char ups[8192]; + char bps[8192]; + char ips[8192]; + char remapfile[8192]; + } name; + + /* Recording. */ + struct + { + char path[8192]; + char config[8192]; + unsigned width; + unsigned height; + + size_t gpu_width; + size_t gpu_height; + char output_dir[8192]; + char config_dir[8192]; + bool use_output_dir; + } record; + + /* Settings and/or global state that is specific to + * a console-style implementation. */ + struct + { + struct + { + struct + { + rarch_resolution_t current; + rarch_resolution_t initial; + uint32_t *list; + unsigned count; + bool check; + } resolutions; + + unsigned gamma_correction; + unsigned int flicker_filter_index; + unsigned char soft_filter_index; + bool pal_enable; + bool pal60_enable; + } screen; + + struct + { + bool system_bgm_enable; + } sound; + + bool flickerfilter_enable; + bool softfilter_enable; + } console; +} global_t; bool rarch_ctl(enum rarch_ctl_state state, void *data); @@ -184,6 +346,37 @@ bool retroarch_main_init(int argc, char *argv[]); bool retroarch_main_quit(void); +global_t *global_get_ptr(void); + +/** + * runloop_iterate: + * + * Run Libretro core in RetroArch for one frame. + * + * Returns: 0 on successful run, + * Returns 1 if we have to wait until button input in order + * to wake up the loop. + * Returns -1 if we forcibly quit out of the + * RetroArch iteration loop. + **/ +int runloop_iterate(unsigned *sleep_ms); + +void runloop_msg_queue_push(const char *msg, unsigned prio, + unsigned duration, bool flush); + +bool runloop_msg_queue_pull(const char **ret); + +void runloop_get_status(bool *is_paused, bool *is_idle, bool *is_slowmotion, + bool *is_perfcnt_enable); + +bool runloop_ctl(enum runloop_ctl_state state, void *data); + +void runloop_set(enum runloop_action action); + +void runloop_unset(enum runloop_action action); + +rarch_system_info_t *runloop_get_system_info(void); + RETRO_END_DECLS #endif diff --git a/runloop.c b/runloop.c deleted file mode 100644 index 68b574317a..0000000000 --- a/runloop.c +++ /dev/null @@ -1,1233 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2012-2015 - Michael Lelli - * Copyright (C) 2014-2015 - Jay McCarthy - * Copyright (C) 2016-2017 - Brad Parker - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef HAVE_THREADS -#include -#endif - -#ifdef HAVE_CHEEVOS -#include "cheevos/cheevos.h" -#endif - -#ifdef HAVE_MENU -#include "menu/menu_display.h" -#include "menu/menu_driver.h" -#include "menu/menu_event.h" -#include "menu/widgets/menu_dialog.h" -#endif - -#ifdef HAVE_NETWORKING -#include "network/netplay/netplay.h" -#endif - -#if defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB) -#include "network/httpserver/httpserver.h" -#endif - -#include "autosave.h" -#include "command.h" -#include "configuration.h" -#include "driver.h" -#include "movie.h" -#include "dirs.h" -#include "paths.h" -#include "retroarch.h" -#include "runloop.h" -#include "file_path_special.h" -#include "managers/core_option_manager.h" -#include "managers/cheat_manager.h" -#include "managers/state_manager.h" -#include "list_special.h" -#include "audio/audio_driver.h" -#include "camera/camera_driver.h" -#include "record/record_driver.h" -#include "input/input_config.h" -#include "input/input_driver.h" -#include "ui/ui_companion_driver.h" -#include "core.h" - -#include "msg_hash.h" - -#include "input/input_keyboard.h" -#include "tasks/tasks_internal.h" -#include "verbosity.h" - -#ifdef HAVE_ZLIB -#define DEFAULT_EXT "zip" -#else -#define DEFAULT_EXT "" -#endif - -#define runloop_cmd_triggered(trigger_input, id) (BIT64_GET(trigger_input, id)) -#define runloop_cmd_pressed(old_input, id) (BIT64_GET(old_input, id)) - -enum runloop_state -{ - RUNLOOP_STATE_NONE = 0, - RUNLOOP_STATE_ITERATE, - RUNLOOP_STATE_SLEEP, - RUNLOOP_STATE_MENU_ITERATE, - RUNLOOP_STATE_END, - RUNLOOP_STATE_QUIT -}; - -typedef struct runloop_ctx_msg_info -{ - const char *msg; - unsigned prio; - unsigned duration; - bool flush; -} runloop_ctx_msg_info_t; - -static rarch_system_info_t runloop_system; -static struct retro_frame_time_callback runloop_frame_time; -static retro_keyboard_event_t runloop_key_event = NULL; -static retro_keyboard_event_t runloop_frontend_key_event = NULL; -static core_option_manager_t *runloop_core_options = NULL; -#ifdef HAVE_THREADS -static slock_t *_runloop_msg_queue_lock = NULL; -#endif -static msg_queue_t *runloop_msg_queue = NULL; -static unsigned runloop_pending_windowed_scale = 0; -static retro_usec_t runloop_frame_time_last = 0; -static unsigned runloop_max_frames = false; -static bool runloop_force_nonblock = false; -static bool runloop_paused = false; -static bool runloop_idle = false; -static bool runloop_exec = false; -static bool runloop_slowmotion = false; -static bool runloop_shutdown_initiated = false; -static bool runloop_core_shutdown_initiated = false; -static bool runloop_perfcnt_enable = false; -static bool runloop_overrides_active = false; -static bool runloop_game_options_active = false; -static bool runloop_missing_bios = false; -static bool runloop_autosave = false; -static retro_time_t frame_limit_minimum_time = 0.0; -static retro_time_t frame_limit_last_time = 0.0; - -global_t *global_get_ptr(void) -{ - static struct global g_extern; - return &g_extern; -} - -void runloop_msg_queue_push(const char *msg, - unsigned prio, unsigned duration, - bool flush) -{ - runloop_ctx_msg_info_t msg_info; - -#ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); -#endif - - if (flush) - msg_queue_clear(runloop_msg_queue); - - msg_info.msg = msg; - msg_info.prio = prio; - msg_info.duration = duration; - msg_info.flush = flush; - - if (runloop_msg_queue) - { - msg_queue_push(runloop_msg_queue, msg_info.msg, - msg_info.prio, msg_info.duration); - - if (ui_companion_is_on_foreground()) - { - const ui_companion_driver_t *ui = ui_companion_get_ptr(); - if (ui->msg_queue_push) - ui->msg_queue_push(msg_info.msg, - msg_info.prio, msg_info.duration, msg_info.flush); - } - } - -#ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); -#endif -} - -/** - * rarch_game_specific_options: - * - * Returns: true (1) if a game specific core - * options path has been found, - * otherwise false (0). - **/ -static bool rarch_game_specific_options(char **output) -{ - char game_path[8192]; - - game_path[0] ='\0'; - - if (!retroarch_validate_game_options(game_path, - sizeof(game_path), false)) - return false; - - if (!config_file_exists(game_path)) - return false; - - RARCH_LOG("%s %s\n", - msg_hash_to_str(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT), - game_path); - *output = strdup(game_path); - return true; -} - -void runloop_get_status(bool *is_paused, bool *is_idle, - bool *is_slowmotion, bool *is_perfcnt_enable) -{ - *is_paused = runloop_paused; - *is_idle = runloop_idle; - *is_slowmotion = runloop_slowmotion; - *is_perfcnt_enable = runloop_perfcnt_enable; -} - -bool runloop_msg_queue_pull(const char **ret) -{ - if (!ret) - return false; -#ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); -#endif - *ret = msg_queue_pull(runloop_msg_queue); -#ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); -#endif - return true; -} - -bool runloop_ctl(enum runloop_ctl_state state, void *data) -{ - - switch (state) - { - case RUNLOOP_CTL_SYSTEM_INFO_INIT: - core_get_system_info(&runloop_system.info); - - if (!runloop_system.info.library_name) - runloop_system.info.library_name = msg_hash_to_str(MSG_UNKNOWN); - if (!runloop_system.info.library_version) - runloop_system.info.library_version = "v0"; - - video_driver_set_title_buf(); - - strlcpy(runloop_system.valid_extensions, - runloop_system.info.valid_extensions ? - runloop_system.info.valid_extensions : DEFAULT_EXT, - sizeof(runloop_system.valid_extensions)); - break; - case RUNLOOP_CTL_GET_CORE_OPTION_SIZE: - { - unsigned *idx = (unsigned*)data; - if (!idx) - return false; - *idx = (unsigned)core_option_manager_size(runloop_core_options); - } - break; - case RUNLOOP_CTL_HAS_CORE_OPTIONS: - return runloop_core_options; - case RUNLOOP_CTL_CORE_OPTIONS_LIST_GET: - { - core_option_manager_t **coreopts = (core_option_manager_t**)data; - if (!coreopts) - return false; - *coreopts = runloop_core_options; - } - break; - case RUNLOOP_CTL_SYSTEM_INFO_FREE: - - /* No longer valid. */ - if (runloop_system.subsystem.data) - free(runloop_system.subsystem.data); - runloop_system.subsystem.data = NULL; - runloop_system.subsystem.size = 0; - - if (runloop_system.ports.data) - free(runloop_system.ports.data); - runloop_system.ports.data = NULL; - runloop_system.ports.size = 0; - - if (runloop_system.mmaps.descriptors) - free((void *)runloop_system.mmaps.descriptors); - runloop_system.mmaps.descriptors = NULL; - runloop_system.mmaps.num_descriptors = 0; - - runloop_key_event = NULL; - runloop_frontend_key_event = NULL; - - audio_driver_unset_callback(); - memset(&runloop_system, 0, sizeof(rarch_system_info_t)); - break; - case RUNLOOP_CTL_SET_FRAME_TIME_LAST: - runloop_frame_time_last = 0; - break; - case RUNLOOP_CTL_SET_OVERRIDES_ACTIVE: - runloop_overrides_active = true; - break; - case RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE: - runloop_overrides_active = false; - break; - case RUNLOOP_CTL_IS_OVERRIDES_ACTIVE: - return runloop_overrides_active; - case RUNLOOP_CTL_SET_MISSING_BIOS: - runloop_missing_bios = true; - break; - case RUNLOOP_CTL_UNSET_MISSING_BIOS: - runloop_missing_bios = false; - break; - case RUNLOOP_CTL_IS_MISSING_BIOS: - return runloop_missing_bios; - case RUNLOOP_CTL_IS_GAME_OPTIONS_ACTIVE: - return runloop_game_options_active; - case RUNLOOP_CTL_SET_FRAME_LIMIT: - { - settings_t *settings = config_get_ptr(); - struct retro_system_av_info *av_info = - video_viewport_get_system_av_info(); - float fastforward_ratio = - (settings->floats.fastforward_ratio == 0.0f) - ? 1.0f : settings->floats.fastforward_ratio; - - frame_limit_last_time = cpu_features_get_time_usec(); - frame_limit_minimum_time = (retro_time_t)roundf(1000000.0f - / (av_info->timing.fps * fastforward_ratio)); - } - break; - case RUNLOOP_CTL_GET_PERFCNT: - { - bool **perfcnt = (bool**)data; - if (!perfcnt) - return false; - *perfcnt = &runloop_perfcnt_enable; - } - break; - case RUNLOOP_CTL_SET_PERFCNT_ENABLE: - runloop_perfcnt_enable = true; - break; - case RUNLOOP_CTL_UNSET_PERFCNT_ENABLE: - runloop_perfcnt_enable = false; - break; - case RUNLOOP_CTL_IS_PERFCNT_ENABLE: - return runloop_perfcnt_enable; - case RUNLOOP_CTL_SET_NONBLOCK_FORCED: - runloop_force_nonblock = true; - break; - case RUNLOOP_CTL_UNSET_NONBLOCK_FORCED: - runloop_force_nonblock = false; - break; - case RUNLOOP_CTL_IS_NONBLOCK_FORCED: - return runloop_force_nonblock; - case RUNLOOP_CTL_SET_FRAME_TIME: - { - const struct retro_frame_time_callback *info = - (const struct retro_frame_time_callback*)data; -#ifdef HAVE_NETWORKING - /* retro_run() will be called in very strange and - * mysterious ways, have to disable it. */ - if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL)) - return false; -#endif - runloop_frame_time = *info; - } - break; - case RUNLOOP_CTL_GET_WINDOWED_SCALE: - { - unsigned **scale = (unsigned**)data; - if (!scale) - return false; - *scale = (unsigned*)&runloop_pending_windowed_scale; - } - break; - case RUNLOOP_CTL_SET_WINDOWED_SCALE: - { - unsigned *idx = (unsigned*)data; - if (!idx) - return false; - runloop_pending_windowed_scale = *idx; - } - break; - case RUNLOOP_CTL_SET_LIBRETRO_PATH: - return path_set(RARCH_PATH_CORE, (const char*)data); - case RUNLOOP_CTL_FRAME_TIME_FREE: - memset(&runloop_frame_time, 0, - sizeof(struct retro_frame_time_callback)); - runloop_frame_time_last = 0; - runloop_max_frames = 0; - break; - case RUNLOOP_CTL_STATE_FREE: - runloop_perfcnt_enable = false; - runloop_idle = false; - runloop_paused = false; - runloop_slowmotion = false; - runloop_overrides_active = false; - runloop_autosave = false; - runloop_ctl(RUNLOOP_CTL_FRAME_TIME_FREE, NULL); - break; - case RUNLOOP_CTL_GLOBAL_FREE: - { - global_t *global = NULL; - command_event(CMD_EVENT_TEMPORARY_CONTENT_DEINIT, NULL); - - path_deinit_subsystem(); - command_event(CMD_EVENT_RECORD_DEINIT, NULL); - command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); - - rarch_ctl(RARCH_CTL_UNSET_BLOCK_CONFIG_READ, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_LOAD_DISABLED, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_SAVE_DISABLED, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_ENABLE, NULL); - rarch_ctl(RARCH_CTL_UNSET_BPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_IPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_UPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_PATCH_BLOCKED, NULL); - runloop_overrides_active = false; - - core_unset_input_descriptors(); - - global = global_get_ptr(); - path_clear_all(); - dir_clear_all(); - memset(global, 0, sizeof(struct global)); - retroarch_override_setting_free_state(); - } - break; - case RUNLOOP_CTL_CLEAR_STATE: - driver_ctl(RARCH_DRIVER_CTL_DEINIT, NULL); - runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL); - runloop_ctl(RUNLOOP_CTL_GLOBAL_FREE, NULL); - break; - case RUNLOOP_CTL_SET_MAX_FRAMES: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - runloop_max_frames = *ptr; - } - break; - case RUNLOOP_CTL_IS_IDLE: - return runloop_idle; - case RUNLOOP_CTL_SET_IDLE: - { - bool *ptr = (bool*)data; - if (!ptr) - return false; - runloop_idle = *ptr; - } - break; - case RUNLOOP_CTL_SET_PAUSED: - { - bool *ptr = (bool*)data; - if (!ptr) - return false; - runloop_paused = *ptr; - } - break; - case RUNLOOP_CTL_IS_PAUSED: - return runloop_paused; - case RUNLOOP_CTL_MSG_QUEUE_DEINIT: - if (!runloop_msg_queue) - return true; - -#ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); -#endif - - msg_queue_free(runloop_msg_queue); - -#ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); -#endif - -#ifdef HAVE_THREADS - slock_free(_runloop_msg_queue_lock); - _runloop_msg_queue_lock = NULL; -#endif - - runloop_msg_queue = NULL; - break; - case RUNLOOP_CTL_MSG_QUEUE_INIT: - runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_DEINIT, NULL); - runloop_msg_queue = msg_queue_new(8); - retro_assert(runloop_msg_queue); - -#ifdef HAVE_THREADS - _runloop_msg_queue_lock = slock_new(); - retro_assert(_runloop_msg_queue_lock); -#endif - break; - case RUNLOOP_CTL_TASK_INIT: - { -#ifdef HAVE_THREADS - settings_t *settings = config_get_ptr(); - bool threaded_enable = settings->bools.threaded_data_runloop_enable; -#else - bool threaded_enable = false; -#endif - task_queue_deinit(); - task_queue_init(threaded_enable, runloop_msg_queue_push); - } - break; - case RUNLOOP_CTL_SET_CORE_SHUTDOWN: - runloop_core_shutdown_initiated = true; - break; - case RUNLOOP_CTL_SET_SHUTDOWN: - runloop_shutdown_initiated = true; - break; - case RUNLOOP_CTL_IS_SHUTDOWN: - return runloop_shutdown_initiated; - case RUNLOOP_CTL_DATA_DEINIT: - task_queue_deinit(); - break; - case RUNLOOP_CTL_IS_CORE_OPTION_UPDATED: - if (!runloop_core_options) - return false; - return core_option_manager_updated(runloop_core_options); - case RUNLOOP_CTL_CORE_OPTION_PREV: - { - unsigned *idx = (unsigned*)data; - if (!idx) - return false; - core_option_manager_prev(runloop_core_options, *idx); - if (ui_companion_is_on_foreground()) - ui_companion_driver_notify_refresh(); - } - break; - case RUNLOOP_CTL_CORE_OPTION_NEXT: - { - unsigned *idx = (unsigned*)data; - if (!idx) - return false; - core_option_manager_next(runloop_core_options, *idx); - if (ui_companion_is_on_foreground()) - ui_companion_driver_notify_refresh(); - } - break; - case RUNLOOP_CTL_CORE_OPTIONS_GET: - { - struct retro_variable *var = (struct retro_variable*)data; - - if (!runloop_core_options || !var) - return false; - - RARCH_LOG("Environ GET_VARIABLE %s:\n", var->key); - core_option_manager_get(runloop_core_options, var); - RARCH_LOG("\t%s\n", var->value ? var->value : - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); - } - break; - case RUNLOOP_CTL_CORE_OPTIONS_INIT: - { - settings_t *settings = config_get_ptr(); - char *game_options_path = NULL; - bool ret = false; - const struct retro_variable *vars = - (const struct retro_variable*)data; - - if (settings && settings->bools.game_specific_options) - ret = rarch_game_specific_options(&game_options_path); - - if(ret) - { - runloop_game_options_active = true; - runloop_core_options = - core_option_manager_new(game_options_path, vars); - free(game_options_path); - } - else - { - char buf[PATH_MAX_LENGTH]; - const char *options_path = NULL; - - buf[0] = '\0'; - - if (settings) - options_path = settings->paths.path_core_options; - - if (string_is_empty(options_path) && !path_is_empty(RARCH_PATH_CONFIG)) - { - fill_pathname_resolve_relative(buf, path_get(RARCH_PATH_CONFIG), - file_path_str(FILE_PATH_CORE_OPTIONS_CONFIG), sizeof(buf)); - options_path = buf; - } - - runloop_game_options_active = false; - - if (!string_is_empty(options_path)) - runloop_core_options = - core_option_manager_new(options_path, vars); - } - - } - break; - case RUNLOOP_CTL_CORE_OPTIONS_FREE: - if (runloop_core_options) - core_option_manager_free(runloop_core_options); - runloop_core_options = NULL; - break; - case RUNLOOP_CTL_CORE_OPTIONS_DEINIT: - { - if (!runloop_core_options) - return false; - - /* check if game options file was just created and flush - to that file instead */ - if(!path_is_empty(RARCH_PATH_CORE_OPTIONS)) - { - core_option_manager_flush_game_specific(runloop_core_options, - path_get(RARCH_PATH_CORE_OPTIONS)); - path_clear(RARCH_PATH_CORE_OPTIONS); - } - else - core_option_manager_flush(runloop_core_options); - - if (runloop_game_options_active) - runloop_game_options_active = false; - - runloop_ctl(RUNLOOP_CTL_CORE_OPTIONS_FREE, NULL); - } - break; - case RUNLOOP_CTL_KEY_EVENT_GET: - { - retro_keyboard_event_t **key_event = - (retro_keyboard_event_t**)data; - if (!key_event) - return false; - *key_event = &runloop_key_event; - } - break; - case RUNLOOP_CTL_FRONTEND_KEY_EVENT_GET: - { - retro_keyboard_event_t **key_event = - (retro_keyboard_event_t**)data; - if (!key_event) - return false; - *key_event = &runloop_frontend_key_event; - } - break; - case RUNLOOP_CTL_HTTPSERVER_INIT: -#if defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB) - httpserver_init(8888); -#endif - break; - case RUNLOOP_CTL_HTTPSERVER_DESTROY: -#if defined(HAVE_HTTPSERVER) && defined(HAVE_ZLIB) - httpserver_destroy(); -#endif - break; - case RUNLOOP_CTL_NONE: - default: - break; - } - - return true; -} - -/* Time to exit out of the main loop? - * Reasons for exiting: - * a) Shutdown environment callback was invoked. - * b) Quit key was pressed. - * c) Frame count exceeds or equals maximum amount of frames to run. - * d) Video driver no longer alive. - * e) End of BSV movie and BSV EOF exit is true. (TODO/FIXME - explain better) - */ -#define time_to_exit(quit_key_pressed) (runloop_shutdown_initiated || quit_key_pressed || !is_alive || bsv_movie_is_end_of_file() || (runloop_max_frames && (frame_count >= runloop_max_frames)) || runloop_exec) - -#define runloop_check_cheevos() (settings->bools.cheevos_enable && cheevos_loaded && (!cheats_are_enabled && !cheats_were_enabled)) - -static enum runloop_state runloop_check_state( - settings_t *settings, - uint64_t current_input, - uint64_t old_input, - uint64_t trigger_input, - bool input_driver_is_nonblock, - unsigned *sleep_ms) -{ - static bool old_focus = true; -#ifdef HAVE_OVERLAY - static char prev_overlay_restore = false; -#endif -#ifdef HAVE_NETWORKING - bool tmp = false; -#endif - bool is_focused = false; - bool is_alive = false; - uint64_t frame_count = 0; - bool focused = true; - bool pause_pressed = runloop_cmd_triggered(trigger_input, RARCH_PAUSE_TOGGLE); - - video_driver_get_status(&frame_count, &is_alive, &is_focused); - - if (runloop_cmd_triggered(trigger_input, RARCH_OVERLAY_NEXT)) - command_event(CMD_EVENT_OVERLAY_NEXT, NULL); - - if (runloop_cmd_triggered(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY)) - { - bool fullscreen_toggled = !runloop_paused -#ifdef HAVE_MENU - || menu_driver_is_alive(); -#endif - ; - - if (fullscreen_toggled) - command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL); - } - - if (runloop_cmd_triggered(trigger_input, RARCH_GRAB_MOUSE_TOGGLE)) - command_event(CMD_EVENT_GRAB_MOUSE_TOGGLE, NULL); - - -#ifdef HAVE_OVERLAY - if (input_keyboard_ctl( - RARCH_INPUT_KEYBOARD_CTL_IS_LINEFEED_ENABLED, NULL)) - { - prev_overlay_restore = false; - command_event(CMD_EVENT_OVERLAY_INIT, NULL); - } - else if (prev_overlay_restore) - { - if (!settings->bools.input_overlay_hide_in_menu) - command_event(CMD_EVENT_OVERLAY_INIT, NULL); - prev_overlay_restore = false; - } -#endif - - if (time_to_exit(runloop_cmd_press(trigger_input, RARCH_QUIT_KEY))) - { - if (runloop_exec) - runloop_exec = false; - - if (runloop_core_shutdown_initiated && settings->bools.load_dummy_on_core_shutdown) - { - content_ctx_info_t content_info; - - content_info.argc = 0; - content_info.argv = NULL; - content_info.args = NULL; - content_info.environ_get = NULL; - - if (!task_push_start_dummy_core(&content_info)) - { - retroarch_main_quit(); - return RUNLOOP_STATE_QUIT; - } - - /* Loads dummy core instead of exiting RetroArch completely. - * Aborts core shutdown if invoked. */ - runloop_shutdown_initiated = false; - runloop_core_shutdown_initiated = false; - } - else - { - retroarch_main_quit(); - return RUNLOOP_STATE_QUIT; - } - } - -#ifdef HAVE_MENU - if (menu_driver_is_alive()) - { - menu_ctx_iterate_t iter; - core_poll(); - - { - enum menu_action action = (enum menu_action)menu_event(current_input, trigger_input); - bool focused = settings->bools.pause_nonactive ? is_focused : true; - - focused = focused && !ui_companion_is_on_foreground(); - - iter.action = action; - - if (!menu_driver_iterate(&iter)) - rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); - - if (focused || !runloop_idle) - menu_driver_render(runloop_idle); - - if (!focused) - return RUNLOOP_STATE_SLEEP; - - if (action == MENU_ACTION_QUIT && !menu_driver_is_binding_state()) - return RUNLOOP_STATE_QUIT; - } - } -#endif - - if (runloop_idle) - return RUNLOOP_STATE_SLEEP; - - if (runloop_cmd_triggered(trigger_input, RARCH_GAME_FOCUS_TOGGLE)) - command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, (void*)(intptr_t)0); - -#ifdef HAVE_MENU - if (menu_event_kb_is_set(RETROK_F1) == 1) - { - if (menu_driver_is_alive()) - { - if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) && - !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - { - rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); - menu_event_kb_set(false, RETROK_F1); - } - } - } - else if ((!menu_event_kb_is_set(RETROK_F1) && - runloop_cmd_triggered(trigger_input, RARCH_MENU_TOGGLE)) || - rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - { - if (menu_driver_is_alive()) - { - if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) && - !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) - rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); - } - else - { - menu_display_toggle_set_reason(MENU_TOGGLE_REASON_USER); - rarch_ctl(RARCH_CTL_MENU_RUNNING, NULL); - } - } - else - menu_event_kb_set(false, RETROK_F1); - - if (menu_driver_is_alive()) - { - if (!settings->bools.menu_throttle_framerate && !settings->floats.fastforward_ratio) - return RUNLOOP_STATE_MENU_ITERATE; - - return RUNLOOP_STATE_END; - } -#endif - - if (settings->bools.pause_nonactive) - focused = is_focused; - - if (runloop_cmd_triggered(trigger_input, RARCH_SCREENSHOT)) - command_event(CMD_EVENT_TAKE_SCREENSHOT, NULL); - - if (runloop_cmd_triggered(trigger_input, RARCH_MUTE)) - command_event(CMD_EVENT_AUDIO_MUTE_TOGGLE, NULL); - - if (runloop_cmd_triggered(trigger_input, RARCH_OSK)) - { - if (input_keyboard_ctl( - RARCH_INPUT_KEYBOARD_CTL_IS_LINEFEED_ENABLED, NULL)) - input_keyboard_ctl( - RARCH_INPUT_KEYBOARD_CTL_UNSET_LINEFEED_ENABLED, NULL); - else - input_keyboard_ctl( - RARCH_INPUT_KEYBOARD_CTL_SET_LINEFEED_ENABLED, NULL); - } - - if (runloop_cmd_press(current_input, RARCH_VOLUME_UP)) - command_event(CMD_EVENT_VOLUME_UP, NULL); - else if (runloop_cmd_press(current_input, RARCH_VOLUME_DOWN)) - command_event(CMD_EVENT_VOLUME_DOWN, NULL); - -#ifdef HAVE_NETWORKING - tmp = runloop_cmd_triggered(trigger_input, RARCH_NETPLAY_FLIP); - netplay_driver_ctl(RARCH_NETPLAY_CTL_FLIP_PLAYERS, &tmp); - tmp = runloop_cmd_triggered(trigger_input, RARCH_NETPLAY_GAME_WATCH); - if (tmp) - netplay_driver_ctl(RARCH_NETPLAY_CTL_GAME_WATCH, NULL); - tmp = runloop_cmd_triggered(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY); -#endif - - /* Check if libretro pause key was pressed. If so, pause or - * unpause the libretro core. */ - - /* FRAMEADVANCE will set us into pause mode. */ - pause_pressed |= !runloop_paused - && runloop_cmd_triggered(trigger_input, RARCH_FRAMEADVANCE); - - if (focused && pause_pressed) - command_event(CMD_EVENT_PAUSE_TOGGLE, NULL); - else if (focused && !old_focus) - command_event(CMD_EVENT_UNPAUSE, NULL); - else if (!focused && old_focus) - command_event(CMD_EVENT_PAUSE, NULL); - - old_focus = focused; - - if (!focused) - return RUNLOOP_STATE_SLEEP; - - if (runloop_paused) - { - /* check pause state */ - - bool check_is_oneshot = runloop_cmd_triggered(trigger_input, - RARCH_FRAMEADVANCE) - || runloop_cmd_press(current_input, RARCH_REWIND); - if (runloop_cmd_triggered(trigger_input, RARCH_FULLSCREEN_TOGGLE_KEY)) - { - command_event(CMD_EVENT_FULLSCREEN_TOGGLE, NULL); - if (!runloop_idle) - video_driver_cached_frame(); - } - - if (!check_is_oneshot) - return RUNLOOP_STATE_SLEEP; - } - - /* To avoid continous switching if we hold the button down, we require - * that the button must go from pressed to unpressed back to pressed - * to be able to toggle between then. - */ - if (runloop_cmd_triggered(trigger_input, RARCH_FAST_FORWARD_KEY)) - { - if (input_driver_is_nonblock) - input_driver_unset_nonblock_state(); - else - input_driver_set_nonblock_state(); - driver_set_nonblock_state(); - } - else if ((runloop_cmd_pressed(old_input, RARCH_FAST_FORWARD_HOLD_KEY) - != runloop_cmd_press(current_input, RARCH_FAST_FORWARD_HOLD_KEY))) - { - if (runloop_cmd_press(current_input, RARCH_FAST_FORWARD_HOLD_KEY)) - input_driver_set_nonblock_state(); - else - input_driver_unset_nonblock_state(); - driver_set_nonblock_state(); - } - - /* Checks if the state increase/decrease keys have been pressed - * for this frame. */ - if (runloop_cmd_triggered(trigger_input, RARCH_STATE_SLOT_PLUS)) - { - char msg[128]; - int new_state_slot = settings->ints.state_slot + 1; - - msg[0] = '\0'; - - configuration_set_int(settings, settings->ints.state_slot, new_state_slot); - - snprintf(msg, sizeof(msg), "%s: %d", - msg_hash_to_str(MSG_STATE_SLOT), - settings->ints.state_slot); - - runloop_msg_queue_push(msg, 2, 180, true); - - RARCH_LOG("%s\n", msg); - } - else if (runloop_cmd_triggered(trigger_input, RARCH_STATE_SLOT_MINUS)) - { - char msg[128]; - int new_state_slot = settings->ints.state_slot - 1; - - msg[0] = '\0'; - - if (settings->ints.state_slot > 0) - { - configuration_set_int(settings, settings->ints.state_slot, new_state_slot); - } - - snprintf(msg, sizeof(msg), "%s: %d", - msg_hash_to_str(MSG_STATE_SLOT), - settings->ints.state_slot); - - runloop_msg_queue_push(msg, 2, 180, true); - - RARCH_LOG("%s\n", msg); - } - - if (runloop_cmd_triggered(trigger_input, RARCH_SAVE_STATE_KEY)) - command_event(CMD_EVENT_SAVE_STATE, NULL); - else if (runloop_cmd_triggered(trigger_input, RARCH_LOAD_STATE_KEY)) - command_event(CMD_EVENT_LOAD_STATE, NULL); - -#ifdef HAVE_CHEEVOS - if (!settings->bools.cheevos_hardcore_mode_enable) -#endif - { - char s[128]; - unsigned t = 0; - - s[0] = '\0'; - - if (state_manager_check_rewind(runloop_cmd_press(current_input, RARCH_REWIND), - settings->uints.rewind_granularity, runloop_paused, s, sizeof(s), &t)) - runloop_msg_queue_push(s, 0, t, true); - } - - runloop_slowmotion = runloop_cmd_press(current_input, RARCH_SLOWMOTION); - - if (runloop_slowmotion) - { - /* Checks if slowmotion toggle/hold was being pressed and/or held. */ - if (settings->bools.video_black_frame_insertion) - { - if (!runloop_idle) - video_driver_cached_frame(); - } - - if (state_manager_frame_is_reversed()) - runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION_REWIND), 2, 30, true); - else - runloop_msg_queue_push( - msg_hash_to_str(MSG_SLOW_MOTION), 2, 30, true); - } - - if (runloop_cmd_triggered(trigger_input, RARCH_MOVIE_RECORD_TOGGLE)) - bsv_movie_check(); - - if (runloop_cmd_triggered(trigger_input, RARCH_SHADER_NEXT) || - runloop_cmd_triggered(trigger_input, RARCH_SHADER_PREV)) - dir_check_shader( - runloop_cmd_triggered(trigger_input, RARCH_SHADER_NEXT), - runloop_cmd_triggered(trigger_input, RARCH_SHADER_PREV)); - - if (runloop_cmd_triggered(trigger_input, RARCH_DISK_EJECT_TOGGLE)) - command_event(CMD_EVENT_DISK_EJECT_TOGGLE, NULL); - else if (runloop_cmd_triggered(trigger_input, RARCH_DISK_NEXT)) - command_event(CMD_EVENT_DISK_NEXT, NULL); - else if (runloop_cmd_triggered(trigger_input, RARCH_DISK_PREV)) - command_event(CMD_EVENT_DISK_PREV, NULL); - - if (runloop_cmd_triggered(trigger_input, RARCH_RESET)) - command_event(CMD_EVENT_RESET, NULL); - - cheat_manager_state_checks( - runloop_cmd_triggered(trigger_input, RARCH_CHEAT_INDEX_PLUS), - runloop_cmd_triggered(trigger_input, RARCH_CHEAT_INDEX_MINUS), - runloop_cmd_triggered(trigger_input, RARCH_CHEAT_TOGGLE)); - - return RUNLOOP_STATE_ITERATE; -} - -#ifdef HAVE_NETWORKING -/* FIXME: This is an ugly way to tell Netplay this... */ -#define runloop_netplay_pause() netplay_driver_ctl(RARCH_NETPLAY_CTL_PAUSE, NULL) -#else -#define runloop_netplay_pause() ((void)0) -#endif - -void runloop_set(enum runloop_action action) -{ - switch (action) - { - case RUNLOOP_ACTION_AUTOSAVE: - runloop_autosave = true; - break; - case RUNLOOP_ACTION_NONE: - break; - } -} - -void runloop_unset(enum runloop_action action) -{ - switch (action) - { - case RUNLOOP_ACTION_AUTOSAVE: - runloop_autosave = false; - break; - case RUNLOOP_ACTION_NONE: - break; - } -} - -/** - * runloop_iterate: - * - * Run Libretro core in RetroArch for one frame. - * - * Returns: 0 on success, 1 if we have to wait until - * button input in order to wake up the loop, - * -1 if we forcibly quit out of the RetroArch iteration loop. - **/ -int runloop_iterate(unsigned *sleep_ms) -{ - unsigned i; - retro_time_t current, target, to_sleep_ms; - uint64_t trigger_input = 0; - static uint64_t last_input = 0; - bool input_driver_is_nonblock = false; - settings_t *settings = config_get_ptr(); - uint64_t old_input = last_input; -#ifdef HAVE_MENU - bool menu_is_alive = menu_driver_is_alive(); -#else - bool menu_is_alive = false; -#endif - unsigned max_users = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS)); - uint64_t current_input = - -#ifdef HAVE_MENU - menu_is_alive ? - input_menu_keys_pressed(settings, old_input, - &last_input, &trigger_input, runloop_paused, - &input_driver_is_nonblock) : -#endif - input_keys_pressed(settings, old_input, &last_input, - &trigger_input, runloop_paused, - &input_driver_is_nonblock); - - if (runloop_frame_time.callback) - { - /* Updates frame timing if frame timing callback is in use by the core. - * Limits frame time if fast forward ratio throttle is enabled. */ - - retro_time_t current = cpu_features_get_time_usec(); - retro_time_t delta = current - runloop_frame_time_last; - bool is_locked_fps = (runloop_paused || - input_driver_is_nonblock) | - !!recording_data; - - - if (!runloop_frame_time_last || is_locked_fps) - delta = runloop_frame_time.reference; - - if (!is_locked_fps && runloop_slowmotion) - delta /= settings->floats.slowmotion_ratio; - - runloop_frame_time_last = current; - - if (is_locked_fps) - runloop_frame_time_last = 0; - - runloop_frame_time.callback(delta); - } - - switch ((enum runloop_state) - runloop_check_state( - settings, - current_input, - old_input, - trigger_input, - input_driver_is_nonblock, - sleep_ms)) - { - case RUNLOOP_STATE_QUIT: - frame_limit_last_time = 0.0; - command_event(CMD_EVENT_QUIT, NULL); - return -1; - case RUNLOOP_STATE_SLEEP: - core_poll(); - runloop_netplay_pause(); - *sleep_ms = 10; - return 1; - case RUNLOOP_STATE_END: - core_poll(); - runloop_netplay_pause(); - goto end; - case RUNLOOP_STATE_MENU_ITERATE: - core_poll(); - runloop_netplay_pause(); - return 0; - case RUNLOOP_STATE_ITERATE: - case RUNLOOP_STATE_NONE: - break; - } - - if (runloop_autosave) - autosave_lock(); - - bsv_movie_set_frame_start(); - - camera_driver_poll(); - - /* Update binds for analog dpad modes. */ - for (i = 0; i < max_users; i++) - { - struct retro_keybind *general_binds = input_config_binds[i]; - struct retro_keybind *auto_binds = input_autoconf_binds[i]; - enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)settings->uints.input_analog_dpad_mode[i]; - - if (dpad_mode == ANALOG_DPAD_NONE) - continue; - - input_push_analog_dpad(general_binds, dpad_mode); - input_push_analog_dpad(auto_binds, dpad_mode); - } - - if ((settings->uints.video_frame_delay > 0) && !input_driver_is_nonblock) - retro_sleep(settings->uints.video_frame_delay); - - core_run(); - -#ifdef HAVE_CHEEVOS - if (runloop_check_cheevos()) - cheevos_test(); -#endif - - for (i = 0; i < max_users; i++) - { - struct retro_keybind *general_binds = input_config_binds[i]; - struct retro_keybind *auto_binds = input_autoconf_binds[i]; - enum analog_dpad_mode dpad_mode = (enum analog_dpad_mode)settings->uints.input_analog_dpad_mode[i]; - - if (dpad_mode == ANALOG_DPAD_NONE) - continue; - - input_pop_analog_dpad(general_binds); - input_pop_analog_dpad(auto_binds); - } - - bsv_movie_set_frame_end(); - - if (runloop_autosave) - autosave_unlock(); - - if (!settings->floats.fastforward_ratio) - return 0; - -end: - - current = cpu_features_get_time_usec(); - target = frame_limit_last_time + - frame_limit_minimum_time; - to_sleep_ms = (target - current) / 1000; - - if (to_sleep_ms > 0) - { - *sleep_ms = (unsigned)to_sleep_ms; - /* Combat jitter a bit. */ - frame_limit_last_time += frame_limit_minimum_time; - return 1; - } - - frame_limit_last_time = cpu_features_get_time_usec(); - - return 0; -} - -rarch_system_info_t *runloop_get_system_info(void) -{ - return &runloop_system; -} diff --git a/runloop.h b/runloop.h deleted file mode 100644 index 363dae314e..0000000000 --- a/runloop.h +++ /dev/null @@ -1,222 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2011-2016 - Daniel De Matteis - * Copyright (C) 2016 - Brad Parker - * - * RetroArch is free software: you can redistribute it and/or modify it under the terms - * of the GNU General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with RetroArch. - * If not, see . - */ - -#ifndef __RETROARCH_RUNLOOP_H -#define __RETROARCH_RUNLOOP_H - -#include -#include -#include -#include -#include - -#include "core.h" -#include "runloop_defines.h" - -RETRO_BEGIN_DECLS - -enum runloop_action -{ - RUNLOOP_ACTION_NONE = 0, - RUNLOOP_ACTION_AUTOSAVE -}; - -enum runloop_ctl_state -{ - RUNLOOP_CTL_NONE = 0, - - RUNLOOP_CTL_SET_FRAME_LIMIT, - - RUNLOOP_CTL_TASK_INIT, - - RUNLOOP_CTL_FRAME_TIME_FREE, - RUNLOOP_CTL_SET_FRAME_TIME_LAST, - RUNLOOP_CTL_SET_FRAME_TIME, - - RUNLOOP_CTL_IS_IDLE, - RUNLOOP_CTL_SET_IDLE, - - RUNLOOP_CTL_GET_WINDOWED_SCALE, - RUNLOOP_CTL_SET_WINDOWED_SCALE, - - RUNLOOP_CTL_IS_OVERRIDES_ACTIVE, - RUNLOOP_CTL_SET_OVERRIDES_ACTIVE, - RUNLOOP_CTL_UNSET_OVERRIDES_ACTIVE, - - RUNLOOP_CTL_IS_MISSING_BIOS, - RUNLOOP_CTL_SET_MISSING_BIOS, - RUNLOOP_CTL_UNSET_MISSING_BIOS, - - RUNLOOP_CTL_IS_GAME_OPTIONS_ACTIVE, - - RUNLOOP_CTL_IS_NONBLOCK_FORCED, - RUNLOOP_CTL_SET_NONBLOCK_FORCED, - RUNLOOP_CTL_UNSET_NONBLOCK_FORCED, - - RUNLOOP_CTL_SET_LIBRETRO_PATH, - - RUNLOOP_CTL_IS_PAUSED, - RUNLOOP_CTL_SET_PAUSED, - RUNLOOP_CTL_SET_MAX_FRAMES, - RUNLOOP_CTL_GLOBAL_FREE, - - RUNLOOP_CTL_SET_CORE_SHUTDOWN, - - RUNLOOP_CTL_SET_SHUTDOWN, - RUNLOOP_CTL_IS_SHUTDOWN, - - /* Runloop state */ - RUNLOOP_CTL_CLEAR_STATE, - RUNLOOP_CTL_STATE_FREE, - - /* Performance counters */ - RUNLOOP_CTL_GET_PERFCNT, - RUNLOOP_CTL_SET_PERFCNT_ENABLE, - RUNLOOP_CTL_UNSET_PERFCNT_ENABLE, - RUNLOOP_CTL_IS_PERFCNT_ENABLE, - - /* Key event */ - RUNLOOP_CTL_FRONTEND_KEY_EVENT_GET, - RUNLOOP_CTL_KEY_EVENT_GET, - RUNLOOP_CTL_DATA_DEINIT, - - /* Message queue */ - RUNLOOP_CTL_MSG_QUEUE_INIT, - RUNLOOP_CTL_MSG_QUEUE_DEINIT, - - /* Core options */ - RUNLOOP_CTL_HAS_CORE_OPTIONS, - RUNLOOP_CTL_GET_CORE_OPTION_SIZE, - RUNLOOP_CTL_IS_CORE_OPTION_UPDATED, - RUNLOOP_CTL_CORE_OPTIONS_LIST_GET, - RUNLOOP_CTL_CORE_OPTION_PREV, - RUNLOOP_CTL_CORE_OPTION_NEXT, - RUNLOOP_CTL_CORE_OPTIONS_GET, - RUNLOOP_CTL_CORE_OPTIONS_INIT, - RUNLOOP_CTL_CORE_OPTIONS_DEINIT, - RUNLOOP_CTL_CORE_OPTIONS_FREE, - - /* System info */ - RUNLOOP_CTL_SYSTEM_INFO_INIT, - RUNLOOP_CTL_SYSTEM_INFO_FREE, - - /* HTTP server */ - RUNLOOP_CTL_HTTPSERVER_INIT, - RUNLOOP_CTL_HTTPSERVER_DESTROY -}; - -typedef struct rarch_resolution -{ - unsigned idx; - unsigned id; -} rarch_resolution_t; - -/* All run-time- / command line flag-related globals go here. */ - -typedef struct global -{ - struct - { - char savefile[8192]; - char savestate[8192]; - char cheatfile[8192]; - char ups[8192]; - char bps[8192]; - char ips[8192]; - char remapfile[8192]; - } name; - - /* Recording. */ - struct - { - char path[8192]; - char config[8192]; - unsigned width; - unsigned height; - - size_t gpu_width; - size_t gpu_height; - char output_dir[8192]; - char config_dir[8192]; - bool use_output_dir; - } record; - - /* Settings and/or global state that is specific to - * a console-style implementation. */ - struct - { - struct - { - struct - { - rarch_resolution_t current; - rarch_resolution_t initial; - uint32_t *list; - unsigned count; - bool check; - } resolutions; - - unsigned gamma_correction; - unsigned int flicker_filter_index; - unsigned char soft_filter_index; - bool pal_enable; - bool pal60_enable; - } screen; - - struct - { - bool system_bgm_enable; - } sound; - - bool flickerfilter_enable; - bool softfilter_enable; - } console; -} global_t; - -global_t *global_get_ptr(void); - -/** - * runloop_iterate: - * - * Run Libretro core in RetroArch for one frame. - * - * Returns: 0 on successful run, - * Returns 1 if we have to wait until button input in order - * to wake up the loop. - * Returns -1 if we forcibly quit out of the - * RetroArch iteration loop. - **/ -int runloop_iterate(unsigned *sleep_ms); - -void runloop_msg_queue_push(const char *msg, unsigned prio, - unsigned duration, bool flush); - -bool runloop_msg_queue_pull(const char **ret); - -void runloop_get_status(bool *is_paused, bool *is_idle, bool *is_slowmotion, - bool *is_perfcnt_enable); - -bool runloop_ctl(enum runloop_ctl_state state, void *data); - -void runloop_set(enum runloop_action action); - -void runloop_unset(enum runloop_action action); - -rarch_system_info_t *runloop_get_system_info(void); - -RETRO_END_DECLS - -#endif diff --git a/tasks/task_content.c b/tasks/task_content.c index 77caf2358b..600b0af1c9 100644 --- a/tasks/task_content.c +++ b/tasks/task_content.c @@ -85,7 +85,6 @@ #include "../msg_hash.h" #include "../content.h" #include "../dynamic.h" -#include "../runloop.h" #include "../retroarch.h" #include "../file_path_special.h" #include "../core.h" diff --git a/tasks/task_database.c b/tasks/task_database.c index 5a1b59ffb0..88eb8bc7cb 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -32,7 +32,7 @@ #include "../list_special.h" #include "../msg_hash.h" #include "../playlist.h" -#include "../runloop.h" +#include "../retroarch.h" #include "../verbosity.h" #include "../core_info.h" diff --git a/tasks/task_netplay_find_content.c b/tasks/task_netplay_find_content.c index 5f2fb6b226..3d5b6bb9a4 100644 --- a/tasks/task_netplay_find_content.c +++ b/tasks/task_netplay_find_content.c @@ -34,7 +34,7 @@ #include "../playlist.h" #include "../command.h" #include "../core_info.h" -#include "../../runloop.h" +#include "../../retroarch.h" typedef struct { diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index 84fff0873a..d739b1d9a9 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -50,7 +50,7 @@ #include "../defaults.h" #include "../configuration.h" -#include "../runloop.h" +#include "../retroarch.h" #include "../paths.h" #include "../msg_hash.h" diff --git a/ui/drivers/cocoa/cocoatouch_menu.m b/ui/drivers/cocoa/cocoatouch_menu.m index e65a058a68..31d0220f0d 100644 --- a/ui/drivers/cocoa/cocoatouch_menu.m +++ b/ui/drivers/cocoa/cocoatouch_menu.m @@ -30,7 +30,7 @@ #include "../../../input/drivers/cocoa_input.h" #include "../../../configuration.h" -#include "../../../runloop.h" +#include "../../../retroarch.h" #ifdef HAVE_MENU #include "../../../menu/widgets/menu_entry.h" diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index 913f94f5db..9031f1edde 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -34,7 +34,6 @@ #include "../../paths.h" #include "../../core.h" #include "../../retroarch.h" -#include "../../runloop.h" #include "../../tasks/tasks_internal.h" id apple_platform; diff --git a/ui/drivers/ui_cocoatouch.m b/ui/drivers/ui_cocoatouch.m index 1517502fc2..d6134f3da6 100644 --- a/ui/drivers/ui_cocoatouch.m +++ b/ui/drivers/ui_cocoatouch.m @@ -33,7 +33,7 @@ #endif #include "../../configuration.h" #include "../../frontend/frontend.h" -#include "../../runloop.h" +#include "../../retroarch.h" #ifdef HAVE_MENU #include "../../menu/menu_setting.h" diff --git a/ui/drivers/ui_qt.cpp b/ui/drivers/ui_qt.cpp index cdbce779f6..7f71aa121e 100644 --- a/ui/drivers/ui_qt.cpp +++ b/ui/drivers/ui_qt.cpp @@ -35,7 +35,7 @@ #include "../ui_companion_driver.h" #include "../../core.h" #include "../../configuration.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../tasks/tasks_internal.h" #ifdef HAVE_QT_WRAPPER diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 81d17b6a63..dca9767f99 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -49,7 +49,7 @@ #include "../../configuration.h" #include "../../driver.h" #include "../../paths.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../gfx/video_driver.h" #include "../../gfx/video_shader_driver.h" #include "../../tasks/tasks_internal.h" diff --git a/ui/drivers/win32/ui_win32_window.cpp b/ui/drivers/win32/ui_win32_window.cpp index afa19a8346..8a0d1e981a 100644 --- a/ui/drivers/win32/ui_win32_window.cpp +++ b/ui/drivers/win32/ui_win32_window.cpp @@ -47,7 +47,7 @@ #include "../../ui_companion_driver.h" #include "../../../driver.h" -#include "../../../runloop.h" +#include "../../../retroarch.h" #include "../../../tasks/tasks_internal.h" static void ui_window_win32_destroy(void *data) diff --git a/wifi/drivers/connmanctl.c b/wifi/drivers/connmanctl.c index 5af68d2f4d..ddf6f7a6fc 100644 --- a/wifi/drivers/connmanctl.c +++ b/wifi/drivers/connmanctl.c @@ -19,7 +19,7 @@ #include #include "../wifi_driver.h" -#include "../../runloop.h" +#include "../../retroarch.h" #include "../../lakka.h" static bool connman_cache[256] = {0}; From 2ce9d71553b453e0e4426d0f70474f6e871cd6ce Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 11 May 2017 09:20:35 +0200 Subject: [PATCH 032/274] Start cutting down on runloop_ctl actions --- retroarch.c | 153 +++++++++++++++++++++++++--------------------------- retroarch.h | 7 --- 2 files changed, 72 insertions(+), 88 deletions(-) diff --git a/retroarch.c b/retroarch.c index 045fc7fc93..900e40a2b2 100644 --- a/retroarch.c +++ b/retroarch.c @@ -231,6 +231,70 @@ static bool runloop_autosave = false; static retro_time_t frame_limit_minimum_time = 0.0; static retro_time_t frame_limit_last_time = 0.0; +static void retroarch_msg_queue_deinit(void) +{ + if (!runloop_msg_queue) + return; + +#ifdef HAVE_THREADS + slock_lock(_runloop_msg_queue_lock); +#endif + + msg_queue_free(runloop_msg_queue); + +#ifdef HAVE_THREADS + slock_unlock(_runloop_msg_queue_lock); +#endif + +#ifdef HAVE_THREADS + slock_free(_runloop_msg_queue_lock); + _runloop_msg_queue_lock = NULL; +#endif + + runloop_msg_queue = NULL; +} + +static void retroarch_msg_queue_init(void) +{ + retroarch_msg_queue_deinit(); + runloop_msg_queue = msg_queue_new(8); + retro_assert(runloop_msg_queue); + +#ifdef HAVE_THREADS + _runloop_msg_queue_lock = slock_new(); + retro_assert(_runloop_msg_queue_lock); +#endif +} + +static void global_free(void) +{ + global_t *global = NULL; + command_event(CMD_EVENT_TEMPORARY_CONTENT_DEINIT, NULL); + + path_deinit_subsystem(); + command_event(CMD_EVENT_RECORD_DEINIT, NULL); + command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); + + rarch_ctl(RARCH_CTL_UNSET_BLOCK_CONFIG_READ, NULL); + rarch_ctl(RARCH_CTL_UNSET_SRAM_LOAD_DISABLED, NULL); + rarch_ctl(RARCH_CTL_UNSET_SRAM_SAVE_DISABLED, NULL); + rarch_ctl(RARCH_CTL_UNSET_SRAM_ENABLE, NULL); + rarch_ctl(RARCH_CTL_UNSET_BPS_PREF, NULL); + rarch_ctl(RARCH_CTL_UNSET_IPS_PREF, NULL); + rarch_ctl(RARCH_CTL_UNSET_UPS_PREF, NULL); + rarch_ctl(RARCH_CTL_UNSET_PATCH_BLOCKED, NULL); + runloop_overrides_active = false; + + core_unset_input_descriptors(); + + global = global_get_ptr(); + path_clear_all(); + dir_clear_all(); + memset(global, 0, sizeof(struct global)); + retroarch_override_setting_free_state(); +} + + static void retroarch_print_features(void) { puts(""); @@ -902,10 +966,7 @@ static void retroarch_parse_input(int argc, char *argv[]) break; case RA_OPT_MAX_FRAMES: - { - unsigned max_frames = (unsigned)strtoul(optarg, NULL, 10); - runloop_ctl(RUNLOOP_CTL_SET_MAX_FRAMES, &max_frames); - } + runloop_max_frames = (unsigned)strtoul(optarg, NULL, 10); break; case RA_OPT_SUBSYSTEM: @@ -1208,7 +1269,6 @@ error: return false; } - bool rarch_ctl(enum rarch_ctl_state state, void *data) { static bool rarch_is_sram_load_disabled = false; @@ -1278,12 +1338,12 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) rarch_block_config_read = false; rarch_force_fullscreen = false; - runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_DEINIT, NULL); + retroarch_msg_queue_deinit(); driver_ctl(RARCH_DRIVER_CTL_UNINIT_ALL, NULL); command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL); - runloop_ctl(RUNLOOP_CTL_GLOBAL_FREE, NULL); + global_free(); runloop_ctl(RUNLOOP_CTL_DATA_DEINIT, NULL); config_free(); break; @@ -1299,7 +1359,9 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) config_init(); - runloop_ctl(RUNLOOP_CTL_CLEAR_STATE, NULL); + driver_ctl(RARCH_DRIVER_CTL_DEINIT, NULL); + runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL); + global_free(); break; case RARCH_CTL_MAIN_DEINIT: if (!rarch_ctl(RARCH_CTL_IS_INITED, NULL)) @@ -1344,7 +1406,7 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) input_config_set_device(i, RETRO_DEVICE_JOYPAD); } runloop_ctl(RUNLOOP_CTL_HTTPSERVER_INIT, NULL); - runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_INIT, NULL); + retroarch_msg_queue_init(); break; case RARCH_CTL_SET_PATHS_REDIRECT: { @@ -1770,6 +1832,7 @@ global_t *global_get_ptr(void) return &g_extern; } + void runloop_msg_queue_push(const char *msg, unsigned prio, unsigned duration, bool flush) @@ -2024,47 +2087,6 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) runloop_autosave = false; runloop_ctl(RUNLOOP_CTL_FRAME_TIME_FREE, NULL); break; - case RUNLOOP_CTL_GLOBAL_FREE: - { - global_t *global = NULL; - command_event(CMD_EVENT_TEMPORARY_CONTENT_DEINIT, NULL); - - path_deinit_subsystem(); - command_event(CMD_EVENT_RECORD_DEINIT, NULL); - command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); - - rarch_ctl(RARCH_CTL_UNSET_BLOCK_CONFIG_READ, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_LOAD_DISABLED, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_SAVE_DISABLED, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_ENABLE, NULL); - rarch_ctl(RARCH_CTL_UNSET_BPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_IPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_UPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_PATCH_BLOCKED, NULL); - runloop_overrides_active = false; - - core_unset_input_descriptors(); - - global = global_get_ptr(); - path_clear_all(); - dir_clear_all(); - memset(global, 0, sizeof(struct global)); - retroarch_override_setting_free_state(); - } - break; - case RUNLOOP_CTL_CLEAR_STATE: - driver_ctl(RARCH_DRIVER_CTL_DEINIT, NULL); - runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL); - runloop_ctl(RUNLOOP_CTL_GLOBAL_FREE, NULL); - break; - case RUNLOOP_CTL_SET_MAX_FRAMES: - { - unsigned *ptr = (unsigned*)data; - if (!ptr) - return false; - runloop_max_frames = *ptr; - } - break; case RUNLOOP_CTL_IS_IDLE: return runloop_idle; case RUNLOOP_CTL_SET_IDLE: @@ -2085,37 +2107,6 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) break; case RUNLOOP_CTL_IS_PAUSED: return runloop_paused; - case RUNLOOP_CTL_MSG_QUEUE_DEINIT: - if (!runloop_msg_queue) - return true; - -#ifdef HAVE_THREADS - slock_lock(_runloop_msg_queue_lock); -#endif - - msg_queue_free(runloop_msg_queue); - -#ifdef HAVE_THREADS - slock_unlock(_runloop_msg_queue_lock); -#endif - -#ifdef HAVE_THREADS - slock_free(_runloop_msg_queue_lock); - _runloop_msg_queue_lock = NULL; -#endif - - runloop_msg_queue = NULL; - break; - case RUNLOOP_CTL_MSG_QUEUE_INIT: - runloop_ctl(RUNLOOP_CTL_MSG_QUEUE_DEINIT, NULL); - runloop_msg_queue = msg_queue_new(8); - retro_assert(runloop_msg_queue); - -#ifdef HAVE_THREADS - _runloop_msg_queue_lock = slock_new(); - retro_assert(_runloop_msg_queue_lock); -#endif - break; case RUNLOOP_CTL_TASK_INIT: { #ifdef HAVE_THREADS diff --git a/retroarch.h b/retroarch.h index bea653751a..33e47543a6 100644 --- a/retroarch.h +++ b/retroarch.h @@ -176,8 +176,6 @@ enum runloop_ctl_state RUNLOOP_CTL_IS_PAUSED, RUNLOOP_CTL_SET_PAUSED, - RUNLOOP_CTL_SET_MAX_FRAMES, - RUNLOOP_CTL_GLOBAL_FREE, RUNLOOP_CTL_SET_CORE_SHUTDOWN, @@ -185,7 +183,6 @@ enum runloop_ctl_state RUNLOOP_CTL_IS_SHUTDOWN, /* Runloop state */ - RUNLOOP_CTL_CLEAR_STATE, RUNLOOP_CTL_STATE_FREE, /* Performance counters */ @@ -199,10 +196,6 @@ enum runloop_ctl_state RUNLOOP_CTL_KEY_EVENT_GET, RUNLOOP_CTL_DATA_DEINIT, - /* Message queue */ - RUNLOOP_CTL_MSG_QUEUE_INIT, - RUNLOOP_CTL_MSG_QUEUE_DEINIT, - /* Core options */ RUNLOOP_CTL_HAS_CORE_OPTIONS, RUNLOOP_CTL_GET_CORE_OPTION_SIZE, From 9b1e66d302c7982e598a9d523a79b26ed5e2c2cc Mon Sep 17 00:00:00 2001 From: aliaspider Date: Thu, 11 May 2017 17:41:27 +0100 Subject: [PATCH 033/274] correct the mask used on the first byte in utf8_walk. fixes #4892 --- libretro-common/encodings/encoding_utf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libretro-common/encodings/encoding_utf.c b/libretro-common/encodings/encoding_utf.c index 76fca8dfb8..c4ec8fd7a8 100644 --- a/libretro-common/encodings/encoding_utf.c +++ b/libretro-common/encodings/encoding_utf.c @@ -218,10 +218,10 @@ uint32_t utf8_walk(const char **string) ret = (ret<<6) | (utf8_walkbyte(string) & 0x3F); if (first >= 0xF0) - return ret | (first&31)<<18; + return ret | (first&7)<<18; if (first >= 0xE0) return ret | (first&15)<<12; - return ret | (first&7)<<6; + return ret | (first&31)<<6; } static bool utf16_to_char(uint8_t **utf_data, From aa55ab4866e4c356cde8b0203fac94844d6f3acc Mon Sep 17 00:00:00 2001 From: gouchi Date: Thu, 11 May 2017 20:59:25 +0200 Subject: [PATCH 034/274] =?UTF-8?q?Update=20Russian=20translation=20courte?= =?UTF-8?q?sy=20of=20Andrei=20=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- intl/msg_hash_ru.h | 1643 ++++++++++++++++++++++---------------------- 1 file changed, 821 insertions(+), 822 deletions(-) diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index ea717c26a2..83709e66db 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -1,4 +1,4 @@ -#if defined(_MSC_VER) && !defined(_XBOX) +#if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") #endif @@ -9,31 +9,31 @@ MSG_HASH( ) MSG_HASH( MSG_UNKNOWN_COMPILER, - "Неизвестный Компилятор" + "Неизвестный компилятор" ) MSG_HASH( MSG_DEVICE_DISCONNECTED_FROM_PORT, - "Device disconnected from port" + "Устройство отключено от порта" ) MSG_HASH( MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, - "Unknown netplay command received" + "Неизвестная команда netplay" ) MSG_HASH( MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, - "File already exists. Saving to backup buffer" + "Файл уже существует. Сохранение в резервном буфере" ) MSG_HASH( MSG_GOT_CONNECTION_FROM, - "Got connection from: \"%s\"" + "Установленно соединение с: \"%s\"" ) MSG_HASH( MSG_GOT_CONNECTION_FROM_NAME, - "Got connection from: \"%s (%s)\"" + "Установленно соединение с: \"%s (%s)\"" ) MSG_HASH( MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, - "No arguments supplied and no menu builtin, displaying help..." + "Нет аргументов и встроенного меню,отображается справка..." ) MSG_HASH( MSG_NETPLAY_USERS_HAS_FLIPPED, @@ -41,55 +41,55 @@ MSG_HASH( ) MSG_HASH( MSG_SETTING_DISK_IN_TRAY, - "Setting disk in tray" + "Установка диска в привод" ) MSG_HASH( MSG_WAITING_FOR_CLIENT, - "Ожидание клиент..." + "Ожидание клиента ..." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, - "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." + "Предоставьте аппаратно-рендерированным ядрам собственный контекст.Избегайте принятия изменений состояния оборудования между кадрами." ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SETTINGS, - "Adjusts settings related to the appearance of the menu screen." + "Настройка параметров, относящихся к внешнему виду экрана меню." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, - "Hard-synchronize the CPU and GPU. Reduces latency at the cost of performance." + "Синхронизируйте CPU и GPU.Это улучшит производительность." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_THREADED, - "Improves performance at the cost of latency and more video stuttering. Use only if you cannot obtain full speed otherwise." + "Повышает производительность за счёт понижения количества кадров в секунду. Использовать только когда другие способы не сработали." ) MSG_HASH( MSG_AUDIO_VOLUME, - "Громкость" + "Громкость звука" ) MSG_HASH( MSG_AUTODETECT, - "Autodetect" + "Определять автоматически" ) MSG_HASH( MSG_AUTOLOADING_SAVESTATE_FROM, - "Auto-loading savestate from" + "Автозагрузка из" ) MSG_HASH( MSG_CAPABILITIES, - "Capabilities" + "Возможности" ) MSG_HASH( MSG_CONNECTING_TO_NETPLAY_HOST, - "Connecting to netplay host" + "Подключение к netplay" ) MSG_HASH( MSG_CONNECTING_TO_PORT, - "Connecting to port" + "Подключение к порту" ) MSG_HASH( MSG_CONNECTION_SLOT, - "Connection slot" + "Слот подключения" ) MSG_HASH( MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, @@ -101,76 +101,77 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, - "Accounts Cheevos" + "Аккаунт Cheevos" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, - "Имя" + "Имя пользователя" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, - "Accounts" + "Аккаунты" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END, - "Accounts List Endpoint" + "Аккаунт лист Endpoint" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Retro Achievements" + "Достижения" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, - "Achievement List" + "Список достижений" ) + MSG_HASH( MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, - "Achievement List (Hardcore)" + "Список достижений (Hardcore)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, - "Scan Content" + "Результат сканирования" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST, - "Configurations" + "Конфигурации" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TAB, - "Import content" + "Импорт содержимого" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, - "Ask" + "Спрашивать" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, - "Assets" + "Активы" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, - "Block Frames" + "Блокировка фреймов" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, - "Audio Device" + "Аудио-устройство" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, - "Audio Driver" + "Аудио драйвер" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, - "Audio DSP Plugin" + "Аудио DSP Plugin" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, - "Audio Enable" + "Включить звук" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, - "Audio Filter" + "Аудио фильтр" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, @@ -178,47 +179,47 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, - "Audio Latency (ms)" + "Задержка звука (ms)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW, - "Audio Maximum Timing Skew" + "Максимальный тайминг синхронизации аудио-сигнала" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MUTE, - "Audio Mute" + "Выключить звук" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, - "Audio Output Rate (Hz)" + "Частота аудиовыхода (KHz)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, - "Dynamic Audio Rate Control" + "Динамический контроль скорости звука" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER, - "Audio Resampler Driver" + "Драйвер аудиоразъема" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, - "Audio" + "Аудио" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_SYNC, - "Audio Sync" + "Синхронизация звука" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, - "Audio Volume Level (dB)" + "Уровень громкости звука (dB)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, - "SaveRAM Autosave Interval" + "Интервал авто-сохранений" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, - "Load Override Files Automatically" + "Переопределить файлы загрузки" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, @@ -226,7 +227,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, - "Load Shader Presets Automatically" + "Автоматическая загрузка преднастройки шейдеров" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, @@ -238,19 +239,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, - "Информация" + "Инфо" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT, - "Выход" + "Выйти" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, - "Scroll Down" + "Прокрутить вниз" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, - "Scroll Up" + "Прокрутить вверх" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, @@ -258,63 +259,63 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD, - "Toggle Keyboard" + "Переключить клавиатуру" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, - "Toggle Menu" + "Переключить меню" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS, - "Basic menu controls" + "Базовые элементы управления меню" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM, - "Confirm/OK" + "Подтвердить" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO, - "Информация" + "Инфо" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT, - "Выход" + "Выйти" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, - "Scroll Up" + "Прокрутить вверх" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START, - "Defaults" + "По умолчанию" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, - "Toggle Keyboard" + "Переключить клавиатуру" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU, - "Toggle Menu" + "Переключить меню" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, - "Don't overwrite SaveRAM on loading savestate" + "Не перезаписывать SaveRAM при загрузке сохранений" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, - "Bluetooth Enable" + "Bluetooth Включить" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, - "Buildbot Assets URL" + "Создание ботов URL" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, - "Cache" + "Кэш" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, - "Allow Camera" + "Разрешить использовать камеру" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, @@ -322,31 +323,31 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT, - "Cheat" + "Чит" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, - "Apply Cheat Changes" + "Применить изменения чита" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, - "Cheat File" + "Чит-файл" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE, - "Cheat File" + "Чит-файл" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, - "Load Cheat File" + "Загрузить чит-файл" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, - "Save Cheat File As" + "Сохранить чит файл как:" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, - "Cheat Passes" + "Пропуск чита" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, @@ -354,31 +355,31 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, - "Achievements Hardcore Mode" + "Достижения в Hardcore Mode" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, - "Locked Achievements:" + "Заблокированные Достижения:" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, - "Locked" + "Заблокировано" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, - "Retro Achievements" + "Достижения" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, - "Test Unofficial Achievements" + "Тестовые Неофициальные Достижения" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, - "Unlocked Achievements:" + "Разблокированные достижения:" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, - "Unlocked" + "Разблокирован" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, @@ -386,27 +387,27 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG, - "Config" + "Конфигурация" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, - "Загрузить настройки" + "Загрузить конфигурацию" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS, - "Настройки" + "Конфигурация" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, - "Сохранять настройки при выходе" + "Сохранить конфигурацию и выйти" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, - "Collections" + "Коллекции" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, - "Content Database" + "База Данных контента" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DIR, @@ -414,367 +415,367 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, - "History List Size") + "Размер списка истории") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, - "Быстрое меню") + "Выйти из меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, - "Core Assets") + "Основные средства") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, "Загрузки") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, - "Cheats") + "Читы") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_COUNTERS, - "Core Counters") + "Основной счётчик") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ENABLE, - "Показать имя ядра") + "Отобразить имя основного средства") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFORMATION, - "Информация об ядре") + "Основная информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS, "Авторы") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES, "Категории") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL, - "Метка ядра") + "Символ ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME, "Имя ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, - "Прошивка(и)") + "Микропрограммы") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES, - "Лицензия") + "Лицензии") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS, "Разрешения") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS, "Поддерживаемые расширения") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER, - "System manufacturer") + "Разработчик системы") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME, - "Системное имя") + "Имя системы") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, - "Управление") + "Элементы управления") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_LIST, - "Загрузить ядро") + "Загрузка ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, "Опции") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS, "Ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, - "Запуск ядра автоматически") + "Автоматически запускать ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, - "Automatically extract downloaded archive") + "Автоматически извлечь загруженный архив") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, - "Buildbot Cores URL") + "Создание ботов URL") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, "Обновление ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, - "Updater") + "Обновление") MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE, - "Архитектура процессора:") + "Архитектура CPU:") MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_CORES, - "Количество ядер процессора:") + "Ядра CPU:") MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY, "Курсор") MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER, - "Cursor Manager") + "Курсор менеджер") MSG_HASH(MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, - "Custom Ratio") + "Дополнительное значение") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER, - "Database Manager") + "Менеджер баз данных") MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_SELECTION, - "Database Selection") + "Выбор баз данных") MSG_HASH(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY, - "Убрать") + "Удаление") MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES, - "Favorites") + "Избранное") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, - "") + "<Каталог содержимого>") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, - "") + "<По умолчанию>") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, - "") + "<Нет>") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, - "Directory not found.") + "Каталог не найден.") MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, - "Directory") + "Каталог") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, - "Disk Cycle Tray Status") + "Статус диска в приводе") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, - "Disk Image Append") + "Добавить образ диска") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX, - "Disk Index") + "Индекс диска") MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS, - "Disk Control") + "Управление диском") MSG_HASH(MENU_ENUM_LABEL_VALUE_DONT_CARE, - "Don't care") + "Не важно") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, "Загрузки") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, - "Загрузить ядро...") + "Загрузка ядра...") MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, - "Content Downloader") + "Загрузка содержимого") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, - "DPI Override Enable") + "Разрешить переопределение DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, - "DPI Override") + "DPI Переопределение") MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, "Драйвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, - "Load Dummy on Core Shutdown") + "Загрузка макета при выключении ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, - "Dynamic Wallpaper") + "Динамические обои") MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, - "Dynamic Wallpapers") + "Динамические обои") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, - "Enable Achievements") + "Включить достижения") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, - "Menu entry hover color") + "Цвет наведения указателя меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR, - "Menu entry normal color") + "Нормальный цвет ввода в меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_FALSE, - "False") + "Выключено") MSG_HASH(MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, - "Maximum Run Speed") + "Максимальная рабочая скорость") MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, - "Display Framerate") + "Вывести значение FPS на экран") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, - "Limit Maximum Run Speed") + "Ограничить максимальную скорость работы") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, - "Frame Throttle") + "Настройка частоты кадров") MSG_HASH(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, - "Frontend Counters") + "Внешние счетчики") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, - "Load Content-Specific Core Options Automatically") + "Автоматически загружать основные параметры") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, - "Create game-options file") + "Создать файл параметров игры") MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, - "Game-options file") + "Файл параметров игры") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, - "помощь") + "Помощь") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, - "Audio/Video Troubleshooting") + "Устранение проблем с аудио / видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, - "Changing Virtual Gamepad Overlay") + "Изменение обложки виртуального геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, - "Basic Menu Controls") + "Основные элементы управления меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LIST, "Помощь") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, - "Loading Content") + "Загрузка содержимого") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, - "Scanning For Content") + "Сканирование содержимого") MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, - "What Is A Core?") + "Что такое ядро?") MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, - "History List Enable") + "Список истории включен") MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_TAB, - "History") + "История") MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, - "Horizontal Menu") + "Горизонтальное меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_IMAGES_TAB, - "Image") + "Образ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION, - "Информация") + "информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, "Информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, - "Analog To Digital Type") + "Аналого-цифровой тип") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, - "All Users Control Menu") + "Все пользователи управляющие меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, - "Left Analog X") + "Левый аналог ось - X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, - "Left analog X- (left)") + "Левый аналог ось - X (влево)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, - "Left analog X+ (right)") + "Левый аналог ось - X+ (вправо)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, - "Left Analog Y") + "Левый аналог ось - Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, - "Left analog Y- (up)") + "Левый аналог ось - Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, - "Left analog Y+ (down)") + "Левый аналог ось - Y+ (вниз)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, - "Right Analog X") + "Правый аналог ось - X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, - "Right analog X- (left)") + "Правый аналог ось - X- (влево)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, - "Right analog X+ (right)") + "Правый аналог ось - X + (вправо)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, - "Right Analog Y") + "Правый аналог ось - Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, - "Right analog Y- (up)") + "Правый аналог ось - Y- (вверх)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, - "Right analog Y+ (down)") + "Правый аналог ось - Y+ (вниз)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, - "Autoconfig Enable") + "Авто-конфигурация включена") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, - "Analog Stick Deadzone") + "Мертвая зона у стиков") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, - "Menu Swap OK & Cancel Buttons") + "Сменить функции кнопок") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, - "Bind All") + "Скрепить всё") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, - "Bind Default All") + "Скрепить все по умолчанию") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, - "Bind Timeout") + "Тайм-аут привязки") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, - "Hide Unbound Core Input Descriptors") + "Скрыть несвязанные входные дескрипторы ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW, - "Display Input Descriptor Labels") + "Отображать ярлыки дескрипторов ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, - "Device Index") + "Индекс устройства") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, - "Device Type") + "Тип устройства") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DRIVER, - "Input Driver") + "Ввод драйвера") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE, - "Duty Cycle") + "Рабочий цикл") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, - "Input Hotkey Binds") + "Связывание горячих клавиш ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE, - "Keyboard Gamepad Mapping Enable") + "Клавиатура и геймпад включены") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, - "A button (right)") + "Кнопка A ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, - "B button (down)") + "Кнопка B ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, - "Down D-pad") + "Крестовина ВНИЗ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, - "L2 button (trigger)") + "Кнопка L2 ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, - "L3 button (thumb)") + "Кнопка L3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, - "L button (shoulder)") + "Кнопка L ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, - "Left D-pad") + "Крестовина ВЛЕВО") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, - "R2 button (trigger)") + "Кнопка R2") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, - "R3 button (thumb)") + "Кнопка R3") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, - "R button (shoulder)") + "Кнопка R") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, - "Right D-pad") + "Крестовина ВПРАВО") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, - "Select button") + "Кнопка SELECT") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, - "Start button") + "Кнопка START") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, - "Up D-pad") + "Крестовина ВВЕРХ") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, - "X button (top)") + "Кнопка X") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, - "Y button (left)") + "Кнопка Y") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, - "(Key: %s)") + "(Ключ: %s)") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, - "Keyboard Gamepad Mapping Type") + "Тип отображения клавиатуры для геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, - "Max Users") + "Максимум пользователей") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Menu Toggle Gamepad Combo") + "Переключать меню геймпадом") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, "Cheat index -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, "Cheat index +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, - "Cheat toggle") + "Переключить чит") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, - "Disk eject toggle") + "Извлечь диск") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, - "Disk next") + "Следующий диск") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, - "Disk prev") + "Предыдущий диск") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, - "Enable hotkeys") + "EВключить горячие клавиши") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, - "Fast forward hold") + "Ускоренная перемотка вперед") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, - "Fast forward toggle") + "Быстрая перемотка вперед") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, - "Frameadvance") + "Дополнительные фреймы") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, - "Полный экран/окно") + "На весь экран") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, - "Grab mouse toggle") + "Переключатель мыши") 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, - "Movie record toggle") + "Переключатель записи видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, - "Audio mute toggle") + "Отключения звука") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, - "Netplay flip users") + "Netplay отразить пользователей") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, - "On-screen keyboard toggle") + "Переключение экранной клавиатуры") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, - "Overlay next") + "Наложение поверх") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, - "Pause toggle") + "Приостановить переключение") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, - "Quit RetroArch") + "Выход из RetroArch") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, - "Сброс игры") + "Сбросить игру") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, - "Rewind") + "Перемотка назад") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, - "Save state") + "Сохранить состояние") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, - "Снять скриншот") + "Сделать скриншот") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, - "Next shader") + "Следующий шейдер") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, - "Previous shader") + "Предыдущий шейдер") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, - "Slow motion") + "Замедленная съемка") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, - "Savestate slot -") + "Сохранять слот -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, - "Savestate slot +") + "Сохранять слот +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, - "Volume -") + "Громкость -") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, - "Volume +") + "Громкость +") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, - "Display Overlay") + "Отобразить наложение") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, - "Hide Overlay In Menu") + "Скрыть наложение в меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, - "Poll Type Behavior") + "Тип поведения") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, - "Early") + "Раньше") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE, - "Late") + "Позже") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL, - "Normal") + "Нормально") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, - "Prefer Front Touch") + "Предпочительно переднее касание") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, - "Input Remapping") + "Переопределение ввода") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, - "Remap Binds Enable") + "Включить замену привязок") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, - "Save Autoconfig") + "Сохранить авто-конфигурацию") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, - "Input") + "Ввод") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, - "Small Keyboard Enable") + "Включить малую клавиатуру") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, - "Touch Enable") + "Включить касание") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, - "Turbo enable") + "Турбо-режим включить") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, - "Turbo Period") + "Турбо-период") MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, - "Input User %u Binds") + "Вход пользователя% u Binds") MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, - "Internal storage status") + "Состояние внутренней памяти") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, - "Input Autoconfig") + "Ввод авто-конфига") MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, - "Joypad Driver") + "Драйвер геймпада") MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, - "Services") + "Сервисы") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, "Chinese (Simplified)") MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL, @@ -808,301 +809,301 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, "Vietnamese") MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, - "Left Analog") + "Левый аналог") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, "Ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "Core Info") + "Ядро инфо") MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, - "Core Logging Level") + "Уровень ведения журнала") MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, - "Linear") + "Линейный") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE, - "Load Archive") + "Загрузить архив") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, - "Load Recent") + "Загрузить последние") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, - "Load Content") + "Загрузить контент") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, - "Load State") + "Состояние загрузки") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, - "Allow Location") + "Разрешить местоположение") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, - "Location Driver") + "Местоположение") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, - "Logging") + "Ввод логина") MSG_HASH(MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, - "Logging Verbosity") + "Ведение журнала") MSG_HASH(MENU_ENUM_LABEL_VALUE_MAIN_MENU, - "Главное меню") + "Моё меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MANAGEMENT, - "Database Settings") + "Настройки баз данных") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, - "Menu Color Theme") + "Цветовая тема меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE, "Синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY, - "Светло синий") + "Серо-голубой") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE, - "Темно синий") + "Тёмно-синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN, - "Зеленый") + "Зелёный") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD, - "Shield") + "Щит") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, "Красный") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW, - "Желтый") + "Жёлтый") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, - "Footer Opacity") + "Непрозрачность нижнего колонтитула") MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, - "Header Opacity") + "Непрозрачность заголовка") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DRIVER, - "Menu Driver") + "Драйвер меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, - "Throttle Menu Framerate") + "Максимальная частота кадров меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, - "Settings") + "Настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, - "Menu Linear Filter") + "Линейный фильтр меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, "Меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, - "Фон") + "Задний фон") MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, - "Background opacity") + "Непрозрачность фона") MSG_HASH(MENU_ENUM_LABEL_VALUE_MISSING, - "Missing") + "Отсутствует") MSG_HASH(MENU_ENUM_LABEL_VALUE_MORE, "...") MSG_HASH(MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, "Поддержка мыши") MSG_HASH(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, - "Multimedia") + "Мультимедия") MSG_HASH(MENU_ENUM_LABEL_VALUE_MUSIC_TAB, "Музыка") MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Filter unknown extensions") + "Фильтрация неизвестных расширений") MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, - "Navigation Wrap-Around") + "Навигация автоматической-прокруткой") MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, - "Nearest") + "Ближайший") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, "Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, - "Netplay Check Frames") + "Проверка фреймов Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT, - "Netplay P2 Uses C1") + "Netplay P2 использует C1") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, - "Netplay Delay Frames") + "Задержка кадров Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, - "Disconnect") + "Отключено") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, - "Netplay Enable") + "Включить Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, - "Connect to Netplay host") + "Подключение к Netplay-хосту") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, - "Start hosting") + "Старт хостинг") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, - "Server Address") + "Адрес сервера") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_MODE, - "Netplay Client Enable") + "Включить клиент Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, - "Username") + "Имя пользователя") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, - "Netplay settings") + "Настройки Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, - "Netplay Spectator Enable") + "Включить режим зрителя в Netplay") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, - "Netplay TCP/UDP Port") + "Порт Netplay TCP / UDP") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, - "Network Commands") + "Сетевые команды") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, - "Network Command Port") + "Сетевой командный порт") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION, - "Network Information") + "Информация о сети") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE, - "Network Gamepad") + "Сетевой геймпад") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT, - "Network Remote Base Port") + "Сетевой удаленный базовый порт") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, - "Network") + "Сеть") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO, - "No") + "Нет") MSG_HASH(MENU_ENUM_LABEL_VALUE_NONE, - "None") + "Отсутствует") MSG_HASH(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE, "N/A") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY, - "No achievements to display.") + "Никаких достижений для показа.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE, - "Нет ядра") + "Без ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE, - "No cores available.") + "Нет доступных ядер.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE, - "No core information available.") + "Нет информации о ядре.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE, - "No core options available.") + "Нет доступных опций ядра.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY, - "No entries to display.") + "Нет записей для отображения.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE, - "No history available.") + "История недоступна.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, - "No information is available.") + "Нет информации.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ITEMS, - "No items.") + "Нет элементов.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, - "No performance counters.") + "Нет счетчиков производительности.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, - "No playlists.") + "Нет плейлистов.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, - "No playlist entries available.") + "Нет доступных записей в плейлисте.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, - "No settings found.") + "Настройки не найдены.") MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, - "No shader parameters.") + "Нет параметров шейдера.") MSG_HASH(MENU_ENUM_LABEL_VALUE_OFF, - "OFF") + "ВЫКЛ") MSG_HASH(MENU_ENUM_LABEL_VALUE_ON, - "ON") + "ВКЛ") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE, - "Online") + "Онлайн") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, - "Обновление по интернету") + "Онлайн-обновление") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, - "Onscreen Display") + "Экранное отображение") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, - "Onscreen Overlay") + "Экранное наложение") MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, - "Onscreen Notifications") + "Экранные уведомления") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, - "Browse Archive") + "Обзор архива") MSG_HASH(MENU_ENUM_LABEL_VALUE_OPTIONAL, - "Optional") + "Опционально") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY, - "Overlay") + "Наложение") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, - "Autoload Preferred Overlay") + "Автозагрузка наложения") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY, - "Overlay") + "Наложение") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, - "Overlay Opacity") + "Наложение преднастроек") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, - "Overlay Preset") + "Масштаб наложения") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE, "Overlay Scale") MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS, - "Onscreen Overlay") + "Экранное наложение") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, - "Use PAL60 Mode") + "Использовать режим PAL60") MSG_HASH(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, - "Parent directory") + "Родительский каталог") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, - "Pause when menu activated") + "Пауза при активации меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, - "Don't run in background") + "Не работать в фоновом режиме") MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, - "Performance Counters") + "Счетчики производительности") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, - "Playlists") + "Плейлисты") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, - "Playlist") + "Плейлист") MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, - "Playlists") + "Плейлисты") MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, - "Touch Support") + "Поддержка Touch") MSG_HASH(MENU_ENUM_LABEL_VALUE_PORT, - "Port") + "Порт") MSG_HASH(MENU_ENUM_LABEL_VALUE_PRESENT, - "Present") + "Отображать") MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, - "Privacy") + "Конфиденциальность") MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, - "Quit RetroArch") + "Выход из RetroArch") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, - "Analog supported") + "Поддерживается аналоговый сигнал") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, - "BBFC Rating") + "Рейтинг BBFC") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING, - "CERO Rating") + "Рейтинг CERO") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP, - "Co-op supported") + "Кооператив поддерживается") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32, "CRC32") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION, - "Description") + "Описание") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER, - "Developer") + "Разработчик") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, - "Edge Magazine Issue") + "Проблема журнала Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING, - "Edge Magazine Rating") + "Рейтинг журнала Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, - "Edge Magazine Review") + "Обзор журнала Edge") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING, - "ELSPA Rating") + "Рейтинг ELSPA") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW, - "Enhancement Hardware") + "Оборудование для улучшения") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING, - "ESRB Rating") + "Рейтинг ESRB") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, - "Famitsu Magazine Rating") + "Рейтинг журнала Famitsu") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE, - "Franchise") + "Франчайзинг") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE, - "Genre") + "Жанр") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5, "MD5") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME, - "Name") + "Имя") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN, - "Origin") + "Происхождение") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING, - "PEGI Rating") + "Рейтинг PEGI") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER, - "Publisher") + "Издатель") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, - "Releasedate Month") + "Месяц выхода") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, - "Releasedate Year") + "Год выхода") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE, - "Rumble supported") + "Rumble поддерживается") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL, - "Serial") + "Серия") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1, "SHA1") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, - "Start Content") + "Запустить контент") MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, - "TGDB Rating") + "Рейтинг TGDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, - "Перезагрузка") + "Перезагрузить") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, - "Recording Config") + "Конфигурация записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, - "Recording Output") + "Выход записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, - "Recording") + "Запись") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, - "Load Recording Config...") + "Загрузка конфигурации записи...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, - "Record Driver") + "Драйвер записи") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, - "Enable Recording") + "Включить запись") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, - "Save Output Recording as...") + "Сохранить запись вывода как ...") MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, - "Save Recordings in Output Dir") + "Сохранить записи в выходном каталоге") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, - "Remap File") + "Файл переназначения") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, - "Load Remap File") + "Загрузить файл переназначения") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, - "Save Core Remap File") + "Сохранить файл переопределения ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, - "Save Game Remap File") + "Сохранить файл переопределения игры") MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, - "Required") + "Необходимые") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, "Перезапуск") MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH, @@ -1112,609 +1113,607 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME, MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, "Продолжить") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROKEYBOARD, - "RetroKeyboard") + "Ретро-клавиатура") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD, - "RetroPad") + "Ретро-геймпад") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG, - "RetroPad w/ Analog") + "Ретро-геймпад с аналогами") MSG_HASH(MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, - "Achievements") + "Достижения") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, - "Rewind Enable") + "Включить перемотку назад") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, - "Rewind Granularity") + "Гранулярность перемотки") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, - "Rewind") + "Перемотка назад") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, - "File Browser") + "Браузер файлов") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, - "Config") + "Конфигурация") MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, - "Display Start Screen") + "Запуск записи экрана") MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, - "Right Analog") + "Правый аналог") MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, - "Run") + "Бег") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, - "SAMBA Enable") + "Включить SAMBA") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, - "Savefile") + "Сохранить файл") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, - "Save State Auto Index") + "Сохранить индекс автосостояния") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, - "Auto Load State") + "Автозагрузка") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, - "Auto Save State") + "Автосохранение") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, - "Savestate") + "Сохранить статистику") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, - "Save Current Configuration") + "Сохранить текущую конфигурацию") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, - "Save Core Overrides") + "Сохранить переопределения ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, - "Save Game Overrides") + "Сохранить переопределения игры") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, - "Save New Configuration") + "Сохранить новую конфигурацию") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_STATE, - "Save State") + "Сохранить статистику") MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, - "Saving") + "Сохранить") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, - "Scan Directory") + "Сканировать каталог") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_FILE, - "Scan File") + "Сканировать файл") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, - "") + "<Сканировать этот каталог>") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, - "Screenshot") + "Скриншот") MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, - "Screen Resolution") + "Разрешение экрана") MSG_HASH(MENU_ENUM_LABEL_VALUE_SEARCH, - "Search") + "Поиск") MSG_HASH(MENU_ENUM_LABEL_VALUE_SECONDS, - "seconds") + "секунды") MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS, - "Settings") + "Настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, - "Settings") + "Настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER, - "Shader") + "Шейдер") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, - "Apply Shader Changes") + "Применение изменений шейдера") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS, - "Shaders") + "Шейдеры") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, - "Ribbon") + "Лента") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, - "Ribbon (simplified)") + "Лента (упрощённая)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, - "Simple Snow") + "Простой снег") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, - "Snow") + "Снег") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, - "Show Advanced Settings") + "Показать дополнительные настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, - "Show Hidden Files and Folders") + "Показать скрытые файлы и папки") MSG_HASH(MENU_ENUM_LABEL_VALUE_SHUTDOWN, - "Shutdown") + "Неисправность") MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, - "Slow-Motion Ratio") + "Коэффициент замедленного движения ") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, - "Sort Saves In Folders") + "Сохранить сортировку в папках") MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, "Sort Savestates In Folders") MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, - "SSH Enable") + "SSH включён") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, - "Start Core") + "запустить ядро") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, - "Start Remote RetroPad") + "Запустить удаленный Ретро-геймпад") MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, - "Start Video Processor") + "Запустить видеопроцессор") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, - "State Slot") + "Статистика слота") MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, - "Status") + "Статус") MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, - "stdin Commands") + "Команды stdin") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, - "Suggested cores") + "Рекомендуемые ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, - "Suspend Screensaver") + "Приостановить экран") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, - "System BGM Enable") + "Включен режим BGM") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, - "System/BIOS") + "Система / BIOS") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, - "System Information") + "Системная информация") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, - "7zip support") + "Поддержка 7zip") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT, - "ALSA support") + "Поддержка ALSA") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE, - "Build date") + "Дата создания") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT, - "Cg support") + "Поддержка Cg") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT, - "Cocoa support") + "Поддержка Cocoa") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT, - "Command interface support") + "Поддержка командного интерфейса") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT, - "CoreText support") + "Поддержка CoreText") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, - "CPU Features") + "Особенности CPU") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, - "Display metric DPI") + "Отображать индекс DPI") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, - "Display metric height (mm)") + "Отображать высоту (mm)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, - "Display metric width (mm)") + "Отображать ширину (mm)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, - "DirectSound support") -MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, - "WASAPI support") + "Поддержка DirectSound") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT, - "Dynamic library support") + "Поддержка динамических библиотек") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT, - "Dynamic run-time loading of libretro library") + "Загрузка динамических библиотек во время выполнения") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT, - "EGL support") + "Поддержка EGL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, - "OpenGL/Direct3D render-to-texture (multi-pass shaders) support") + "Поддержка OpenGL/Direct3D рендеринга для текстур") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, - "FFmpeg support") + "Поддержка FFmpeg") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT, - "FreeType support") + "Поддержка FreeType") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER, - "Frontend identifier") + "Идентификатор внешнего интерфейса") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME, - "Frontend name") + "Имя внешнего интерфейса") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS, - "Frontend OS") + "Внешний интерфейс") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION, - "Git version") + "Версия Git") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT, - "GLSL support") + "Поддержка GLSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT, - "HLSL support") + "Поддержка HLSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT, - "JACK support") + "Поддержка JACK") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT, - "KMS/EGL support") + "поддержка KMS/EGL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, - "LibretroDB support") + "Поддержка LibretroDB") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, - "Libusb support") + "Поддержка Libusb") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, - "libxml2 XML parsing support") + "Поддержка синтаксического анализа libxml2 XML") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, - "Netplay (peer-to-peer) support") + "Поддержка Netplay (peer-to-peer)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, - "Network Command interface support") + "Поддержка сетевого командного интерфейса") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT, - "Network Gamepad support") + "Поддержка геймпада в сети") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT, - "OpenAL support") + "Поддержка OpenAL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT, - "OpenGL ES support") + "Поддержка OpenGL ES") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT, - "OpenGL support") + "Поддержка OpenGL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT, - "OpenSL support") + "Поддержка OpenSL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT, - "OpenVG support") + "Поддержка OpenVG") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, - "OSS support") + "Поддержка OSS") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, - "Overlay support") + "Поддержка Overlay") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, - "Power source") + "Источник питания") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, - "Charged") + "Заряжена") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, - "Charging") + "Заряжается ") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, - "Discharging") + "Разряжается") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, - "No source") + "Нет источника") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, - "PulseAudio support") + "Поддержка PulseAudio") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT, - "Python (script support in shaders) support") + "Поддержка Python (поддержка скриптов в шейдерах)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT, - "BMP support (RBMP)") + "Поддержка BMP(RBMP)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL, - "RetroRating level") + "Уровень RetroRating") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT, - "JPEG support (RJPEG)") + "Поддержка JPEG (RJPEG)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT, - "RoarAudio support") + "Поддержка RoarAudio") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT, - "PNG support (RPNG)") + "Поддержка PNG(RPNG)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT, - "RSound support") + "Поддержка RSound") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT, - "TGA support (RTGA)") + "Поддержка TGA(RTGA)") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, - "SDL2 support") + "Поддержка SDL2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT, - "SDL image support") + "Поддержка изображений SDL") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT, - "SDL1.2 support") + "Поддержка SDL1.2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, - "Slang support") + "Поддержка Slang") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT, - "Threading support") + "Поддержка Threading") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT, - "Udev support") + "Поддержка Udev") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, - "Video4Linux2 support") + "Поддержка Video4Linux2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER, - "Video context driver") + "Драйвер контекстного видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, - "Vulkan support") + "Поддержка Vulkan") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT, - "Wayland support") + "Поддержка Wayland") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT, - "X11 support") + "Поддержка X11") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT, - "XAudio2 support") + "Поддержка XAudio2") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT, - "XVideo support") + "Поддержка XVideo") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT, - "Zlib support") + "Поддержка Zlib") MSG_HASH(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, - "Take Screenshot") + "Сделать скриншот") MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, - "Threaded tasks") + "Реализованные задачи") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, - "Thumbnails") + "Миниатюры") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, - "Thumbnails") + "Миниатюры") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, - "Thumbnails Updater") + "Обновление эскизов") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, "Boxarts") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, - "Screenshots") + "Скриншоты") MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, - "Title Screens") + "Экраны заголовков") MSG_HASH(MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, - "Display time / date") + "Показывать время / дата") MSG_HASH(MENU_ENUM_LABEL_VALUE_TITLE_COLOR, - "Menu title color") + "Цвет заголовков в меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_TRUE, "True") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, - "UI Companion Enable") + "UI Companion включён") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, - "UI Companion Start On Boot") + "Включить UI Companion при загрузке") MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, - "Menubar") + "Строка меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, - "Unable to read compressed file.") + "Не удалось прочитать сжатый файл.") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, - "Undo Load State") + "Отменить загрузку") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, - "Undo Save State") + "Отменить сохранение") MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, - "Unknown") + "Неизвестно") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, - "Updater") + "Обновитель") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, - "Update Assets") + "Обновить активы") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Update Autoconfig Profiles") + "Обновить профили авто-конфигурации") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, - "Update Cg Shaders") + "Обновление Cg шейдеров") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, - "Update Cheats") + "Обновить читы") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, - "Update Core Info Files") + "Обновить основные информационные файлы") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES, - "Update Databases") + "Обновить базы данных") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS, - "Update GLSL Shaders") + "Обновить GLSL шейдеры") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA, - "Update Lakka") + "Обновить Lakka") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS, - "Update Overlays") + "Обновить Overlays") MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, - "Update Slang Shaders") + "Обновить сленговые шейдеры") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER, - "User") + "Пользователь") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, - "User Interface") + "Интерфейс пользователя") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, "Language") MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_SETTINGS, - "User") + "Пользователь") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, - "Use Builtin Image Viewer") + "Использовать встроенный просмотрщик изображений") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, - "Use Builtin Media Player") + "Использовать встроенный медиа-плеер") MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, - "") + "<Использовать этот катало>") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, - "Allow rotation") + "Разрешить вращение") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, - "Auto Aspect Ratio") + "Автоотношение сторон") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, - "Aspect Ratio") + "Соотношение сторон") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, - "Black Frame Insertion") + "Вставка черного кадра") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, - "Crop Overscan (Reload)") + "Обрезка обрезки (перезагрузка)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, - "Disable Desktop Composition") + "Отключить компоновку рабочего стола") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, - "Video Driver") + "Видео драйвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, - "Video Filter") + "Видео фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, - "Video Filter") + "Видео фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, - "Flicker filter") + "Мерцающий фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, - "Enable Onscreen Notifications") + "Onscreen Notification включить") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, - "Onscreen Notification Font") + "Экранный шрифт уведомления") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, - "Onscreen Notification Size") + "Размер уведомлений на экране") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, - "Force aspect ratio") + "Форсировать пропорции") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, - "Force-disable sRGB FBO") + "Принудительное отключение sRGB FBO") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, - "Frame Delay") + "Задержка кадра") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, - "Use Fullscreen Mode") + "Использовать полноэкранный режим") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, - "Video Gamma") + "Видео гамма") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, - "Use GPU Recording") + "Использовать GPU Recording") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, - "GPU Screenshot Enable") + "GPU Screenshot включен") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, - "Hard GPU Sync") + "GPU Sync максимум") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, - "Hard GPU Sync Frames") + "GPU Sync Frames максимум") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Max swapchain images") + "Максимальное количество образов свопчейнов") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "Onscreen Notification X Position") + "Позиция X по уведомлению на экране") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "Onscreen Notification Y Position") + "Позиция Y на экранном уведомлении") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, - "Monitor Index") + "Индекс монитора") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, - "Use Post Filter Recording") + "Использовать запись после фильтра") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, - "Vertical Refresh Rate") + "Вертикальная частота обновления") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, - "Estimated Screen Framerate") + "Оценочная частота экрана") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, - "Rotation") + "Вращение") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, - "Windowed Scale") + "Оконная шкала") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, - "Integer Scale") + "Целочисленная шкала") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, "Видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, - "Video Shader") + "Видео шейдер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, - "Shader Passes") + "Шейдерные проходы") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, - "Preview Shader Parameters") + "Предварительный просмотр параметров шейдера") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, - "Load Shader Preset") + "Загрузить предварительную настройку шейдера") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, - "Menu Shader Parameters") + "Параметры меню шейдера") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, - "Save Shader Preset As") + "Сохранить предустановку шейдера как") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, - "Save Core Preset") + "Сохранить предварительную настройку ядра") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, - "Save Game Preset") + "Сохранить предварительную настройку игры") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT, - "Enable Hardware Shared Context") + "Включить Hardware Shared Context") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH, - "Bilinear Filtering") + "Билинейная фильтрация") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER, - "Soft Filter Enable") + "Включён мягкий фильтр") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL, - "Vertical Sync (Vsync) Swap Interval") + "Интервал свопинга по вертикальной синхронизации") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_TAB, - "Video") + "Видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, - "Threaded Video") + "Количество потоков видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, - "Deflicker") + "Дефликер") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "Custom Viewport Height") + "Высота пользовательского видового экрана") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "Custom Viewport Width") + "Пользовательская ширина видового экрана") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, - "Custom Viewport X Pos.") + "Пользовательский видовой экран X Поз.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, - "Custom Viewport Y Pos.") + "Пользовательский видовой экран Y Поз.") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, - "Set VI Screen Width") + "Установить ширину экрана VI") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, - "Vertical Sync (Vsync)") + "Вертикальная синхронизация (Vsync)") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN, - "Windowed Fullscreen Mode") + "Полноэкранный режим") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, - "Вай-фай драйвер") + "Wi-Fi драйвер") MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, - "Вай-фай Wi-Fi") + "Wi-Fi") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, - "Menu Alpha Factor") + "Меню Alpha Factor") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_FONT, - "Шрифт меню") + "Шрифт") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM, - "Custom") + "Пользовательский") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, "FlatUI") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, - "Черно-белое") + "Монохромный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, - "Systematic") + "Систематический") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, "NeoActive") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, - "Pixel") + "Пиксель") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, "RetroActive") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, "Dot-Art") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, - "Menu Color Theme") + "Цветная тема меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, - "Apple Green") + "Зеленое яблоко") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, - "Dark") + "Темно") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, - "Dark Purple") + "Темно фиолетовый") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, - "Electric Blue") + "Электрический синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, - "Golden") + "Золотой") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, - "Legacy Red") + "Красный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, - "Midnight Blue") + "Темно-синий") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, - "Plain") + "Обычный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, - "Undersea") + "Водные глубины") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, - "Volcanic Red") + "Вулканический красный") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, - "Menu Shader Pipeline") + "Шейдерный канал меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, - "Menu Scale Factor") + "Масштаб в меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, - "Icon Shadows Enable") + "Тени иконок включена") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_HISTORY, - "Display History Tab") + "Показать вкладку история просмотров") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_IMAGES, - "Display Image Tab") + "Показать вкладку изображение") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_MUSIC, - "Display Music Tab") + "Показать вкладку музыка") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS, - "Display Settings Tab") + "Показать вкладку настройки") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_VIDEO, - "Display Video Tab") + "Показать вкладку видео") MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_THEME, - "Menu Icon Theme") + "Тема значка меню") MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, "Да") MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, - "Shader Preset") + "Предустановка шейдера") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, - "Enable or disable achievements. For more information, visit http://retroachievements.org") + "Включение или отключение достижений. Для получения дополнительной информации посетите страницу http://retroachievements.org") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, - "Enable or disable unofficial achievements and/or beta features for testing purposes.") + "Включение или отключение неофициальных достижений и / или бета-функций в целях тестирования.") MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, - "Enable or disable savestates, cheats, rewind, fast-forward, pause, and slow-motion for all games.") + "Включить или отключить сохранения, читы, перемотка назад, перемотка вперед, пауза и замедленное воспроизведение для всех игр.") MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, - "Change drivers for this system.") + "Изменение драйверов для этой системы.") MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, - "Change settings for the achievements.") + "Изменение настроек для достижений.") MSG_HASH(MENU_ENUM_SUBLABEL_CORE_SETTINGS, - "Change settings for the core.") + "Изменить настройки для ядра.") MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, - "Change settings for the recording.") + "Изменить настройки для записи.") MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, - "Change settings for display overlay, keyboard overlay and onscreen notifications.") + "Измените настройки отображения перекрытия, наложения клавиатуры и уведомлений на экране.") MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, - "Change settings for rewinding, fast-forwarding, and slow-motion.") + "Измените настройки для перемотки, быстрой перемотки и замедленного воспроизведения.") MSG_HASH(MENU_ENUM_SUBLABEL_SAVING_SETTINGS, - "Change settings for the saving.") + "Измените настройки для сохранения.") MSG_HASH(MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, - "Change settings for the logging.") + "Изменить настройки для ведения журнала.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, - "Change settings for the user interface.") + "Изменить настройки для пользовательского интерфейса.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, - "Change accounts, username, and language.") + "Измените учетные записи, имя пользователя и язык.") MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, - "Change your privacy settings.") + "Измените настройки конфиденциальности.") MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, - "Change default directories for this system.") + "Изменение каталогов по умолчанию для этой системы.") MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Change settings for the playlists.") + "Изменить настройки для списков воспроизведения.") MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, - "Configure server and network settings.") + "Настроить параметры сервера и сети.") MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, - "Scan contents and add to the database.") + "Сканировать содержимое и добавить в базу данных.") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SETTINGS, - "Adjusts settings for audio output.") + "Настройка параметров аудиовыхода.") MSG_HASH(MENU_ENUM_SUBLABEL_BLUETOOTH_ENABLE, - "Enable or disable bluetooth.") + "Включить или отключить Bluetooth.") MSG_HASH(MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, - "Saves changes to configuration file on exit.") + "Сохраняет изменения в файле конфигурации при выходе.") MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS, - "Change default settings for configuration files.") + "Измените настройки по умолчанию для файлов конфигурации.") MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATIONS_LIST, - "Manage and create configuration files.") + "Управление и создание файлов конфигурации.") MSG_HASH(MENU_ENUM_SUBLABEL_CPU_CORES, - "Amount of cores that the CPU has.") + "«Количество ядер CPU.") MSG_HASH(MENU_ENUM_SUBLABEL_FPS_SHOW, - "Displays the current framerate per second onscreen.") + "Отображает текущую частоту кадров в секунду на экране.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, - "Configure hotkey settings.") + "Настроить параметры горячих клавиш.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, - "Gamepad button combination to toggle menu.") + "Комбинация кнопок геймпада для переключения меню.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_SETTINGS, - "Adjusts settings for joypads, keyboard and mouse.") + "Настройки управления для джойстика, клавиатуры и мыши.") MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, - "Configure controls for this user.") + "Настройки элементов управления для этого пользователя.") MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, - "Enable or disable logging to the terminal.") + "Включить или отключить ведение журнала в терминале.") MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, - "Join or host a netplay session.") + "Присоединиться или создать сеанс netplay.") MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, - "Display core, network and system information.") + "Отображать информацию о ядре, сети и системе.") MSG_HASH(MENU_ENUM_SUBLABEL_ONLINE_UPDATER, - "Download add-ons, components and contents for RetroArch.") + "Загрузите надстройки, компоненты и содержимое для RetroArch.") MSG_HASH(MENU_ENUM_SUBLABEL_SAMBA_ENABLE, - "Enable or disable network sharing of your folders.") + "Включить или отключить сетевой доступ к папкам.") MSG_HASH(MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, - "Manage operating system level services.") + "Управление службами операционной системы.") MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, - "Show hidden files/directories inside the file browser.") + "Показывать скрытые файлы / каталоги внутри файлового менеджера.") MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, - "Enable or disable remote command line access.") + "Включить или отключить удаленный доступ к командной строке.") MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, - "Prevents your system's screensaver from becoming active.") + "Запрещается активация заставки вашей системы.") MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, - "Sets the language of the interface.") + "Устанавливает язык интерфейса.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, - "Inserts a black frame inbetween frames. Useful for users of 120 Hz screens who want to play 60 Hz material with eliminated ghosting.") + "Вставляет черную рамку между кадрами. Полезно для пользователей с экранами с частотой 120 Гц, которые хотят проигрывать материал с частотой 60 Гц с устраненным ореолом.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, - "Reduces latency at the cost of higher risk of video stuttering. Adds a delay after V-Sync (in ms).") + "Уменьшает задержку за счет более высокого риска заикания видео. Добавляет задержку после V-Sync (в мс).") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, - "Sets how many frames the CPU can run ahead of the GPU when using 'Hard GPU Sync'.") + "Устанавливает, сколько кадров процессор может запустить перед графическим процессором при использовании« Hard GPU Sync.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, - "Tells the video driver to explicitly use a specified buffering mode.") + "Указывает видеодрайверу какой режим буферизации использовать.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, - "Selects which display screen to use.") + "Выбирает, какой экран дисплея использовать.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, - "The accurate estimated refresh rate of the screen in Hz.") + "Точная оценка частоты обновления экрана в Гц.") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, - "Adjusts settings for video output.") + "Настройка параметров вывода видео.") MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, - "Scans for wireless networks and establishes connection.") + "Сканирует беспроводные сети и устанавливает соединение.") MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, - "Learn more about how it works.") + "Узнайте больше о том, как это работает.") MSG_HASH(MSG_APPENDED_DISK, "Вставлен диск") MSG_HASH(MSG_APPLICATION_DIR, - "Application Dir") + "Каталог приложений") MSG_HASH(MSG_APPLYING_CHEAT, - "Applying cheat changes.") + "Применение читов.") MSG_HASH(MSG_APPLYING_SHADER, "Применён шейдер") MSG_HASH(MSG_AUDIO_MUTED, @@ -1722,115 +1721,115 @@ MSG_HASH(MSG_AUDIO_MUTED, MSG_HASH(MSG_AUDIO_UNMUTED, "Звук вкл.") MSG_HASH(MSG_AUTOCONFIG_FILE_ERROR_SAVING, - "Error saving autoconf file.") + "Ошибка при сохранении файла авто-конфигурации.") MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, - "Autoconfig file saved successfully.") + "Файл авто-конфигурации успешно сохранен.") MSG_HASH(MSG_AUTOSAVE_FAILED, "Ошибка автосохранения.") MSG_HASH(MSG_AUTO_SAVE_STATE_TO, - "Auto save state to") + "Процесс авто-сохранения") MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, "Перезапись SRAM запрещена.") MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, - "Bringing up command interface on port") + "Вывод командного интерфейса на порт") MSG_HASH(MSG_BYTES, - "байт") + "Байт") MSG_HASH(MSG_CANNOT_INFER_NEW_CONFIG_PATH, - "Cannot infer new config path. Use current time.") + "Вывод командного интерфейса на порт.") MSG_HASH(MSG_CHEEVOS_HARDCORE_MODE_ENABLE, - "Hardcore Mode Enabled, savestate & rewind were disabled.") + "Режим Hardcore включен, режим сохранения и перемотки отключен.") MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, - "Comparing with known magic numbers...") + "Сравнение с известными магическими числами ...") MSG_HASH(MSG_COMPILED_AGAINST_API, - "Compiled against API") + "Скомпилирован против API") MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, "Не задана папка хранения настроек. Невозможно сохранить конфигурацию.") MSG_HASH(MSG_CONNECTED_TO, - "Connected to") + "Подключен к") MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, - "Content CRC32s differ. Cannot use different games.") + "Содержимое CRC32 различается. Нельзя использовать разные игры.") MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, - "Content loading skipped. Implementation will load it on its own.") + "Загрузка контента пропущена, реализация будет загружена сама по себе.") MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, - "Ядро не поддерживает быстрые сохранения.") + "Ядро не поддерживает быстрые сохранение.") MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, - "Core options file created successfully.") + "Файл основных настроек успешно создан.") MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, - "Could not find any next driver") + "Не удалось найти следующий драйвер") MSG_HASH(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, - "Could not find compatible system.") + "Не удалось найти совместимую систему.") MSG_HASH(MSG_COULD_NOT_FIND_VALID_DATA_TRACK, - "Could not find valid data track") + "Не удалось найти дорожку данных") MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, - "could not open data track") + "Не удалось открыть дорожку данных") MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, "Не удалось прочитать файл контента") MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, - "Could not read movie header.") + "Не удалось прочитать заголовок видео ролика.") MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, - "Could not read state from movie.") + "Не удалось прочитать состояние видео ролика.") MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, - "CRC32 checksum mismatch between content file and saved content checksum in replay file header) replay highly likely to desync on playback.") + "Ошибка контрольной суммы CRC32 между файлом содержимого и контрольной суммой сохраненного содержимого в заголовке файла воспроизведения), что, скорее всего, приведет к рассинхронизации при воспроизведении.") MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, "Задано ручное значение тайминга.") MSG_HASH(MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, - "Decompression already in progress.") + "Декомпрессия уже выполняется.") MSG_HASH(MSG_DECOMPRESSION_FAILED, - "Decompression failed.") + "Ошибка декомпрессии.") MSG_HASH(MSG_DETECTED_VIEWPORT_OF, "Обнаружено окно проекции") MSG_HASH(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, - "Did not find a valid content patch.") + "Не найден правильный патч для контента.") MSG_HASH(MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, - "Disconnect device from a valid port.") + "Отключите устройство от действительного порта.") MSG_HASH(MSG_DISK_CLOSED, - "Closed") + "Закрыто") MSG_HASH(MSG_DISK_EJECTED, - "Ejected") + "Выброс") MSG_HASH(MSG_DOWNLOADING, "Прогресс загрузки") MSG_HASH(MSG_DOWNLOAD_FAILED, - "Download failed") + "Загрузка не удалась") MSG_HASH(MSG_ERROR, - "Error") + "Ошибка") MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT, - "Libretro core requires content, but nothing was provided.") + "Ядру Libretro требуется контент, но ничего не было предоставлено.") MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, - "Libretro core requires special content, but none were provided.") + "Ядру Libretro требуется особый контент, но его не было.") MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, - "Error parsing arguments.") + "Ошибка при анализе аргументов.") MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, - "Error saving core options file.") + "Ошибка при сохранении файла основных опций.") MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, - "Error saving remap file.") + "Ошибка при сохранении файла переопределения.") MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, - "Error saving shader preset.") + "Ошибка сохранения пресетов шейдера.") MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, - "External Application Dir") + "Внешний каталог приложений") MSG_HASH(MSG_EXTRACTING, - "Extracting") + "Извлечение") MSG_HASH(MSG_EXTRACTING_FILE, - "Extracting file") + "Извлечение файла") MSG_HASH(MSG_FAILED_SAVING_CONFIG_TO, - "Failed saving config to") + "Ошибка сохранения конфигурации в") MSG_HASH(MSG_FAILED_TO, "Ошибка") MSG_HASH(MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR, - "Failed to accept incoming spectator.") + "Не удалось принять зрителя.") MSG_HASH(MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT, - "Failed to allocate memory for patched content...") + "Не удалось выделить память для пропатченного содержимого ...") MSG_HASH(MSG_FAILED_TO_APPLY_SHADER, "Не удалось применить шейдер") MSG_HASH(MSG_FAILED_TO_BIND_SOCKET, - "Failed to bind socket.") + "Не удалось привязать сокет.") MSG_HASH(MSG_FAILED_TO_CREATE_THE_DIRECTORY, - "Failed to create the directory.") + "Не удалось создать каталог.") MSG_HASH(MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE, - "Failed to extract content from compressed file") + "Не удалось извлечь содержимое из сжатого файла") MSG_HASH(MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT, - "Failed to get nickname from client.") + "Не удалось получить псевдоним от клиента.") MSG_HASH(MSG_FAILED_TO_LOAD, - "Failed to load") + "Ошибка загрузки") MSG_HASH(MSG_FAILED_TO_LOAD_CONTENT, "Не удалось загрузить контент") MSG_HASH(MSG_FAILED_TO_LOAD_MOVIE_FILE, @@ -1840,19 +1839,19 @@ MSG_HASH(MSG_FAILED_TO_LOAD_OVERLAY, MSG_HASH(MSG_FAILED_TO_LOAD_STATE, "Ошибка загрузки сохранения из") MSG_HASH(MSG_FAILED_TO_OPEN_LIBRETRO_CORE, - "Failed to open libretro core") + "Не удалось открыть ядро libretro") MSG_HASH(MSG_FAILED_TO_PATCH, - "Failed to patch") + "Не удалось пропатчить") MSG_HASH(MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT, - "Failed to receive header from client.") + "Не удалось получить заголовок от клиента.") MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME, - "Failed to receive nickname.") + "Не удалось получить никнейм.") MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_FROM_HOST, - "Failed to receive nickname from host.") + "Не удалось получить никнейм с узла.") MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_SIZE_FROM_HOST, - "Failed to receive nickname size from host.") + "Не удалось получить размер никнейма от хоста.") MSG_HASH(MSG_FAILED_TO_RECEIVE_SRAM_DATA_FROM_HOST, - "Failed to receive SRAM data from host.") + "Не удалось получить данные SRAM с хоста.") MSG_HASH(MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY, "Невозможно извлечь диск.") MSG_HASH(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE, @@ -1862,17 +1861,17 @@ MSG_HASH(MSG_FAILED_TO_SAVE_SRAM, MSG_HASH(MSG_FAILED_TO_SAVE_STATE_TO, "Ошибка записи сохранения в") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME, - "Failed to send nickname.") + "Не удалось отправить никнейм.") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_SIZE, - "Failed to send nickname size.") + "Не удалось отправить размер никнейма.") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_CLIENT, - "Failed to send nickname to client.") + "Не удалось отправить никнейм клиенту.") MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_HOST, - "Failed to send nickname to host.") + "FНе удалось отправить никнейм на хост.") MSG_HASH(MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, - "Failed to send SRAM data to client.") + "Не удалось отправить данные SRAM клиенту.") MSG_HASH(MSG_FAILED_TO_START_AUDIO_DRIVER, - "Failed to start audio driver. Will continue without audio.") + "Не удалось запустить звуковой драйвер. Будет продолжено без звука.") MSG_HASH(MSG_FAILED_TO_START_MOVIE_RECORD, "Невозможно начать запись видео.") MSG_HASH(MSG_FAILED_TO_START_RECORDING, @@ -1880,29 +1879,29 @@ MSG_HASH(MSG_FAILED_TO_START_RECORDING, MSG_HASH(MSG_FAILED_TO_TAKE_SCREENSHOT, "Невозможно создать скриншот.") MSG_HASH(MSG_FAILED_TO_UNDO_LOAD_STATE, - "Failed to undo load state.") + "Не удалось отменить загрузку.") MSG_HASH(MSG_FAILED_TO_UNDO_SAVE_STATE, - "Failed to undo save state.") + "Не удалось отменить сохранение.") MSG_HASH(MSG_FAILED_TO_UNMUTE_AUDIO, "Не удалось включить звук.") MSG_HASH(MSG_FATAL_ERROR_RECEIVED_IN, - "Fatal error received in") + "Получена критическая ошибка") MSG_HASH(MSG_FILE_NOT_FOUND, "Файл не найден") MSG_HASH(MSG_FOUND_AUTO_SAVESTATE_IN, - "Found auto savestate in") + "Найдено автосохранение в") MSG_HASH(MSG_FOUND_DISK_LABEL, - "Found disk label") + "Метка найденного диска") MSG_HASH(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, - "Found first data track on file") + "Найдена первая дорожка данных в файле") MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, - "Found last state slot") + "Найдено последний слот состояния") MSG_HASH(MSG_FOUND_SHADER, "Обнаружен шейдер") MSG_HASH(MSG_FRAMES, - "Frames") + "Рамки") MSG_HASH(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, - "Per-Game Options: game-specific core options found at") + "Параметры игры: параметры ядра, определенные для игры") MSG_HASH(MSG_GOT_INVALID_DISK_INDEX, "Задан неверный номер диска.") MSG_HASH(MSG_GRAB_MOUSE_STATE, @@ -1910,31 +1909,31 @@ MSG_HASH(MSG_GRAB_MOUSE_STATE, MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, "Ядро использует аппаратный рендеринг. Включите запись с GPU.") MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, - "Inflated checksum did not match CRC32.") + "Завышенная контрольная сумма не соответствует CRC32.") MSG_HASH(MSG_INPUT_CHEAT, - "Input Cheat") + "Исходный чит") MSG_HASH(MSG_INPUT_CHEAT_FILENAME, - "Cheat Filename") + "Имя чита") MSG_HASH(MSG_INPUT_PRESET_FILENAME, - "Preset Filename") + "Имя настроек") MSG_HASH(MSG_INTERFACE, - "Interface") + "Интерфейс") MSG_HASH(MSG_INTERNAL_STORAGE, - "Internal Storage") + "Внутреннее хранилище") MSG_HASH(MSG_REMOVABLE_STORAGE, - "Removable Storage") + "Внешнее хранилище") MSG_HASH(MSG_INVALID_NICKNAME_SIZE, - "Invalid nickname size.") + "Недопустимый размер никнейма.") MSG_HASH(MSG_IN_BYTES, - "в байтах") + "В байтах") MSG_HASH(MSG_IN_GIGABYTES, - "в гигабайтах") + "В гигабайтах") MSG_HASH(MSG_IN_MEGABYTES, - "в мегабайтах") + "В мегабайтах") MSG_HASH(MSG_LIBRETRO_ABI_BREAK, - "скомпилировано для другой версии libretro.") + "Скомпилировано для другой версии libretro.") MSG_HASH(MSG_LIBRETRO_FRONTEND, - "Frontend for libretro") + "Внешний интерфейс для libretro") MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, "Загружено сохранение из слота #%d.") MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, @@ -1942,19 +1941,19 @@ MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, MSG_HASH(MSG_LOADING, "Загрузка") MSG_HASH(MSG_FIRMWARE, - "One or more firmware files are missing") + "Отсутствуют один или несколько файлов прошивки") MSG_HASH(MSG_LOADING_CONTENT_FILE, "Загружен файл контента") MSG_HASH(MSG_LOADING_HISTORY_FILE, - "Loading history file") + "Загрузка файла истории") MSG_HASH(MSG_LOADING_STATE, "Загружено сохранение") MSG_HASH(MSG_MEMORY, - "Memory") + "Память") MSG_HASH(MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, - "Movie file is not a valid BSV1 file.") + "Видеофайл не является допустимым файлом BSV1.") MSG_HASH(MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION, - "Movie format seems to have a different serializer version. Will most likely fail.") + "Формат фильма, похоже, отличается от версии сериализатора.") MSG_HASH(MSG_MOVIE_PLAYBACK_ENDED, "Достигнут конец записи.") MSG_HASH(MSG_MOVIE_RECORD_STOPPED, @@ -1962,23 +1961,23 @@ MSG_HASH(MSG_MOVIE_RECORD_STOPPED, MSG_HASH(MSG_NETPLAY_FAILED, "Ошибка запуска сетевой игры.") MSG_HASH(MSG_NO_CONTENT_STARTING_DUMMY_CORE, - "No content, starting dummy core.") + "Нет содержимого, начиная с фиктивного ядра.") MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, - "No save state has been overwritten yet.") + "Сохраненное состояние не было перезаписано.") MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, - "No state has been loaded yet.") + "Состояние еще не загружено.") MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, - "Error saving overrides.") + "Ошибка сохранения переопределений.") MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, - "Overrides saved successfully.") + "Переопределения сохранены успешно.") MSG_HASH(MSG_PAUSED, "Пауза вкл.") MSG_HASH(MSG_PROGRAM, "RetroArch") MSG_HASH(MSG_READING_FIRST_DATA_TRACK, - "Reading first data track...") + "Чтение первой дорожки данных ...") MSG_HASH(MSG_RECEIVED, - "получено") + "Получено") MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, "Размеры окна были изменены. Запись остановлена.") MSG_HASH(MSG_RECORDING_TO, @@ -2000,13 +1999,13 @@ MSG_HASH(MSG_RESET, MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, "Реинициализация драйвера. Запись перезапущена.") MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, - "Restored old save state.") + "Восстановлено старое состояние сохранения.") MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, - "Shaders: restoring default shader preset to") + "Шейдеры: восстановление стандартных настроек шейдера") MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, - "Reverting savefile directory to") + "Возврат каталога savefile на") MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, - "Reverting savestate directory to") + "Возврат каталога savestate к") MSG_HASH(MSG_REWINDING, "Перемотка.") MSG_HASH(MSG_REWIND_INIT, @@ -2018,7 +2017,7 @@ MSG_HASH(MSG_REWIND_INIT_FAILED_THREADED_AUDIO, MSG_HASH(MSG_REWIND_REACHED_END, "Достигнут предел буфера перемотки.") MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, - "Saved new config to") + "Сохранено новое имя конфигурации") MSG_HASH(MSG_SAVED_STATE_TO_SLOT, "Сохранено в слот #%d.") MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, @@ -2036,11 +2035,11 @@ MSG_HASH(MSG_SCANNING_OF_DIRECTORY_FINISHED, MSG_HASH(MSG_SENDING_COMMAND, "Отправка команды") MSG_HASH(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, - "Several patches are explicitly defined, ignoring all...") + "Несколько патчей явно определены, игнорируя все...") MSG_HASH(MSG_SHADER, "Шейдер") MSG_HASH(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, - "Shader preset saved successfully.") + "Предварительная установка шейдера успешно сохранена.") MSG_HASH(MSG_SKIPPING_SRAM_LOAD, "Пропуск загрузки SRAM.") MSG_HASH(MSG_SLOW_MOTION, @@ -2062,9 +2061,9 @@ MSG_HASH(MSG_TAKING_SCREENSHOT, MSG_HASH(MSG_TO, "в") MSG_HASH(MSG_UNDID_LOAD_STATE, - "Undid load state.") + "Отключить состояние загрузки.") MSG_HASH(MSG_UNDOING_SAVE_STATE, - "Undoing save state") + "Отмена сохранения состояния") MSG_HASH(MSG_UNKNOWN, "Неизвестно.") MSG_HASH(MSG_UNPAUSED, @@ -2072,134 +2071,134 @@ MSG_HASH(MSG_UNPAUSED, MSG_HASH(MSG_UNRECOGNIZED_COMMAND, "Неизвестная команда") MSG_HASH(MSG_USING_CORE_NAME_FOR_NEW_CONFIG, - "Using core name for new config.") + "Использование имени ядра для новой конфигурации.") MSG_HASH(MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, "Используется фиктивное ядро. Запись не производится.") MSG_HASH(MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, - "Connect device from a valid port.") + "Подключите устройство к действительному порту.") MSG_HASH(MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, - "Disconnecting device from port") + "Отключение устройства от порта") MSG_HASH(MSG_VALUE_REBOOTING, - "Перезагрузка...") + "Перезагрузка ...") MSG_HASH(MSG_VALUE_SHUTTING_DOWN, "Выключение...") MSG_HASH(MSG_VERSION_OF_LIBRETRO_API, - "Версия библиотеки libretro API") + "Версия API libretro") MSG_HASH(MSG_VIEWPORT_SIZE_CALCULATION_FAILED, "Ошибка расчёта размеров окна проекции. Будут использованы необработанные данные. Возможны ошибки.") MSG_HASH(MSG_VIRTUAL_DISK_TRAY, - "виртуальный лоток cd-привода") + "Виртуальный лоток cd-привода") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, - "Desired audio latency in milliseconds. Might not be honored if the audio driver can't provide given latency.") + "Требуемая длительность звукового сигнала в миллисекундах. Невозможно удостовериться, что звуковой драйвер не может обеспечить заданную задержку.") MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, - "Mute/unmute audio.") + "Отключить / включить звук.") MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, - "Helps smooth out imperfections in timing when synchronizing audio and video at the same time. Be aware that if disabled, proper synchronization is nearly impossible to obtain." + "Помогает сгладить недостатки времени при синхронизации аудио и видео в одно и то же время. Имейте в виду, что если отключено, правильную синхронизацию получить почти невозможно." ) MSG_HASH( MENU_ENUM_SUBLABEL_CAMERA_ALLOW, - "Allow or disallow camera access by cores." + "Разрешить или запретить доступ к камере с помощью ядер." ) MSG_HASH( MENU_ENUM_SUBLABEL_LOCATION_ALLOW, - "Allow or disallow location services access by cores." + "Разрешить или запретить доступ к службам определения местоположения по ядрам." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, - "Maximum amount of users supported by RetroArch." + "Максимальное количество пользователей, поддерживаемых RetroArch." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, - "Influence how input polling is done inside RetroArch. Setting it to 'Early' or 'Late' can result in less latency, depending on your configuration." + "Влияйте на то, как входной опрос выполняется внутри RetroArch. Установка его на« Early »или« Late »может привести к меньшему времени ожидания в зависимости от вашей конфигурации." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, - "Allows any user to control the menu. If disabled, only User 1 can control the menu." + "Позволяет любому пользователю управлять меню. Если отключено, только пользователь 1 может управлять меню." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_VOLUME, - "Audio volume (in dB). 0 dB is normal volume, no gain applied." + "Громкость звука (в дБ). 0 дБ - это нормальный уровень громкости, при этом не применяется усиление." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_SYNC, - "Synchronize audio. Recommended." + "Синхронизировать звук. Рекомендуется." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, - "How far an axis must be tilted to result in a button press." + "Как далеко ось должна быть наклонена, чтобы вызвать нажатие кнопки." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, - "Amount of seconds to wait until proceeding to the next bind." + "Количество секунд ожидания до перехода к следующей привязке." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, - "Describes the period of which turbo-enabled buttons toggle. Numbers are described in frames." + "Описывает период, в котором переключаются турбо кнопки. Значение описывается в кадрах." ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, - "Describes how long the period of a turbo-enabled button should be. Numbers are described in frames." + "Описывает, как долго должен действовать период турбо кнопки. Значение описывается в кадрах." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VSYNC, - "Synchronizes the output video of the graphics card to the refresh rate of the screen. Recommended." + "Синхронизирует видеовыход видеокарты с частотой обновления экрана. Рекомендуется." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, - "Allow cores to set rotation. When disabled, rotation requests are ignored. Useful for setups where one manually rotates the screen." + "AРазрешить ядрам задавать поворот, при отключении, запросы на поворот игнорируются, что полезно при настройках, когда один из них поворачивает экран вручную." ) MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Some cores might have a shutdown feature. If enabled, it will prevent the core from shutting RetroArch down. Instead, it loads a dummy core." + "Некоторые ядра могут иметь функцию отключения, если она включена, это предотвратит остановку ядра от RetroArch, вместо этого он загрузит фиктивное ядро." ) MSG_HASH( MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, - "Check if all the required firmware is present before attempting to load content." + "Проверьте, все ли необходимые микропрограммы присутствуют, прежде чем пытаться загрузить контент." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, - "Vertical refresh rate of your screen. Used to calculate a suitable audio input rate. NOTE: This will be ignored if 'Threaded Video' is enabled." + "Вертикальная частота обновления экрана. Используется для расчета подходящей скорости ввода аудиосигнала. ПРИМЕЧАНИЕ: Это будет проигнорировано, если включено« Потоковое видео." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_ENABLE, - "Enable audio output." + "Включить вывод звука." ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, - "The maximum change in audio input rate. You may want to increase this to enable very large changes in timing, for example running PAL cores on NTSC displays, at the cost of inaccurate audio pitch." + "Максимальное изменение скорости ввода аудиосигнала. Возможно, вы захотите увеличить его, чтобы обеспечить очень большие изменения во времени, например, запуск PAL-ядер на дисплеях NTSC за счет неточности звукового поля." ) MSG_HASH( MSG_FAILED, - "failed" + "Не вышло" ) MSG_HASH( MSG_SUCCEEDED, - "succeeded" + "Удалось" ) MSG_HASH( MSG_DEVICE_NOT_CONFIGURED, - "not configured" + "Не настроено" ) MSG_HASH( MSG_DEVICE_NOT_CONFIGURED_FALLBACK, - "not configured, using fallback" + "Не настроен, используется резервный" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, - "Database Cursor List" + "Список курсоров баз данных" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, - "Database - Filter : Developer" + "База данных - Фильтр: Разработчик" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, - "Database - Filter : Publisher" + "База данных - Фильтр: Издатель" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DISABLED, - "Выключено" + "Отключено" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ENABLED, @@ -2207,7 +2206,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, - "Content History Path" + "Путь к истории контента" ) MSG_HASH( MENU_ENUM_LABEL_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, @@ -2256,11 +2255,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_URL, - "Адрес" + "URL Path" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_START, - "Старт" + "Start" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, "Bokeh") From 3cb5b651a27f1fac086eeb76734253f70ed4586d Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 12 May 2017 00:28:07 +0200 Subject: [PATCH 035/274] Add msg_hash_vn.h --- intl/msg_hash_vn.c | 1785 +------------------------- intl/msg_hash_vn.h | 3007 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3008 insertions(+), 1784 deletions(-) create mode 100644 intl/msg_hash_vn.h diff --git a/intl/msg_hash_vn.c b/intl/msg_hash_vn.c index 41069cc955..21a2028e2b 100644 --- a/intl/msg_hash_vn.c +++ b/intl/msg_hash_vn.c @@ -1904,1791 +1904,8 @@ const char *msg_hash_to_str_vn(enum msg_hash_enums msg) { switch (msg) { - case MENU_ENUM_SUBLABEL_MENU_SETTINGS: - return "Điều chỉnh thiết lập related to the appearance of the menu screen."; - case MSG_AUDIO_VOLUME: - return "Âm lượng âm thanh"; - case MSG_AUTODETECT: - return "Tự động phát hiện"; - case MSG_AUTOLOADING_SAVESTATE_FROM: - return "Đang tự đông tải savestate từ"; - case MSG_CONNECTING_TO_NETPLAY_HOST: - return "Đang kết nối vào máy chủ netplay"; - case MSG_CONNECTING_TO_PORT: - return "Đang kết nối vào port"; - case MSG_CONNECTION_SLOT: - return "Khe kết nối"; - case MSG_FAILED: - return "Bị Lỗi"; - case MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER: - return "Ttệp đã tồn tại. Đang lưu vào backup buffer"; - case MSG_GOT_CONNECTION_FROM: - return "Được kết nối từ: \"%s\""; - case MSG_NETPLAY_USERS_HAS_FLIPPED: - return "Người dùng Netplay đã flipped"; - case MSG_SUCCEEDED: - return "Đã thành công"; - case MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED: - return "Netplay không biết lệnh nhận được"; - case MSG_WAITING_FOR_CLIENT: - return "Đang đợi máy khách ..."; - case MSG_SHADER: - return "Shader"; - case MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY: - return "Sorry, unimplemented: cores that don't demand content cannot participate in netplay."; - case MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD: - return "Mật khẩu"; - case MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS: - return "Tài khoản Cheevos"; - case MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME: - return "Tên truy nhập"; - case MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST: - return "Những tài khoản"; - case MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END: - return "Điểm cuối của danh sách tài khoản"; - case MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS: - return "Thành tích Retro"; - case MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST: - return "Danh sách thành tích"; - case MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST: - return "Thêm nội dung"; - case MENU_ENUM_LABEL_VALUE_ADD_TAB: - return "Tạo nội dung"; - case MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE: - return "Hỏi"; - case MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY: - return "Danh mục assets"; - case MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES: - return "Block Frames"; - case MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE: - return "Thiết bị âm thanh"; - case MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER: - return "Trình điều khiển âm thanh"; - case MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN: - return "Âm thanh DSP Plugin"; - case MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE: - return "Kích hoạt âm thanh"; - case MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR: - return "Âm thanh Filter Danh mục"; - case MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY: - return "Âm thanh Latency (ms)"; - case MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW: - return "Âm thanh Maximum Timing Skew"; - case MENU_ENUM_LABEL_VALUE_AUDIO_MUTE: - return "Âm thanh Mute"; - case MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE: - return "Âm thanh Output Rate (Hz)"; - case MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA: - return "Âm thanh Rate Control Delta"; - case MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER: - return "Âm thanh Resampler Driver"; - case MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS: - return "Âm thanh"; - case MENU_ENUM_LABEL_VALUE_AUDIO_SYNC: - return "Âm thanh Sync"; - case MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME: - return "Mức âm lượng (dB)"; - case MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL: - return "SaveRAM Autosave Interval"; - case MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE: - return "Tự động tải tập tin ghi đè"; - case MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE: - return "Tự động tải tập tin Remap"; - case MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE: - return "Tự động tải Shader Presets"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK: - return "Trở lại"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_CONFIRM: - return "Xác nhận"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO: - return "Thông tin"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT: - return "Thoát"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN: - return "Cuộn xuống"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP: - return "Cuộn lên"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START: - return "Start"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD: - return "Bật/tắt bàn phím"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU: - return "Bật/tắt trình đơn"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS: - return "Trình đơn điều khiển căn bản"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM: - return "Confirm/OK"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO: - return "Thông tin"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT: - return "Thoát"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP: - return "Cuộn lên"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START: - return "Những mặc định"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD: - return "Bật/tắt bàn phím"; - case MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU: - return "Bật/tắt trình đơn"; - case MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE: - return "Khi tải savestate đừng ghi đè SaveRAM"; - case MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE: - return "Kích hoạt Bluetooth"; - case MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL: - return "URL của Buildbot Assets"; - case MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY: - return "Danh mục cache"; - case MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW: - return "Cho phép Camera"; - case MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER: - return "Trình Camera"; - case MENU_ENUM_LABEL_VALUE_CHEAT: - return "Cheat"; - case MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES: - return "Áp dụng thay đổi của Cheat"; - case MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH: - return "Danh mục tập tin Cheat"; - case MENU_ENUM_LABEL_VALUE_CHEAT_FILE: - return "Tập tin Cheat"; - case MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD: - return "Tải tập tin Cheat"; - case MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS: - return "Lưu tập tin Cheat như"; - case MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES: - return "Cheat Passes"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION: - return "Miêu tả"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE: - return "Chế độ Hardcore"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS: - return "Thành tựu bị khóa:"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY: - return "Đã khóa"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS: - return "Những thành tựu Retro"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL: - return "Thử nghiệm không chính thức"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS: - return "Những thành tựu đã mở:"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY: - return "Đã mở"; - case MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT: - return "Đóng nội dung"; - case MENU_ENUM_LABEL_VALUE_CONFIG: - return "Config"; - case MENU_ENUM_LABEL_VALUE_CONFIGURATIONS: - return "Tải cấu hình"; - case MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS: - return "Cấu hình"; - case MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT: - return "Lưu cấu hình khi thoát"; - case MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST: - return "Bộ sưu tập"; - case MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY: - return "Mục cơ sở dữ liệu nội dung"; - case MENU_ENUM_LABEL_VALUE_CONTENT_DIR: - return "Mục nội dung"; - case MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE: - return "Kích thước danh sách lịch sử"; - case MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS: - return "Trình đơn lẹ"; - case MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR: - return "Mục Core Assets"; - case MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY: - return "Mục Downloads"; - case MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS: - return "Cheats"; - case MENU_ENUM_LABEL_VALUE_CORE_COUNTERS: - return "Core Counters"; - case MENU_ENUM_LABEL_VALUE_CORE_ENABLE: - return "Hiển thị tên của core"; - case MENU_ENUM_LABEL_VALUE_CORE_INFORMATION: - return "Core Thông tin"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS: - return "Tác giả"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES: - return "Thể loại"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL: - return "Nhãn hiệu Core"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME: - return "Tên của Core"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE: - return "Phần vững"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES: - return "Bản quyền"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS: - return "Phép"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS: - return "Tiện ích mở rộng được hỗ trợ"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER: - return "Nhà sản xuất hệ thống"; - case MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME: - return "Tên hệ thống"; - case MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS: - return "Điều khiển"; - case MENU_ENUM_LABEL_VALUE_CORE_LIST: - return "Tải Core"; - case MENU_ENUM_LABEL_VALUE_CORE_OPTIONS: - return "Tùy chọn"; - case MENU_ENUM_LABEL_VALUE_CORE_SETTINGS: - return "Core"; - case MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE: -/* FIXME? Translate 'Start a Core Automatically' */ - return "Tự động chạy Core"; - case MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE: - return "Tự động giải nén lưu trữ tải về"; - case MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL: - return "URL của Buildbot Cores"; - case MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST: - return "Cập nhật cho Core"; - case MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS: - return "Cập nhật"; - case MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE: - return "Kiến trúc CPU:"; - case MENU_ENUM_LABEL_VALUE_CPU_CORES: - return "CPU Cores:"; - case MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY: - return "Mục Cursor"; - case MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER: - return "Cursor Manager"; - case MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO: - return "Custom Ratio"; - case MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER: - return "Quản lý cho cơ sở dữ liệu"; - case MENU_ENUM_LABEL_VALUE_DATABASE_SELECTION: - return "Lựa chọn cơ sở dữ liệu"; - case MENU_ENUM_LABEL_VALUE_DELETE_ENTRY: - return "Xoá"; - case MENU_ENUM_LABEL_VALUE_FAVORITES: - return "Yêu thích"; - case MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT: - return ""; - case MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT: - return ""; - case MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE: - return ""; - case MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND: - return "Không tìm thấy thư mục."; - case MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS: - return "Thư mục"; - case MENU_ENUM_LABEL_VALUE_DISABLED: - return "Vô hiệu hoá"; - case MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS: - return "Tình trạng khay đĩa"; - case MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND: - return "Thêm đĩa"; - case MENU_ENUM_LABEL_VALUE_DISK_INDEX: - return "Chỉ số đĩa"; - case MENU_ENUM_LABEL_VALUE_DISK_OPTIONS: - return "Điều khiển đĩa"; - case MENU_ENUM_LABEL_VALUE_DONT_CARE: - return "Không quan tâm"; - case MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST: - return "Mục Downloads"; - case MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE: - return "Tải về Core..."; - case MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT: - return "Tải về nội dung"; - case MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE: - return "Kích hoạt DPI Override"; - case MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS: - return "Trình điều khiển"; - case MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN: -/* FIXME? Translate 'Load Dummy on Core Shutdown' */ - return "Tải Core giả khi tắt máy"; - case MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER: - return "Nền năng động"; - case MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY: - return "Mục nền năng động"; - case MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE: - return "Kích hoạt"; - case MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR: - return "Menu entry hover color"; - case MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR: - return "Menu entry normal color"; - case MENU_ENUM_LABEL_VALUE_FALSE: - return "False"; - case MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO: - return "Maximum Run Speed"; - case MENU_ENUM_LABEL_VALUE_FPS_SHOW: - return "Display Framerate"; - case MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE: - return "Limit Maximum Run Speed"; - case MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS: - return "Frame Throttle"; - case MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS: - return "Frontend Counters"; - case MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS: - return "Tải Content-Specific Core Options Automatically"; - case MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE: - return "Create game-options file"; - case MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE: - return "Game-options file"; - case MENU_ENUM_LABEL_VALUE_HELP: - return "help"; - case MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING: - return "Âm thanh/Video Troubleshooting"; - case MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD: - return "Changing Virtual Gamepad Overlay"; - case MENU_ENUM_LABEL_VALUE_HELP_CONTROLS: - return "Basic Menu Controls"; - case MENU_ENUM_LABEL_VALUE_HELP_LIST: - return "Help"; - case MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT: - return "Đang tải Content"; - case MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT: - return "Scanning For Content"; - case MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE: - return "What Is A Core?"; - case MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE: - return "History List Enable"; - case MENU_ENUM_LABEL_VALUE_HISTORY_TAB: - return "History"; - case MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU: - return "Horizontal Menu"; - case MENU_ENUM_LABEL_VALUE_IMAGES_TAB: - return "Image"; - case MENU_ENUM_LABEL_VALUE_INFORMATION: - return "Information"; - case MENU_ENUM_LABEL_VALUE_INFORMATION_LIST: - return "Information"; - case MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE: - return "Analog To Digital Type"; - case MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU: - return "All Users Control Menu"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X: - return "Left Analog X"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS: - return "Left analog X- (left)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS: - return "Left analog X+ (right)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y: - return "Left Analog Y"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS: - return "Left analog Y- (up)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS: - return "Left analog Y+ (down)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X: - return "Right Analog X"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS: - return "Right analog X- (left)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS: - return "Right analog X+ (right)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y: - return "Right Analog Y"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS: - return "Right analog Y- (up)"; - case MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS: - return "Right analog Y+ (down)"; - case MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE: - return "Kích hoạt Autoconfig"; - case MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD: - return "Input Axis Threshold"; - case MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL: - return "Bind All"; - case MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL: - return "Bind Default All"; - case MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT: - return "Bind Timeout"; - case MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND: - return "Hide Unbound Core Input Descriptors"; - case MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW: - return "Display Input Descriptor Labels"; - case MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX: - return "Device Index"; - case MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE: - return "Device Type"; - case MENU_ENUM_LABEL_VALUE_INPUT_DRIVER: - return "Input Driver"; - case MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE: - return "Duty Cycle"; - case MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS: - return "Input Hotkey Binds"; - case MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE: - return "Kích hoạt Keyboard Gamepad Mapping"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A: - return "A button (right)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B: - return "B button (down)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN: - return "Down D-pad"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2: - return "L2 button (trigger)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3: - return "L3 button (thumb)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L: - return "L button (shoulder)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT: - return "Left D-pad"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2: - return "R2 button (trigger)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3: - return "R3 button (thumb)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R: - return "R button (shoulder)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT: - return "Right D-pad"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT: - return "Select button"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START: - return "Start button"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP: - return "Up D-pad"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X: - return "X button (top)"; - case MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y: - return "Y button (left)"; - case MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE: - return "Keyboard Gamepad Mapping Type"; - case MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS: - return "Max Users"; - case MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: - return "Menu Toggle Gamepad Combo"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS: - return "Cheat index -"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS: - return "Cheat index +"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE: - return "Cheat toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE: - return "Disk eject toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT: - return "Disk next"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV: - return "Disk prev"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY: - return "Kích hoạt hotkeys"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY: - return "Fast forward hold"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY: - return "Fast forward toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE: - return "Frameadvance"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY: - return "Bật/tắt chế độ toàn màn hình"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE: - return "Grab mouse toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY: - return "Tải state"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE: - return "Menu toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE: - return "Movie record toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE: - return "Âm thanh mute toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP: - return "Netplay flip users"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_OSK: - return "On-screen keyboard toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT: - return "Overlay next"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE: - return "Pause toggle"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY: - return "Quit RetroArch"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_RESET: - return "Reset game"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND: - return "Rewind"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY: - return "Save state"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT: - return "Chụp ảnh màn hình"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT: - return "Next shader"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV: - return "Previous shader"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION: - return "Slow motion"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS: - return "Savestate slot -"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS: - return "Savestate slot +"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN: - return "Volume -"; - case MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP: - return "Volume +"; - case MENU_ENUM_LABEL_VALUE_INPUT_OSK_OVERLAY_ENABLE: - return "Display Keyboard Overlay"; - case MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE: - return "Display Overlay"; - case MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU: - return "Hide Overlay In Menu"; - case MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR: - return "Poll Type Behavior"; - case MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY: - return "Early"; - case MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE: - return "Late"; - case MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL: - return "Normal"; - case MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH: - return "Prefer Front Touch"; - case MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY: - return "Input Remapping Danh mục"; - case MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE: - return "Kích hoạt Remap Binds"; - case MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG: - return "Lưu Autoconfig"; - case MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS: - return "Input"; - case MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE: - return "Small Keyboard Enable"; - case MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE: - return "Kích hoạt Touch"; - case MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE: - return "Kích hoạt Turbo"; - case MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD: - return "Turbo Period"; - case MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS: - return "Input User %u Binds"; - case MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS: - return "Internal storage status"; - case MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR: - return "Input Device Autoconfig Danh mục"; - case MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER: - return "Joypad Driver"; - case MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES: - return "Services"; - case MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED: - return "Tiếng Trung Quốc (Chữ Hán giản thể)"; - case MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL: - return "Tiếng Trung Quốc (Chữ Hán phồn thể)"; - case MENU_ENUM_LABEL_VALUE_LANG_DUTCH: - return "Tiếng Hà Lan"; - case MENU_ENUM_LABEL_VALUE_LANG_ENGLISH: - return "Tiếng Anh"; - case MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO: - return "Tiếng Quốc tế ngữ"; - case MENU_ENUM_LABEL_VALUE_LANG_FRENCH: - return "Tiếng Pháp"; - case MENU_ENUM_LABEL_VALUE_LANG_GERMAN: - return "Tiếng Đức"; - case MENU_ENUM_LABEL_VALUE_LANG_ITALIAN: - return "Tiếng Ý"; - case MENU_ENUM_LABEL_VALUE_LANG_JAPANESE: - return "Tiếng Nhật"; - case MENU_ENUM_LABEL_VALUE_LANG_KOREAN: - return "Tiếng Hàn Quốc"; - case MENU_ENUM_LABEL_VALUE_LANG_POLISH: - return "Polish"; - case MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL: - return "Tiếng Bồ Đào Nha (Brazil)"; - case MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL: - return "Tiếng Bồ Đào Nha (Portugal)"; - case MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN: - return "Tiếng Nga"; - case MENU_ENUM_LABEL_VALUE_LANG_SPANISH: - return "Tiếng Tây Ban Nha"; - case MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE: - return "Tiếng Việt"; - case MENU_ENUM_LABEL_VALUE_LEFT_ANALOG: - return "Left Analog"; - case MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH: - return "Core Danh mục"; - case MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH: - return "Core Info Danh mục"; - case MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL: - return "Core Logging Level"; - case MENU_ENUM_LABEL_VALUE_LINEAR: - return "Linear"; - case MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE: - return "Tải Archive With Core"; - case MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY: - return "Tải Recent"; - case MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST: - return "Tải Content"; - case MENU_ENUM_LABEL_VALUE_LOAD_STATE: - return "Tải State"; - case MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW: - return "Allow Location"; - case MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER: - return "Location Driver"; - case MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS: - return "Logging"; - case MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY: - return "Logging Verbosity"; - case MENU_ENUM_LABEL_VALUE_MAIN_MENU: - return "Main Menu"; - case MENU_ENUM_LABEL_VALUE_MANAGEMENT: - return "Database thiết lập"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME: - return "Menu Color Theme"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE: - return "Blue"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY: - return "Blue Grey"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE: - return "Dark Blue"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN: - return "Green"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD: - return "Shield"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED: - return "Red"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW: - return "Yellow"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY: - return "Footer Opacity"; - case MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY: - return "Header Opacity"; - case MENU_ENUM_LABEL_VALUE_MENU_DRIVER: - return "Menu Driver"; - case MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE: - return "Throttle Menu Framerate"; - case MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER: - return "Menu Linear Filter"; - case MENU_ENUM_LABEL_VALUE_MENU_SETTINGS: - return "Menu"; - case MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER: - return "Background"; - case MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY: - return "Background opacity"; - case MENU_ENUM_LABEL_VALUE_MISSING: - return "Missing"; - case MENU_ENUM_LABEL_VALUE_MORE: - return "..."; - case MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE: - return "Mouse Support"; - case MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS: - return "Multimedia"; - case MENU_ENUM_LABEL_VALUE_MUSIC_TAB: - return "Music"; - case MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE: - return "Filter unknown extensions"; - case MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND: - return "Navigation Wrap-Around"; - case MENU_ENUM_LABEL_VALUE_NEAREST: - return "Nearest"; - case MENU_ENUM_LABEL_VALUE_NETPLAY: - return "Netplay"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES: - return "Netplay Check Frames"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT: - return "Netplay P2 Uses C1"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES: - return "Netplay Delay Frames"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT: - return "Disconnect"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE: - return "Kích hoạt Netplay"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT: - return "Connect to Netplay host"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST: - return "Start hosting"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS: - return "Server Address"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_MODE: - return "Kích hoạt Netplay Client"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME: - return "Username"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS: - return "Netplay thiết lập"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE: - return "Kích hoạt Netplay Spectator"; - case MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT: - return "Netplay TCP/UDP Port"; - case MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE: - return "Network Commands"; - case MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT: - return "Network Command Port"; - case MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION: - return "Network Information"; - case MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE: - return "Network Gamepad"; - case MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT: - return "Network Remote Base Port"; - case MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS: - return "Network"; - case MENU_ENUM_LABEL_VALUE_NO: - return "No"; - case MENU_ENUM_LABEL_VALUE_NONE: - return "None"; - case MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE: - return "N/A"; - case MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY: - return "No achievements to display."; - case MENU_ENUM_LABEL_VALUE_NO_CORE: - return "No Core"; - case MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE: - return "No cores available."; - case MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE: - return "No core information available."; - case MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE: - return "No core options available."; - case MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY: - return "No entries to display."; - case MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE: - return "No history available."; - case MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE: - return "No information is available."; - case MENU_ENUM_LABEL_VALUE_NO_ITEMS: - return "No items."; - case MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS: - return "No performance counters."; - case MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS: - return "No playlists."; - case MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE: - return "No playlist entries available."; - case MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND: - return "No thiết lập found."; - case MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS: - return "No shader parameters."; - case MENU_ENUM_LABEL_VALUE_OFF: - return "OFF"; - case MENU_ENUM_LABEL_VALUE_ON: - return "ON"; - case MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER: - return "Online Updater"; - case MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS: - return "Onscreen Display"; - case MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS: - return "Onscreen Overlay"; - case MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE: - return "Open Archive As Folder"; - case MENU_ENUM_LABEL_VALUE_OPTIONAL: - return "Optional"; - case MENU_ENUM_LABEL_VALUE_OSK_OVERLAY_DIRECTORY: - return "OSK Overlay Dir"; - case MENU_ENUM_LABEL_VALUE_OVERLAY: - return "Overlay"; - case MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED: - return "Tự động tải Preferred Overlay"; - case MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY: - return "Overlay Dir"; - case MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY: - return "Overlay Opacity"; - case MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET: - return "Overlay Preset"; - case MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE: - return "Overlay Scale"; - case MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS: - return "Onscreen Overlay"; - case MENU_ENUM_LABEL_VALUE_PAL60_ENABLE: - return "Use PAL60 Mode"; - case MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY: - return "Parent directory"; - case MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO: - return "Pause when menu activated"; - case MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE: - return "Don't run in background"; - case MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE: - return "Performance Counters"; - case MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB: - return "Playlists"; - case MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY: - return "Playlist Danh mục"; - case MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS: - return "Playlists"; - case MENU_ENUM_LABEL_VALUE_POINTER_ENABLE: - return "Touch Support"; - case MENU_ENUM_LABEL_VALUE_PORT: - return "Port"; - case MENU_ENUM_LABEL_VALUE_PRESENT: - return "Present"; - case MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS: - return "Privacy"; - case MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH: - return "Thoát RetroArch"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG: - return "Analog supported"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING: - return "BBFC Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING: - return "CERO Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP: - return "Co-op supported"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32: - return "CRC32"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION: - return "Description"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER: - return "Developer"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE: - return "Edge Magazine Issue"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING: - return "Edge Magazine Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW: - return "Edge Magazine Review"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING: - return "ELSPA Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW: - return "Enhancement Hardware"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING: - return "ESRB Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING: - return "Famitsu Magazine Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE: - return "Franchise"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE: - return "Genre"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5: - return "MD5"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME: - return "Name"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN: - return "Origin"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING: - return "PEGI Rating"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER: - return "Publisher"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH: - return "Releasedate Month"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR: - return "Releasedate Year"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE: - return "Rumble supported"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL: - return "Serial"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1: - return "SHA1"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT: - return "Start Content"; - case MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING: - return "TGDB Rating"; - case MENU_ENUM_LABEL_VALUE_REBOOT: - return "Khởi động lại"; - case MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY: - return "Recording Config Danh mục"; - case MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY: - return "Recording Output Danh mục"; - case MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS: - return "Recording"; - case MENU_ENUM_LABEL_VALUE_RECORD_CONFIG: - return "Load Recording Config..."; - case MENU_ENUM_LABEL_VALUE_RECORD_DRIVER: - return "Record Driver"; - case MENU_ENUM_LABEL_VALUE_RECORD_ENABLE: - return "Enabel Recording"; - case MENU_ENUM_LABEL_VALUE_RECORD_PATH: - return "Save Recording Output as..."; - case MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY: - return "Save Recordings in Output Dir"; - case MENU_ENUM_LABEL_VALUE_REMAP_FILE: - return "Remap File"; - case MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD: - return "Tải Remap File"; - case MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE: - return "Save Core Remap File"; - case MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME: - return "Save Game Remap File"; - case MENU_ENUM_LABEL_VALUE_REQUIRED: - return "Required"; - case MENU_ENUM_LABEL_VALUE_RESTART_CONTENT: - return "Khởi động lại"; - case MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH: - return "Restart RetroArch"; - case MENU_ENUM_LABEL_VALUE_RESUME: - return "Resume"; - case MENU_ENUM_LABEL_VALUE_RESUME_CONTENT: - return "Resume"; - case MENU_ENUM_LABEL_VALUE_RETROKEYBOARD: - return "RetroKeyboard"; - case MENU_ENUM_LABEL_VALUE_RETROPAD: - return "RetroPad"; - case MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS: - return "Retro Achievements"; - case MENU_ENUM_LABEL_VALUE_REWIND_ENABLE: - return "Kích hoạt Rewind"; - case MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY: - return "Rewind Granularity"; - case MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS: - return "Rewind"; - case MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY: - return "File Browser Danh mục"; - case MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY: - return "Config Danh mục"; - case MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN: - return "Show Start Screen"; - case MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG: - return "Right Analog"; - case MENU_ENUM_LABEL_VALUE_RUN: - return "Run"; - case MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE: - return "Kích hoạt SAMBA"; - case MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY: - return "Savefile Danh mục"; - case MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX: - return "Save State Auto Index"; - case MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD: - return "Tự động tải State"; - case MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE: - return "Auto Save State"; - case MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY: - return "Savestate Danh mục"; - case MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG: - return "Save Current Config"; - case MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE: - return "Save Core Overrides"; - case MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME: - return "Save Game Overrides"; - case MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG: - return "Save New Config"; - case MENU_ENUM_LABEL_VALUE_SAVE_STATE: - return "Save State"; - case MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS: - return "Saving"; - case MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY: - return "Scan Directory"; - case MENU_ENUM_LABEL_VALUE_SCAN_FILE: - return "Scan File"; - case MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY: - return ""; - case MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY: - return "Screenshot Danh mục"; - case MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION: - return "Screen Resolution"; - case MENU_ENUM_LABEL_VALUE_SEARCH: - return "Search"; - case MENU_ENUM_LABEL_VALUE_SECONDS: - return "seconds"; - case MENU_ENUM_LABEL_VALUE_SETTINGS: - return "Thiết lập"; - case MENU_ENUM_LABEL_VALUE_SETTINGS_TAB: - return "Thiết lập"; - case MENU_ENUM_LABEL_VALUE_SHADER: - return "Shader"; - case MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES: - return "Áp dụng Shader Changes"; - case MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS: - return "Shaders"; - case MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON: - return "Ribbon"; - case MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED: - return "Ribbon (simplified)"; - case MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS: - return "Show Advanced thiết lập"; - case MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES: - return "Show Hidden Files and Folders"; - case MENU_ENUM_LABEL_VALUE_SHUTDOWN: - return "Tắt Máy"; - case MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO: - return "Slow-Motion Ratio"; - case MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE: - return "Sort Saves In Folders"; - case MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE: - return "Sort Savestates In Folders"; - case MENU_ENUM_LABEL_VALUE_SSH_ENABLE: - return "Kích hoạt SSH"; - case MENU_ENUM_LABEL_VALUE_START_CORE: - return "Start Core"; - case MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD: - return "Start Remote RetroPad"; - case MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR: - return "Start Video Processor"; - case MENU_ENUM_LABEL_VALUE_STATE_SLOT: - return "State Slot"; - case MENU_ENUM_LABEL_VALUE_STATUS: - return "Status"; - case MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE: - return "stdin Commands"; - case MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES: - return "Supported cores"; - case MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE: - return "Suspend Screensaver"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE: - return "Kích hoạt System BGM"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY: - return "System/BIOS Danh mục"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION: - return "System Information"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT: - return "7zip support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT: - return "ALSA support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE: - return "Build date"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT: - return "Cg support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT: - return "Cocoa support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT: - return "Command interface support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT: - return "CoreText support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES: - return "CPU Features"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI: - return "Display metric DPI"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT: - return "Display metric height (mm)"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH: - return "Display metric width (mm)"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT: - return "DirectSound support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT: - return "WASAPI support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT: - return "Dynamic library support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT: - return "Dynamic run-time loading of libretro library"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT: - return "EGL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT: - return "OpenGL/Direct3D render-to-texture (multi-pass shaders) support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT: - return "FFmpeg support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT: - return "FreeType support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER: - return "Frontend identifier"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME: - return "Frontend name"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS: - return "Frontend OS"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION: - return "Git version"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT: - return "GLSL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT: - return "HLSL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT: - return "JACK support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT: - return "KMS/EGL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT: - return "LibretroDB support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT: - return "Libusb support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT: - return "libxml2 XML parsing support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT: - return "Netplay (peer-to-peer) support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT: - return "Network Command interface support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT: - return "Network Gamepad support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT: - return "OpenAL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT: - return "OpenGL ES support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT: - return "OpenGL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT: - return "OpenSL support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT: - return "OpenVG support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT: - return "OSS support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT: - return "Overlay support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE: - return "Power source"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED: - return "Charged"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING: - return "Charging"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING: - return "Discharging"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE: - return "No source"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT: - return "PulseAudio support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT: - return "Python (script support in shaders) support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT: - return "BMP support (RBMP)"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL: - return "RetroRating level"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT: - return "JPEG support (RJPEG)"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT: - return "RoarAudio support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT: - return "PNG support (RPNG)"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT: - return "RSound support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT: - return "TGA support (RTGA)"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT: - return "SDL2 support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT: - return "SDL image support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT: - return "SDL1.2 support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT: - return "Slang support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT: - return "Threading support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT: - return "Udev support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT: - return "Video4Linux2 support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER: - return "Video context driver"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT: - return "Vulkan support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT: - return "Wayland support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT: - return "X11 support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT: - return "XAudio2 support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT: - return "XVideo support"; - case MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT: - return "Zlib support"; - case MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT: - return "Chụp ảnh màn hình"; - case MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY: - return "Thumbnails Danh mục"; - case MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST: - return "Thumbnails Updater"; - case MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE: - return "Kích hoạt UI Companion"; - case MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT: - return "UI Companion Start On Boot"; - case MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE: - return "Undo Tải State"; - case MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS: - return "Cập nhật Assets"; - case MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES: - return "Cập nhật Autoconfig Profiles"; - case MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS: - return "Cập nhật Cg Shaders"; - case MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS: - return "Cập nhật Cheats"; - case MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES: - return "Cập nhật Core Info Files"; - case MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES: - return "Cập nhật Databases"; - case MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS: - return "Cập nhật GLSL Shaders"; - case MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA: - return "Cập nhật Lakka"; - case MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS: - return "Cập nhật Overlays"; - case MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS: - return "Cập nhật Slang Shaders"; - case MENU_ENUM_LABEL_VALUE_USER: - return "User"; - case MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS: - return "User Interface"; - case MENU_ENUM_LABEL_VALUE_USER_LANGUAGE: - return "Language"; - case MENU_ENUM_LABEL_VALUE_USER_SETTINGS: - return "User"; - case MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER: - return "Use Builtin Image Viewer"; - case MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER: - return "Use Builtin Media Player"; - case MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY: - return ""; - case MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE: - return "Allow rotation"; - case MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO: - return "Auto Aspect Ratio"; - case MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX: - return "Aspect Ratio Index"; - case MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION: - return "Black Frame Insertion"; - case MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN: - return "Crop Overscan (Reload)"; - case MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION: - return "Disable Desktop Composition"; - case MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER: - return "Video Driver"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FILTER: - return "Video Filter"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR: - return "Video Filter Danh mục"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER: - return "Flicker filter"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE: - return "Display OSD Message"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH: - return "OSD Message Font"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE: - return "OSD Message Size"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT: - return "Force aspect ratio"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE: - return "Force-disable sRGB FBO"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY: - return "Frame Delay"; - case MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN: - return "Sử dụng chế độ toàn màn hình"; - case MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA: - return "Video Gamma"; - case MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD: - return "Use GPU Recording"; - case MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT: - return "Kích hoạt GPU Screenshot"; - case MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC: - return "Hard GPU Sync"; - case MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES: - return "Hard GPU Sync Frames"; - case MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES: - return "Max swapchain images"; - case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X: - return "OSD Message X Position"; - case MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y: - return "OSD Message Y Position"; - case MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX: - return "Monitor Index"; - case MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD: - return "Kích hoạt Post Filter Recording"; - case MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE: - return "Refresh Rate"; - case MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO: - return "Estimated Monitor Framerate"; - case MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION: - return "Rotation"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SCALE: - return "Windowed Scale"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER: - return "Integer Scale"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS: - return "Video"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR: - return "Video Shader Danh mục"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES: - return "Shader Passes"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS: - return "Preview Shader Parameters"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET: - return "Tải Shader Preset"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS: - return "Menu Shader Parameters"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS: - return "Save Shader Preset As"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE: - return "Save Core Preset"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME: - return "Save Game Preset"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT: - /* FIXME? Translate 'Enable Hardware Shared Context' */ - return "Kích hoạt Hardware Shared Context"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH: - return "HW Bilinear Filtering"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER: - return "Kích hoạt Soft Filter"; - case MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL: - return "VSync Swap Interval"; - case MENU_ENUM_LABEL_VALUE_VIDEO_TAB: - return "Video"; - case MENU_ENUM_LABEL_VALUE_VIDEO_THREADED: - return "Threaded Video"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER: - return "Deflicker"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT: - return "Custom Viewport Height"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH: - return "Custom Viewport Width"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X: - return "Custom Viewport X"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y: - return "Custom Viewport Y"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH: - return "Set VI Screen Width"; - case MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC: - return "VSync"; - case MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN: - return "Chế độ toàn màn hình trong khung"; - case MENU_ENUM_LABEL_VALUE_WIFI_DRIVER: - return "Wi-Fi Driver"; - case MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS: - return "Wi-Fi"; - case MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR: - return "Menu Alpha Factor"; - case MENU_ENUM_LABEL_VALUE_XMB_FONT: - return "Menu Font"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM: - return "Custom"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI: - return "FlatUI"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME: - return "Monochrome"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC: - return "Systematic"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL: - return "Pixel"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE: - return "RetroActive"; - case MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART: - return "Dot-Art"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME: - return "Menu Color Theme"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN: - return "Apple Green"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK: - return "Dark"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE: - return "Dark Purple"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE: - return "Electric Blue"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN: - return "Golden"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED: - return "Legacy Red"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE: - return "Midnight Blue"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN: - return "Plain"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA: - return "Undersea"; - case MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED: - return "Volcanic Red"; - case MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE: - return "Menu Shader Pipeline"; - case MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR: - return "Menu Scale Factor"; - case MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE: - return "Kích hoạt Icon Shadows"; - case MENU_ENUM_LABEL_VALUE_XMB_SHOW_HISTORY: - return "Show History Tab"; - case MENU_ENUM_LABEL_VALUE_XMB_SHOW_IMAGES: - return "Show Images Tab"; - case MENU_ENUM_LABEL_VALUE_XMB_SHOW_MUSIC: - return "Show Music Tab"; - case MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS: - return "Show thiết lập Tab"; - case MENU_ENUM_LABEL_VALUE_XMB_SHOW_VIDEO: - return "Show Video Tab"; - case MENU_ENUM_LABEL_VALUE_XMB_THEME: - return "Menu Icon Theme"; - case MENU_ENUM_LABEL_VALUE_YES: - return "Yes"; - case MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO: - return "Shader Preset"; - case MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST: - return "Tải/quét nội dung và thêm vào bộ sưu tập."; - case MENU_ENUM_SUBLABEL_AUDIO_SETTINGS: - return "Điều chỉnh thiết lập cho âm thanh ra."; - case MENU_ENUM_SUBLABEL_BLUETOOTH_ENABLE: - return "Bật/tắt bluetooth."; - case MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT: - return "Lưu cấu hình khi thoát retroarch."; - case MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS: - return "Change default settings for configuration files."; - case MENU_ENUM_SUBLABEL_CONFIGURATIONS_LIST: - return "Manage and create configuration files."; - case MENU_ENUM_SUBLABEL_CPU_CORES: - return "Số lượng lõi của CPU."; - case MENU_ENUM_SUBLABEL_FPS_SHOW: - return "Hiển thị tốc độ khung hình/giây trên màn hình."; - case MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS: - return "Đặt cấu hình thiết lập của hotkey."; - case MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO: - return "Kết hợp nút Gamepad để vào menu bật/tắt."; - case MENU_ENUM_SUBLABEL_INPUT_SETTINGS: - return "Điều chỉnh thiết lập cho joypads, bàn phím và chuột."; - case MENU_ENUM_SUBLABEL_INPUT_USER_BINDS: - return "Đặt cấu hình điều khiển cho người dùng này."; - case MENU_ENUM_SUBLABEL_LOG_VERBOSITY: - return "Kích hoạt or disable logging to the terminal."; - case MENU_ENUM_SUBLABEL_NETPLAY: - return "Tham gia hoặc làm máy chủ cho netplay."; - case MENU_ENUM_SUBLABEL_ONLINE_UPDATER: - return "Tải/cập nhật tiện ích và thành phần của RetroArch."; - case MENU_ENUM_SUBLABEL_SAMBA_ENABLE: - return "Bật/tắt chia sẻ thư mục trên mạng."; - case MENU_ENUM_SUBLABEL_SERVICES_SETTINGS: - return "Quản lý dịch vụ của hệ điều hành."; - case MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES: - return "Hiện ra tập tin và thư mục ẩn trong trình duyệt tập tin."; - case MENU_ENUM_SUBLABEL_SSH_ENABLE: - return "Bật/tắt giao thức SSH."; - case MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE: - return "Chặn tính năng screensaver (màn hình chờ)."; - case MENU_ENUM_SUBLABEL_USER_LANGUAGE: - return "Thiết lập ngôn ngữ của giao diện ."; - case MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION: - return "Inserts a black frame inbetween frames. Useful for users of 120 Hz monitors who want to play 60 Hz material with eliminated ghosting."; - case MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY: - return "Reduces latency at the cost of higher risk of video stuttering. Adds a delay after V-Sync (in ms)."; - case MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES: - return "Sets how many frames the CPU can run ahead of the GPU when using 'Hard GPU Sync'."; - case MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES: - return "Tells the video driver to explicitly use a specified buffering mode."; - case MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX: - return "Chọn màn hình hiển thị để sử dụng."; - case MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO: - return "The accurate estimated refresh rate of the monitor in Hz."; - case MENU_ENUM_SUBLABEL_VIDEO_SETTINGS: - return "Điều chỉnh thiết lập cho video ra."; - case MENU_ENUM_SUBLABEL_WIFI_SETTINGS: - return "Tìm mạng không dây và thiết lập kết nối."; - case MSG_APPENDED_DISK: - return "Appended disk"; - case MSG_APPLICATION_DIR: - return "Application Danh mục"; - case MSG_APPLYING_CHEAT: - return "Đang áp dụng cheat changes."; - case MSG_APPLYING_SHADER: - return "Đang áp dụng shader"; - case MSG_AUDIO_MUTED: - return "Âm thanh muted."; - case MSG_AUDIO_UNMUTED: - return "Âm thanh unmuted."; - case MSG_AUTOCONFIG_FILE_ERROR_SAVING: - return "Tập tin Autoconfig bị lỗi khi lưu."; - case MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY: - return "Tập tin Autoconfig đã lưu thành công."; - case MSG_AUTOSAVE_FAILED: - return "Could not initialize autosave."; - case MSG_AUTO_SAVE_STATE_TO: - return "Auto save state to"; - case MSG_BLOCKING_SRAM_OVERWRITE: - return "Blocking SRAM Overwrite"; - case MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT: - return "Đang đưa lên lệnh giao diện trên cổng"; - case MSG_BYTES: - return "bytes"; - case MSG_CANNOT_INFER_NEW_CONFIG_PATH: - return "Cannot infer new config path. Use current time."; - case MSG_CHEEVOS_HARDCORE_MODE_ENABLE: - return "Hardcore Mode Enabled: savestate & rewind were disabled."; - case MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS: - return "Comparing with known magic numbers..."; - case MSG_COMPILED_AGAINST_API: - return "Compiled against API"; - case MSG_CONFIG_DIRECTORY_NOT_SET: - return "Config directory not set. Cannot save new config."; - case MSG_CONNECTED_TO: - return "Connected to"; - case MSG_CONTENT_CRC32S_DIFFER: - return "Content CRC32s differ. Cannot use different games."; - case MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT: - return "Content loading skipped. Implementation will tải it on its own."; - case MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES: - return "Core does not support save states."; - case MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY: - return "Core options file created successfully."; - case MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER: - return "Could not find any next driver"; - case MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM: - return "Could not find compatible system."; - case MSG_COULD_NOT_FIND_VALID_DATA_TRACK: - return "Could not find valid data track"; - case MSG_COULD_NOT_OPEN_DATA_TRACK: - return "could not open data track"; - case MSG_COULD_NOT_READ_CONTENT_FILE: - return "Could not read content file"; - case MSG_COULD_NOT_READ_MOVIE_HEADER: - return "Could not read movie header."; - case MSG_COULD_NOT_READ_STATE_FROM_MOVIE: - return "Could not read state from movie."; - case MSG_CRC32_CHECKSUM_MISMATCH: - return "CRC32 checksum mismatch between content file and saved content checksum in replay file header; replay highly likely to desync on playback."; - case MSG_CUSTOM_TIMING_GIVEN: - return "Custom timing given"; - case MSG_DECOMPRESSION_ALREADY_IN_PROGRESS: - return "Decompression already in progress."; - case MSG_DECOMPRESSION_FAILED: - return "Decompression failed."; - case MSG_DETECTED_VIEWPORT_OF: - return "Detected viewport of"; - case MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH: - return "Did not find a valid content patch."; - case MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT: - return "Ngắt kết nối thiết bị từ cổng hợp lệ."; - case MSG_DISK_CLOSED: - return "Closed"; - case MSG_DISK_EJECTED: - return "Ejected"; - case MSG_DOWNLOADING: - return "Downloading"; - case MSG_DOWNLOAD_FAILED: - return "Download failed"; - case MSG_ERROR: - return "Error"; - case MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT: - return "Libretro core requires content, but nothing was provided."; - case MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT: - return "Libretro core requires special content, but none were provided."; - case MSG_ERROR_PARSING_ARGUMENTS: - return "Error parsing arguments."; - case MSG_ERROR_SAVING_CORE_OPTIONS_FILE: - return "Error saving core options file."; - case MSG_ERROR_SAVING_REMAP_FILE: - return "Error saving remap file."; - case MSG_ERROR_SAVING_SHADER_PRESET: - return "Error saving shader preset."; - case MSG_EXTERNAL_APPLICATION_DIR: - return "External Application Danh mục"; - case MSG_EXTRACTING: - return "Extracting"; - case MSG_EXTRACTING_FILE: - return "Extracting file"; - case MSG_FAILED_SAVING_CONFIG_TO: - return "Failed saving config to"; - case MSG_FAILED_TO: - return "Failed to"; - case MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR: - return "Failed to accept incoming spectator."; - case MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT: - return "Failed to allocate memory for patched content..."; - case MSG_FAILED_TO_APPLY_SHADER: - return "Failed to áp dụng shader."; - case MSG_FAILED_TO_BIND_SOCKET: - return "Failed to bind socket."; - case MSG_FAILED_TO_CREATE_THE_DIRECTORY: - return "Failed to create the directory."; - case MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE: - return "Failed to extract content from compressed file"; - case MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT: - return "Failed to get nickname from client."; - case MSG_FAILED_TO_LOAD: - return "Bị lỗi khi tải"; - case MSG_FAILED_TO_LOAD_CONTENT: - return "Failed to tải content"; - case MSG_FAILED_TO_LOAD_MOVIE_FILE: - return "Failed to tải movie file"; - case MSG_FAILED_TO_LOAD_OVERLAY: - return "Failed to tải overlay."; - case MSG_FAILED_TO_LOAD_STATE: - return "Failed to tải state from"; - case MSG_FAILED_TO_OPEN_LIBRETRO_CORE: - return "Failed to open libretro core"; - case MSG_FAILED_TO_PATCH: - return "Failed to patch"; - case MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT: - return "Failed to receive header from client."; - case MSG_FAILED_TO_RECEIVE_NICKNAME: - return "Failed to receive nickname."; - case MSG_FAILED_TO_RECEIVE_NICKNAME_FROM_HOST: - return "Failed to receive nickname from host."; - case MSG_FAILED_TO_RECEIVE_NICKNAME_SIZE_FROM_HOST: - return "Failed to receive nickname size from host."; - case MSG_FAILED_TO_RECEIVE_SRAM_DATA_FROM_HOST: - return "Failed to receive SRAM data from host."; - case MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY: - return "Failed to remove disk from tray."; - case MSG_FAILED_TO_REMOVE_TEMPORARY_FILE: - return "Failed to remove temporary file"; - case MSG_FAILED_TO_SAVE_SRAM: - return "Failed to save SRAM"; - case MSG_FAILED_TO_SAVE_STATE_TO: - return "Failed to save state to"; - case MSG_FAILED_TO_SEND_NICKNAME: - return "Failed to send nickname."; - case MSG_FAILED_TO_SEND_NICKNAME_SIZE: - return "Failed to send nickname size."; - case MSG_FAILED_TO_SEND_NICKNAME_TO_CLIENT: - return "Failed to send nickname to client."; - case MSG_FAILED_TO_SEND_NICKNAME_TO_HOST: - return "Failed to send nickname to host."; - case MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT: - return "Failed to send SRAM data to client."; - case MSG_FAILED_TO_START_AUDIO_DRIVER: - return "Bị lỗi khi chạy chương trình điều khiển âm thanh. Sẽ tiếp tục chạy và bỏ âm thanh."; - case MSG_FAILED_TO_START_MOVIE_RECORD: - return "Failed to start movie record."; - case MSG_FAILED_TO_START_RECORDING: - return "Failed to start recording."; - case MSG_FAILED_TO_TAKE_SCREENSHOT: - return "Bị lỗi khi chụp ảnh màn hình."; - case MSG_FAILED_TO_UNDO_LOAD_STATE: - return "Failed to undo tải state."; - case MSG_FAILED_TO_UNDO_SAVE_STATE: - return "Failed to undo save state."; - case MSG_FAILED_TO_UNMUTE_AUDIO: - return "Failed to unmute Âm thanh."; - case MSG_FATAL_ERROR_RECEIVED_IN: - return "Fatal error received in"; - case MSG_FILE_NOT_FOUND: - return "Không tìm thấy tệp"; - case MSG_FOUND_AUTO_SAVESTATE_IN: - return "Tìm thấy savestate tự đông trong"; - case MSG_FOUND_DISK_LABEL: - return "Found disk label"; - case MSG_FOUND_FIRST_DATA_TRACK_ON_FILE: - return "Found first data track on file"; - case MSG_FOUND_LAST_STATE_SLOT: - return "Tiềm thấy state slot xài lần trước"; - case MSG_FOUND_SHADER: - return "Found shader"; - case MSG_FRAMES: - return "Frames"; - case MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT: - return "Per-Game Options: game-specific core options found at"; - case MSG_GOT_INVALID_DISK_INDEX: - return "Got invalid disk index."; - case MSG_GRAB_MOUSE_STATE: - return "Grab mouse state"; - case MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING: - return "Libretro core is hardware rendered. Must use post-shaded recording as well."; - case MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32: - return "Inflated checksum did not match CRC32."; - case MSG_INPUT_CHEAT: - return "Input Cheat"; - case MSG_INPUT_CHEAT_FILENAME: - return "Cheat Filename"; - case MSG_INPUT_PRESET_FILENAME: - return "Preset Filename"; - case MSG_INTERFACE: - return "Interface"; - case MSG_INTERNAL_STORAGE: - return "Internal Storage"; - case MSG_REMOVABLE_STORAGE: - return "Removable Storage"; - case MSG_INVALID_NICKNAME_SIZE: - return "Invalid nickname size."; - case MSG_IN_BYTES: - return "in bytes"; - case MSG_IN_GIGABYTES: - return "in gigabytes"; - case MSG_IN_MEGABYTES: - return "in megabytes"; - case MSG_LIBRETRO_ABI_BREAK: - return "is compiled against a different version of libretro than this libretro implementation."; - case MSG_LIBRETRO_FRONTEND: - return "Frontend for libretro"; - case MSG_LOADED_STATE_FROM_SLOT: - return "Loaded state from slot #%d."; - case MSG_LOADED_STATE_FROM_SLOT_AUTO: - return "Loaded state from slot -1 (auto)."; - case MSG_LOADING: - return "Đang tải"; - case MSG_LOADING_CONTENT_FILE: - return "Loading content file"; - case MSG_LOADING_HISTORY_FILE: - return "Đang nạp tập tin lịch sử"; - case MSG_LOADING_STATE: - return "Đang tải state"; - case MSG_MEMORY: - return "Memory"; - case MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE: - return "Movie file is not a valid BSV1 file."; - case MSG_MOVIE_FORMAT_DIFFERENT_SERIALIZER_VERSION: - return "Movie format seems to have a different serializer version. Will most likely fail."; - case MSG_MOVIE_PLAYBACK_ENDED: - return "Movie playback ended."; - case MSG_MOVIE_RECORD_STOPPED: - return "Stopping movie record."; - case MSG_NETPLAY_FAILED: - return "Failed to initialize netplay."; - case MSG_NO_CONTENT_STARTING_DUMMY_CORE: - return "No content, starting dummy core."; - case MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET: - return "No save state has been overwritten yet."; - case MSG_NO_STATE_HAS_BEEN_LOADED_YET: - return "No state has been loaded yet."; - case MSG_OVERRIDES_ERROR_SAVING: - return "Error saving overrides."; - case MSG_OVERRIDES_SAVED_SUCCESSFULLY: - return "Overrides saved successfully."; - case MSG_PAUSED: - return "Paused."; - case MSG_PROGRAM: - return "RetroArch"; - case MSG_READING_FIRST_DATA_TRACK: - return "Reading first data track..."; - case MSG_RECEIVED: - return "received"; - case MSG_RECORDING_TERMINATED_DUE_TO_RESIZE: - return "Recording terminated due to resize."; - case MSG_RECORDING_TO: - return "Recording to"; - case MSG_REDIRECTING_CHEATFILE_TO: - return "Redirecting cheat file to"; - case MSG_REDIRECTING_SAVEFILE_TO: - return "Redirecting save file to"; - case MSG_REDIRECTING_SAVESTATE_TO: - return "Redirecting savestate to"; - case MSG_REMAP_FILE_SAVED_SUCCESSFULLY: - return "Remap file saved successfully."; - case MSG_REMOVED_DISK_FROM_TRAY: - return "Removed disk from tray."; - case MSG_REMOVING_TEMPORARY_CONTENT_FILE: - return "Removing temporary content file"; - case MSG_RESET: - return "Reset"; - case MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT: - return "Restarting recording due to driver reinit."; - case MSG_RESTORED_OLD_SAVE_STATE: - return "Restored old save state."; - case MSG_RESTORING_DEFAULT_SHADER_PRESET_TO: - return "Shaders: restoring default shader preset to"; - case MSG_REVERTING_SAVEFILE_DIRECTORY_TO: - return "Reverting savefile directory to"; - case MSG_REVERTING_SAVESTATE_DIRECTORY_TO: - return "Reverting savestate directory to"; - case MSG_REWINDING: - return "Rewinding."; - case MSG_REWIND_INIT: - return "Initializing rewind buffer with size"; - case MSG_REWIND_INIT_FAILED: - return "Failed to initialize rewind buffer. Rewinding will be disabled."; - case MSG_REWIND_INIT_FAILED_THREADED_AUDIO: - return "Implementation uses threaded Âm thanh. Cannot use rewind."; - case MSG_REWIND_REACHED_END: - return "Reached end of rewind buffer."; - case MSG_SAVED_NEW_CONFIG_TO: - return "Saved new config to"; - case MSG_SAVED_STATE_TO_SLOT: - return "Saved state to slot #%d."; - case MSG_SAVED_STATE_TO_SLOT_AUTO: - return "Saved state to slot #-1 (auto)."; - case MSG_SAVED_SUCCESSFULLY_TO: - return "Saved successfully to"; - case MSG_SAVING_RAM_TYPE: - return "Saving RAM type"; - case MSG_SAVING_STATE: - return "Saving state"; - case MSG_SCANNING: - return "Scanning"; - case MSG_SCANNING_OF_DIRECTORY_FINISHED: - return "Scanning of directory finished"; - case MSG_SENDING_COMMAND: - return "Sending command"; - case MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED: - return "Several patches are explicitly defined, ignoring all..."; - case MSG_SHADER_PRESET_SAVED_SUCCESSFULLY: - return "Shader preset saved successfully."; - case MSG_SKIPPING_SRAM_LOAD: - return "Skipping SRAM tải."; - case MSG_SLOW_MOTION: - return "Slow motion."; - case MSG_SLOW_MOTION_REWIND: - return "Slow motion rewind."; - case MSG_SRAM_WILL_NOT_BE_SAVED: - return "SRAM will not be saved."; - case MSG_STARTING_MOVIE_PLAYBACK: - return "Starting movie playback."; - case MSG_STARTING_MOVIE_RECORD_TO: - return "Starting movie record to"; - case MSG_STATE_SIZE: - return "State size"; - case MSG_STATE_SLOT: - return "State slot"; - case MSG_TAKING_SCREENSHOT: - return "Taking screenshot."; - case MSG_TO: - return "to"; - case MSG_UNDID_LOAD_STATE: - return "Undid Tải state."; - case MSG_UNDOING_SAVE_STATE: - return "Undoing save state"; - case MSG_UNKNOWN: - return "Unknown"; - case MSG_UNPAUSED: - return "Unpaused."; - case MSG_UNRECOGNIZED_COMMAND: - return "Unrecognized command"; - case MSG_USING_CORE_NAME_FOR_NEW_CONFIG: - return "Using core name for new config."; - case MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED: - return "Using libretro dummy core. Skipping recording."; - case MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT: - return "Kết nối thiết bị từ cổng hợp lệ."; - case MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT: - return "Đang ngắt kết nối thiết bị từ cổng"; - case MSG_VALUE_REBOOTING: - return "Đang khởi động lại..."; - case MSG_VALUE_SHUTTING_DOWN: - return "Đang tắt máy..."; - case MSG_VERSION_OF_LIBRETRO_API: - return "Phiên bản của libretro API"; - case MSG_VIEWPORT_SIZE_CALCULATION_FAILED: - return "Viewport size calculation failed! Will continue using raw data. This will probably not work right ..."; - case MSG_VIRTUAL_DISK_TRAY: - return "virtual disk tray."; + #include "msg_hash_vn.h" default: -#if 0 - RARCH_LOG("Unimplemented: [%d]\n", msg); -#endif break; } diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h new file mode 100644 index 0000000000..1d433761e9 --- /dev/null +++ b/intl/msg_hash_vn.h @@ -0,0 +1,3007 @@ +MSG_HASH( + MSG_COMPILER, + "Compiler" + ) +MSG_HASH( + MSG_UNKNOWN_COMPILER, + "Unknown compiler" + ) +MSG_HASH( + MSG_DEVICE_DISCONNECTED_FROM_PORT, + "Device disconnected from port" + ) +MSG_HASH( + MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, + "Netplay không biết lệnh nhận được" + ) +MSG_HASH( + MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, + "Ttệp đã tồn tại. Đang lưu vào backup buffer" + ) +MSG_HASH( + MSG_GOT_CONNECTION_FROM, + "Được kết nối từ: \"%s\"" + ) +MSG_HASH( + MSG_GOT_CONNECTION_FROM_NAME, + "Got connection from: \"%s (%s)\"" + ) +MSG_HASH( + MSG_PUBLIC_ADDRESS, + "Public address" + ) +MSG_HASH( + MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, + "No arguments supplied and no menu builtin, displaying help..." + ) +MSG_HASH( + MSG_NETPLAY_USERS_HAS_FLIPPED, + "Người dùng Netplay đã flipped" + ) +MSG_HASH( + MSG_SETTING_DISK_IN_TRAY, + "Setting disk in tray" + ) +MSG_HASH( + MSG_WAITING_FOR_CLIENT, + "Đang đợi máy khách ..." + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_LEFT_THE_GAME, + "You have left the game" + ) +MSG_HASH( + MSG_NETPLAY_YOU_HAVE_JOINED_AS_PLAYER_N, + "You have joined as player %d" + ) +MSG_HASH( + MSG_NETPLAY_IMPLEMENTATIONS_DIFFER, + "Implementations differ. Make sure you're using the exact same versions of RetroArch and the core." + ) +MSG_HASH( + MSG_NETPLAY_ENDIAN_DEPENDENT, + "This core does not support inter-architecture netplay between these systems" + ) +MSG_HASH( + MSG_NETPLAY_PLATFORM_DEPENDENT, + "This core does not support inter-architecture netplay" + ) +MSG_HASH( + MSG_NETPLAY_ENTER_PASSWORD, + "Enter netplay server password:" + ) +MSG_HASH( + MSG_NETPLAY_INCORRECT_PASSWORD, + "Incorrect password" + ) +MSG_HASH( + MSG_NETPLAY_SERVER_NAMED_HANGUP, + "\"%s\" has disconnected" + ) +MSG_HASH( + MSG_NETPLAY_SERVER_HANGUP, + "A netplay client has disconnected" + ) +MSG_HASH( + MSG_NETPLAY_CLIENT_HANGUP, + "Netplay disconnected" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, + "You do not have permission to play" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY_NO_SLOTS, + "There are no free player slots" + ) +MSG_HASH( + MSG_NETPLAY_CANNOT_PLAY, + "Cannot switch to play mode" + ) +MSG_HASH( + MSG_NETPLAY_PEER_PAUSED, + "Netplay peer \"%s\" paused" + ) +MSG_HASH( + MSG_NETPLAY_CHANGED_NICK, + "Your nickname changed to \"%s\"" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHARED_CONTEXT, + "Give hardware-rendered cores their own private context. Avoids having to assume hardware state changes inbetween frames." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_SETTINGS, + "Điều chỉnh thiết lập related to the appearance of the menu screen." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC, + "Hard-synchronize the CPU and GPU. Reduces latency at the cost of performance." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_THREADED, + "Improves performance at the cost of latency and more video stuttering. Use only if you cannot obtain full speed otherwise." + ) +MSG_HASH( + MSG_AUDIO_VOLUME, + "Âm lượng âm thanh" + ) +MSG_HASH( + MSG_AUTODETECT, + "Tự động phát hiện" + ) +MSG_HASH( + MSG_AUTOLOADING_SAVESTATE_FROM, + "Đang tự đông tải savestate từ" + ) +MSG_HASH( + MSG_CAPABILITIES, + "Capabilities" + ) +MSG_HASH( + MSG_CONNECTING_TO_NETPLAY_HOST, + "Đang kết nối vào máy chủ netplay" + ) +MSG_HASH( + MSG_CONNECTING_TO_PORT, + "Đang kết nối vào port" + ) +MSG_HASH( + MSG_CONNECTION_SLOT, + "Khe kết nối" + ) +MSG_HASH( + MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, + "Sorry, unimplemented: cores that don't demand content cannot participate in netplay." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_PASSWORD, + "Mật khẩu" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS, + "Tài khoản Cheevos" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME, + "Tên truy nhập" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST, + "Những tài khoản" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST_END, + "Điểm cuối của danh sách tài khoản" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS, + "Thành tích Retro" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST, + "Danh sách thành tích" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_LIST_HARDCORE, + "Achievement List (Hardcore)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, + "Thêm nội dung" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATIONS_LIST, + "Configurations" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ADD_TAB, + "Tạo nội dung" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_TAB, + "Netplay Rooms" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ASK_ARCHIVE, + "Hỏi" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ASSETS_DIRECTORY, + "Danh mục assets" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_BLOCK_FRAMES, + "Block Frames" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DEVICE, + "Thiết bị âm thanh" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DRIVER, + "Trình điều khiển âm thanh" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_DSP_PLUGIN, + "Âm thanh DSP Plugin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_ENABLE, + "Kích hoạt âm thanh" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_FILTER_DIR, + "Âm thanh Filter Danh mục" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_TURBO_DEADZONE_LIST, + "Turbo/Deadzone" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_LATENCY, + "Âm thanh Latency (ms)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MAX_TIMING_SKEW, + "Âm thanh Maximum Timing Skew" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MUTE, + "Âm thanh Mute" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_RATE, + "Âm thanh Output Rate (Hz)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RATE_CONTROL_DELTA, + "Âm thanh Rate Control Delta" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_RESAMPLER_DRIVER, + "Âm thanh Resampler Driver" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, + "Âm thanh" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_SYNC, + "Âm thanh Sync" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME, + "Mức âm lượng (dB)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_EXCLUSIVE_MODE, + "WASAPI Exclusive Mode" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_FLOAT_FORMAT, + "WASAPI Float Format" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "WASAPI Shared Buffer Length" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTOSAVE_INTERVAL, + "SaveRAM Autosave Interval" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_OVERRIDES_ENABLE, + "Tự động tải tập tin ghi đè" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_REMAPS_ENABLE, + "Tự động tải tập tin Remap" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUTO_SHADERS_ENABLE, + "Tự động tải Shader Presets" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, + "Trở lại" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_CONFIRM, + "Xác nhận" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, + "Thông tin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_QUIT, + "Thoát" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, + "Cuộn xuống" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, + "Cuộn lên" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, + "Start" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_KEYBOARD, + "Bật/tắt bàn phím" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, + "Bật/tắt trình đơn" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS, + "Trình đơn điều khiển căn bản" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_CONFIRM, + "Confirm/OK" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_INFO, + "Thông tin" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_QUIT, + "Thoát" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, + "Cuộn lên" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_START, + "Những mặc định" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, + "Bật/tắt bàn phím" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_MENU, + "Bật/tắt trình đơn" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLOCK_SRAM_OVERWRITE, + "Khi tải savestate đừng ghi đè SaveRAM" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BLUETOOTH_ENABLE, + "Kích hoạt Bluetooth" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BUILDBOT_ASSETS_URL, + "URL của Buildbot Assets" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CACHE_DIRECTORY, + "Danh mục cache" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CAMERA_ALLOW, + "Cho phép Camera" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, + "Trình Camera" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT, + "Cheat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_CHANGES, + "Áp dụng thay đổi của Cheat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_DATABASE_PATH, + "Danh mục tập tin Cheat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE, + "Tập tin Cheat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_LOAD, + "Tải tập tin Cheat" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_FILE_SAVE_AS, + "Lưu tập tin Cheat như" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEAT_NUM_PASSES, + "Cheat Passes" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, + "Miêu tả" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE, + "Chế độ Hardcore" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ACHIEVEMENTS, + "Thành tựu bị khóa:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, + "Đã khóa" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, + "Những thành tựu Retro" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, + "Thử nghiệm không chính thức" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, + "Những thành tựu đã mở:" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY, + "Đã mở" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOSE_CONTENT, + "Đóng nội dung" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIG, + "Config" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATIONS, + "Tải cấu hình" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS, + "Cấu hình" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONFIG_SAVE_ON_EXIT, + "Lưu cấu hình khi thoát" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_COLLECTION_LIST, + "Bộ sưu tập" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, + "Mục cơ sở dữ liệu nội dung" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_DIR, + "Mục nội dung" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, + "Kích thước danh sách lịch sử") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, + "Allow to remove entries") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, + "Trình đơn lẹ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIR, + "Mục Core Assets") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, + "Mục Downloads") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_CHEAT_OPTIONS, + "Cheats") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_COUNTERS, + "Core Counters") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_ENABLE, + "Hiển thị tên của core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFORMATION, + "Core Thông tin") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_AUTHORS, + "Tác giả") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CATEGORIES, + "Thể loại") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_LABEL, + "Nhãn hiệu Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_CORE_NAME, + "Tên của Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE, + "Phần vững") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_LICENSES, + "Bản quyền") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_PERMISSIONS, + "Phép" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SUPPORTED_EXTENSIONS, + "Tiện ích mở rộng được hỗ trợ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_MANUFACTURER, + "Nhà sản xuất hệ thống") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INFO_SYSTEM_NAME, + "Tên hệ thống") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_INPUT_REMAPPING_OPTIONS, + "Điều khiển") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_LIST, + "Tải Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_OPTIONS, + "Options" "Tùy chọn") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS, + "Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_SET_SUPPORTS_NO_CONTENT_ENABLE, + "Tự động chạy Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, + "Tự động giải nén lưu trữ tải về") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_BUILDBOT_URL, + "URL của Buildbot Cores") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, + "Cập nhật cho Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CORE_UPDATER_SETTINGS, + "Cập nhật") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_ARCHITECTURE, + "Kiến trúc CPU:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CPU_CORES, + "CPU Cores:") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_DIRECTORY, + "Mục Cursor") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CURSOR_MANAGER, + "Cursor Manager") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CUSTOM_RATIO, + "Custom Ratio") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_MANAGER, + "Quản lý cho cơ sở dữ liệu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_SELECTION, + "Lựa chọn cơ sở dữ liệu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DELETE_ENTRY, + "Xoá") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FAVORITES, + "Yêu thích") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_DEFAULT, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NONE, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_NOT_FOUND, + "Không tìm thấy thư mục.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, + "Thư mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_CYCLE_TRAY_STATUS, + "Tình trạng khay đĩa") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_IMAGE_APPEND, + "Thêm đĩa") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_INDEX, + "Chỉ số đĩa") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DISK_OPTIONS, + "Điều khiển đĩa") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DONT_CARE, + "Không quan tâm") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, + "Mục Downloads") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE, + "Tải về Core...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, + "Tải về nội dung") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_ENABLE, + "DPI Override Enable") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DPI_OVERRIDE_VALUE, + "Kích hoạt DPI Override") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS, + "Trình điều khiển") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DUMMY_ON_CORE_SHUTDOWN, + "Tải Core giả khi tắt máy") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CHECK_FOR_MISSING_FIRMWARE, + "Check for Missing Firmware Before Loading") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPER, + "Nền năng động") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DYNAMIC_WALLPAPERS_DIRECTORY, + "Mục nền năng động") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEEVOS_ENABLE, + "Kích hoạt") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_HOVER_COLOR, + "Menu entry hover color") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ENTRY_NORMAL_COLOR, + "Menu entry normal color") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FALSE, + "False") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FASTFORWARD_RATIO, + "Maximum Run Speed") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FPS_SHOW, + "Display Framerate") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_ENABLE, + "Limit Maximum Run Speed") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, + "Frame Throttle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FRONTEND_COUNTERS, + "Frontend Counters") +MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS, + "Tải Content-Specific Core Options Automatically") +MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_CREATE, + "Create game-options file") +MSG_HASH(MENU_ENUM_LABEL_VALUE_GAME_SPECIFIC_OPTIONS_IN_USE, + "Game-options file") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP, + "Help") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_AUDIO_VIDEO_TROUBLESHOOTING, + "Âm thanh/Video Troubleshooting") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CHANGE_VIRTUAL_GAMEPAD, + "Changing Virtual Gamepad Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, + "Basic Menu Controls") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LIST, + "Help") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_LOADING_CONTENT, + "Đang tải Content") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_SCANNING_CONTENT, + "Scanning For Content") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HELP_WHAT_IS_A_CORE, + "What Is A Core?") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_LIST_ENABLE, + "History List Enable") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HISTORY_TAB, + "History") +MSG_HASH(MENU_ENUM_LABEL_VALUE_HORIZONTAL_MENU, + "Horizontal Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_IMAGES_TAB, + "Image") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION, + "Information") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INFORMATION_LIST, + "Information") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ADC_TYPE, + "Analog To Digital Type") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ALL_USERS_CONTROL_MENU, + "All Users Control Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X, + "Left Analog X") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, + "Left analog X- (left)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, + "Left analog X+ (right)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y, + "Left Analog Y") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, + "Left analog Y- (up)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, + "Left analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X, + "Right Analog X") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, + "Right analog X- (left)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, + "Right analog X+ (right)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y, + "Right Analog Y") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, + "Right analog Y- (up)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, + "Right analog Y+ (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AUTODETECT_ENABLE, + "Kích hoạt Autoconfig") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_AXIS_THRESHOLD, + "Analog Stick Deadzone") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, + "Menu Swap OK & Cancel Buttons") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL, + "Bind All") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, + "Bind Default All") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, + "Bind Timeout") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_HIDE_UNBOUND, + "Hide Unbound Core Input Descriptors") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DESCRIPTOR_LABEL_SHOW, + "Display Input Descriptor Labels") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_INDEX, + "Device Index") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_TYPE, + "Device Type") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DRIVER, + "Input Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_DUTY_CYCLE, + "Duty Cycle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, + "Input Hotkey Binds") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_ICADE_ENABLE, + "Kích hoạt Keyboard Gamepad Mapping") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, + "A button (right)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, + "B button (down)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, + "Down D-pad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, + "L2 button (trigger)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, + "L3 button (thumb)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, + "L button (shoulder)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, + "Left D-pad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, + "R2 button (trigger)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, + "R3 button (thumb)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, + "R button (shoulder)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, + "Right D-pad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, + "Select button") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, + "Start button") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, + "Up D-pad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, + "X button (top)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, + "Y button (left)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY, + "(Key: %s)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE, + "Keyboard Gamepad Mapping Type") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS, + "Max Users") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, + "Menu Toggle Gamepad Combo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, + "Cheat index -") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, + "Cheat index +") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, + "Cheat toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, + "Disk eject toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, + "Disk next") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, + "Disk prev") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, + "Kích hoạt hotkeys") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, + "Fast forward hold") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, + "Fast forward toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, + "Frameadvance") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, + "Bật/tắt chế độ toàn màn hình") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, + "Grab mouse toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, + "Game focus toggle") +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, + "Movie record toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, + "Âm thanh mute toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, + "Netplay flip users") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, + "Netplay toggle play/spectate mode") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, + "On-screen keyboard toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, + "Overlay next") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, + "Pause toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, + "Quit RetroArch") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, + "Reset game") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, + "Rewind") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, + "Save state") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, + "Chụp ảnh màn hình") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, + "Next shader") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, + "Previous shader") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, + "Slow motion") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, + "Savestate slot -") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, + "Savestate slot +") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, + "Volume -") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, + "Volume +") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_ENABLE, + "Display Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_OVERLAY_HIDE_IN_MENU, + "Hide Overlay In Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, + "Poll Type Behavior") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_EARLY, + "Early") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_LATE, + "Late") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR_NORMAL, + "Normal") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_PREFER_FRONT_TOUCH, + "Prefer Front Touch") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAPPING_DIRECTORY, + "Input Remapping") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, + "Kích hoạt Remap Binds") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, + "Lưu Autoconfig") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS, + "Input") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_SMALL_KEYBOARD_ENABLE, + "Small Keyboard Enable") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TOUCH_ENABLE, + "Kích hoạt Touch") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, + "Kích hoạt Turbo") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_TURBO_PERIOD, + "Turbo Period") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_USER_BINDS, + "Input User %u Binds") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INTERNAL_STORAGE_STATUS, + "Internal storage status") +MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_AUTOCONFIG_DIR, + "Input Autoconfig Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_JOYPAD_DRIVER, + "Joypad Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LAKKA_SERVICES, + "Services") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_SIMPLIFIED, + "Tiếng Trung Quốc (Chữ Hán giản thể)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_CHINESE_TRADITIONAL, + "Tiếng Trung Quốc (Chữ Hán phồn thể)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_DUTCH, + "Tiếng Hà Lan") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ENGLISH, + "Tiếng Anh") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ESPERANTO, + "Tiếng Quốc tế ngữ") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_FRENCH, + "Tiếng Pháp") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_GERMAN, + "Tiếng Đức") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_ITALIAN, + "Tiếng Ý") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_JAPANESE, + "Tiếng Nhật") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_KOREAN, + "Tiếng Hàn Quốc") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_POLISH, + "Polish") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_BRAZIL, + "Tiếng Bồ Đào Nha (Brazil)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_PORTUGUESE_PORTUGAL, + "Tiếng Bồ Đào Nha (Portugal)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_RUSSIAN, + "Tiếng Nga") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_SPANISH, + "Tiếng Tây Ban Nha") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LANG_VIETNAMESE, + "Tiếng Việt") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LEFT_ANALOG, + "Left Analog") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_DIR_PATH, + "Core Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, + "Core Info Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, + "Core Logging Level") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LINEAR, + "Linear") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_ARCHIVE, + "Tải Archive With Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_HISTORY, + "Tải Recent") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_CONTENT_LIST, + "Tải Content") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOAD_STATE, + "Tải State") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_ALLOW, + "Allow Location") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOCATION_DRIVER, + "Location Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, + "Logging") +MSG_HASH(MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, + "Logging Verbosity") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MAIN_MENU, + "Main Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MANAGEMENT, + "Database thiết lập") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME, + "Menu Color Theme") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE, + "Blue") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_BLUE_GREY, + "Blue Grey") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_DARK_BLUE, + "Dark Blue") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_GREEN, + "Green") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_NVIDIA_SHIELD, + "Shield") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_RED, + "Red") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_COLOR_THEME_YELLOW, + "Yellow") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_FOOTER_OPACITY, + "Footer Opacity") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_HEADER_OPACITY, + "Header Opacity") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_DRIVER, + "Menu Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_ENUM_THROTTLE_FRAMERATE, + "Throttle Menu Framerate") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, + "Settings") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_LINEAR_FILTER, + "Menu Linear Filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS, + "Menu") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER, + "Background") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, + "Background opacity") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MISSING, + "Missing") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MORE, + "...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, + "Mouse Support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MULTIMEDIA_SETTINGS, + "Multimedia") +MSG_HASH(MENU_ENUM_LABEL_VALUE_MUSIC_TAB, + "Music") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Filter unknown extensions") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NAVIGATION_WRAPAROUND, + "Navigation Wrap-Around") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NEAREST, + "Nearest") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY, + "Netplay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_SLAVES, + "Allow Slave-Mode Clients") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, + "Netplay Check Frames") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, + "Input Latency Frames") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, + "Input Latency Frames Range") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_CLIENT_SWAP_INPUT, + "Netplay P2 Uses C1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, + "Netplay Delay Frames") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, + "Disconnect from netplay host") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, + "Kích hoạt Netplay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, + "Connect to netplay host") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, + "Start netplay host") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_IP_ADDRESS, + "Server Address") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS, + "Scan local network") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_MODE, + "Kích hoạt Netplay Client") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NICKNAME, + "Username") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PASSWORD, + "Server Password") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_PUBLIC_ANNOUNCE, + "Publicly Announce Netplay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REQUIRE_SLAVES, + "Disallow Non-Slave-Mode Clients") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, + "Netplay thiết lập") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_AS_SPECTATOR, + "Netplay Spectator Mode") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_STATELESS_MODE, + "Netplay Stateless Mode") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATE_PASSWORD, + "Server Spectate-Only Password") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, + "Kích hoạt Netplay Spectator") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_TCP_UDP_PORT, + "Netplay TCP Port") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, + "Netplay NAT Traversal") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, + "Network Commands") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT, + "Network Command Port") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_INFORMATION, + "Network Information") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE, + "Network Gamepad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_PORT, + "Network Remote Base Port") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, + "Network") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO, + "No") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NONE, + "None") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE, + "N/A") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY, + "No achievements to display.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE, + "No Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE, + "No cores available.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_INFORMATION_AVAILABLE, + "No core information available.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_CORE_OPTIONS_AVAILABLE, + "No core options available.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ENTRIES_TO_DISPLAY, + "No entries to display.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE, + "No history available.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, + "No information is available.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_ITEMS, + "No items.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND, + "No netplay hosts found.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_NETWORKS_FOUND, + "No networks found.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, + "No performance counters.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLISTS, + "No playlists.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, + "No playlist entries available.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, + "No settings found.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NO_SHADER_PARAMETERS, + "No shader parameters.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OFF, + "OFF") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ON, + "ON") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE, + "Online") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, + "Online Updater") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS, + "Onscreen Display") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS, + "Onscreen Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS, + "Onscreen Notifications") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OPEN_ARCHIVE, + "Browse Archive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OPTIONAL, + "Optional") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY, + "Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_AUTOLOAD_PREFERRED, + "Tự động tải Preferred Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_DIRECTORY, + "Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_OPACITY, + "Overlay Opacity") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_PRESET, + "Overlay Preset") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SCALE, + "Overlay Scale") +MSG_HASH(MENU_ENUM_LABEL_VALUE_OVERLAY_SETTINGS, + "Onscreen Overlay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PAL60_ENABLE, + "Use PAL60 Mode") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PARENT_DIRECTORY, + "Parent directory") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, + "Pause when menu activated") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, + "Don't run in background") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, + "Performance Counters") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLISTS_TAB, + "Playlists") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_DIRECTORY, + "Playlist Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS, + "Playlists") +MSG_HASH(MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, + "Touch Support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PORT, + "Port") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PRESENT, + "Present") +MSG_HASH(MENU_ENUM_LABEL_VALUE_PRIVACY_SETTINGS, + "Privacy") +MSG_HASH(MENU_ENUM_LABEL_VALUE_QUIT_RETROARCH, + "Thoát RetroArch") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ANALOG, + "Analog supported") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_BBFC_RATING, + "BBFC Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CERO_RATING, + "CERO Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_COOP, + "Co-op supported") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_CRC32, + "CRC32") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DESCRIPTION, + "Description") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_DEVELOPER, + "Developer") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_ISSUE, + "Edge Magazine Issue") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_RATING, + "Edge Magazine Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_EDGE_MAGAZINE_REVIEW, + "Edge Magazine Review") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ELSPA_RATING, + "ELSPA Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ENHANCEMENT_HW, + "Enhancement Hardware") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ESRB_RATING, + "ESRB Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FAMITSU_MAGAZINE_RATING, + "Famitsu Magazine Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_FRANCHISE, + "Franchise") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_GENRE, + "Genre") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_MD5, + "MD5") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_NAME, + "Name") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_ORIGIN, + "Origin") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PEGI_RATING, + "PEGI Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_PUBLISHER, + "Publisher") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_MONTH, + "Releasedate Month") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RELEASE_YEAR, + "Releasedate Year") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_RUMBLE, + "Rumble supported") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SERIAL, + "Serial") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_SHA1, + "SHA1") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, + "Start Content") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RDB_ENTRY_TGDB_RATING, + "TGDB Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REBOOT, + "Khởi động lại") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_CONFIG_DIRECTORY, + "Recording Config") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_OUTPUT_DIRECTORY, + "Recording Output") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, + "Recording") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, + "Load Recording Config...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, + "Record Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_ENABLE, + "Enable Recording") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_PATH, + "Save Output Recording as...") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, + "Save Recordings in Output Dir") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE, + "Remap File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_LOAD, + "Tải Remap File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_CORE, + "Save Core Remap File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REMAP_FILE_SAVE_GAME, + "Save Game Remap File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REQUIRED, + "Required") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_CONTENT, + "Khởi động lại") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESTART_RETROARCH, + "Restart RetroArch") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME, + "Resume") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RESUME_CONTENT, + "Resume") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROKEYBOARD, + "RetroKeyboard") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD, + "RetroPad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RETROPAD_WITH_ANALOG, + "RetroPad w/ Analog") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, + "Achievements") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, + "Kích hoạt Rewind") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, + "Rewind Granularity") +MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, + "Rewind") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, + "File Browser") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, + "Config Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RGUI_SHOW_START_SCREEN, + "Display Start Screen") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RIGHT_ANALOG, + "Right Analog") +MSG_HASH(MENU_ENUM_LABEL_VALUE_RUN, + "Run") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAMBA_ENABLE, + "Kích hoạt SAMBA") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVEFILE_DIRECTORY, + "Savefile Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_INDEX, + "Save State Auto Index") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_LOAD, + "Tự động tải State") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_AUTO_SAVE, + "Auto Save State") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_DIRECTORY, + "Savestate Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVESTATE_THUMBNAIL_ENABLE, + "Savestate Thumbnails") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, + "Save Current Configuration") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Save Core Overrides") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Save Game Overrides") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, + "Save New Configuration") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVE_STATE, + "Save State") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, + "Saving") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_DIRECTORY, + "Scan Directory") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_FILE, + "Scan File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCAN_THIS_DIRECTORY, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, + "Screenshot Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION, + "Screen Resolution") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SEARCH, + "Search") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SECONDS, + "seconds") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS, + "Thiết lập") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SETTINGS_TAB, + "Thiết lập") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER, + "Shader") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_APPLY_CHANGES, + "Áp dụng Changes") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_OPTIONS, + "Shaders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON, + "Ribbon") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_RIBBON_SIMPLIFIED, + "Ribbon (simplified)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SIMPLE_SNOW, + "Simple Snow") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, + "Snow") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_ADVANCED_SETTINGS, + "Show Advanced thiết lập") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, + "Show Hidden Files and Folders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHUTDOWN, + "Tắt Máy") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, + "Slow-Motion Ratio") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVEFILES_ENABLE, + "Sort Saves In Folders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SORT_SAVESTATES_ENABLE, + "Sort Savestates In Folders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SSH_ENABLE, + "Kích hoạt SSH") +MSG_HASH(MENU_ENUM_LABEL_VALUE_START_CORE, + "Start Core") +MSG_HASH(MENU_ENUM_LABEL_VALUE_START_NET_RETROPAD, + "Start Remote RetroPad") +MSG_HASH(MENU_ENUM_LABEL_VALUE_START_VIDEO_PROCESSOR, + "Start Video Processor") +MSG_HASH(MENU_ENUM_LABEL_VALUE_STATE_SLOT, + "State Slot") +MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, + "Status") +MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, + "stdin Commands") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, + "Suggested cores") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, + "Suspend Screensaver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, + "Kích hoạt System BGM") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_DIRECTORY, + "System/BIOS Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFORMATION, + "System Information") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_7ZIP_SUPPORT, + "7zip support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ALSA_SUPPORT, + "ALSA support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_BUILD_DATE, + "Build date") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CG_SUPPORT, + "Cg support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COCOA_SUPPORT, + "Cocoa support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_COMMAND_IFACE_SUPPORT, + "Command interface support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CORETEXT_SUPPORT, + "CoreText support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_CPU_FEATURES, + "CPU Features") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_DPI, + "Display metric DPI") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_HEIGHT, + "Display metric height (mm)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DISPLAY_METRIC_MM_WIDTH, + "Display metric width (mm)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DSOUND_SUPPORT, + "DirectSound support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WASAPI_SUPPORT, + "WASAPI support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYLIB_SUPPORT, + "Dynamic library support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_DYNAMIC_SUPPORT, + "Dynamic run-time loading of libretro library") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_EGL_SUPPORT, + "EGL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FBO_SUPPORT, + "OpenGL/Direct3D render-to-texture (multi-pass shaders) support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FFMPEG_SUPPORT, + "FFmpeg support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FREETYPE_SUPPORT, + "FreeType support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_IDENTIFIER, + "Frontend identifier") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_NAME, + "Frontend name") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_FRONTEND_OS, + "Frontend OS") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION, + "Git version") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GLSL_SUPPORT, + "GLSL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_HLSL_SUPPORT, + "HLSL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_JACK_SUPPORT, + "JACK support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_KMS_SUPPORT, + "KMS/EGL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBRETRODB_SUPPORT, + "LibretroDB support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBUSB_SUPPORT, + "Libusb support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_LIBXML2_SUPPORT, + "libxml2 XML parsing support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETPLAY_SUPPORT, + "Netplay (peer-to-peer) support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_COMMAND_IFACE_SUPPORT, + "Network Command interface support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_NETWORK_REMOTE_SUPPORT, + "Network Gamepad support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENAL_SUPPORT, + "OpenAL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGLES_SUPPORT, + "OpenGL ES support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENGL_SUPPORT, + "OpenGL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENSL_SUPPORT, + "OpenSL support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OPENVG_SUPPORT, + "OpenVG support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OSS_SUPPORT, + "OSS support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_OVERLAY_SUPPORT, + "Overlay support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, + "Power source") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGED, + "Charged") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_CHARGING, + "Charging") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_DISCHARGING, + "Discharging") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE_NO_SOURCE, + "No source") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PULSEAUDIO_SUPPORT, + "PulseAudio support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_PYTHON_SUPPORT, + "Python (script support in shaders) support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RBMP_SUPPORT, + "BMP support (RBMP)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RETRORATING_LEVEL, + "RetroRating level") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RJPEG_SUPPORT, + "JPEG support (RJPEG)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ROARAUDIO_SUPPORT, + "RoarAudio support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RPNG_SUPPORT, + "PNG support (RPNG)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RSOUND_SUPPORT, + "RSound support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_RTGA_SUPPORT, + "TGA support (RTGA)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL2_SUPPORT, + "SDL2 support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_IMAGE_SUPPORT, + "SDL image support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SDL_SUPPORT, + "SDL1.2 support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, + "Slang support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_THREADING_SUPPORT, + "Threading support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_UDEV_SUPPORT, + "Udev support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_V4L2_SUPPORT, + "Video4Linux2 support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER, + "Video context driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VULKAN_SUPPORT, + "Vulkan support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_WAYLAND_SUPPORT, + "Wayland support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_X11_SUPPORT, + "X11 support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XAUDIO2_SUPPORT, + "XAudio2 support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_XVIDEO_SUPPORT, + "XVideo support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_ZLIB_SUPPORT, + "Zlib support") +MSG_HASH(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT, + "Chụp ảnh màn hình") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THREADED_DATA_RUNLOOP_ENABLE, + "Threaded tasks") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS, + "Thumbnails") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY, + "Thumbnails Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAILS_UPDATER_LIST, + "Thumbnails Updater") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_BOXARTS, + "Boxarts") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS, + "Screenshots") +MSG_HASH(MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS, + "Title Screens") +MSG_HASH(MENU_ENUM_LABEL_VALUE_TIMEDATE_ENABLE, + "Display time / date") +MSG_HASH(MENU_ENUM_LABEL_VALUE_TITLE_COLOR, + "Menu title color") +MSG_HASH(MENU_ENUM_LABEL_VALUE_TRUE, + "True") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_ENABLE, + "Kích hoạt UI Companion") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_COMPANION_START_ON_BOOT, + "UI Companion Start On Boot") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UI_MENUBAR_ENABLE, + "Menubar") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UNABLE_TO_READ_COMPRESSED_FILE, + "Unable to read compressed file.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_LOAD_STATE, + "Undo Tải State") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UNDO_SAVE_STATE, + "Undo Save State") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UNKNOWN, + "Unknown") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS, + "Updater") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, + "Cập nhật Assets") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, + "Cập nhật Autoconfig Profiles") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CG_SHADERS, + "Cập nhật Cg Shaders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, + "Cập nhật Cheats") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, + "Cập nhật Core Info Files") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_DATABASES, + "Cập nhật Databases") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_GLSL_SHADERS, + "Cập nhật GLSL Shaders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_LAKKA, + "Cập nhật Lakka") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_OVERLAYS, + "Cập nhật Overlays") +MSG_HASH(MENU_ENUM_LABEL_VALUE_UPDATE_SLANG_SHADERS, + "Cập nhật Slang Shaders") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USER, + "User") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, + "User Interface") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, + "Language") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USER_SETTINGS, + "User") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, + "Use Builtin Image Viewer") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, + "Use Builtin Media Player") +MSG_HASH(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY, + "") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, + "Allow rotation") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO, + "Config Aspect Ratio") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, + "Auto Aspect Ratio") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, + "Aspect Ratio") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, + "Black Frame Insertion") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, + "Crop Overscan (Reload)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DISABLE_COMPOSITION, + "Disable Desktop Composition") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_DRIVER, + "Video Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER, + "Video Filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_DIR, + "Video Filter Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FILTER_FLICKER, + "Flicker filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_ENABLE, + "Enable Onscreen Notifications") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_PATH, + "Onscreen Notification Font") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FONT_SIZE, + "Onscreen Notification Size") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_ASPECT, + "Force aspect ratio") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE, + "Force-disable sRGB FBO") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FRAME_DELAY, + "Frame Delay") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN, + "Sử dụng chế độ toàn màn hình") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GAMMA, + "Video Gamma") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_RECORD, + "Use GPU Recording") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, + "Kích hoạt GPU Screenshot") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC, + "Hard GPU Sync") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_HARD_SYNC_FRAMES, + "Hard GPU Sync Frames") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MAX_SWAPCHAIN_IMAGES, + "Max swapchain images") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, + "Onscreen Notification X Position") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, + "Onscreen Notification Y Position") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_MONITOR_INDEX, + "Monitor Index") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, + "Kích hoạt Post Filter Recording") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, + "Vertical Refresh Rate") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, + "Estimated Screen Framerate") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, + "Rotation") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, + "Windowed Scale") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE_INTEGER, + "Integer Scale") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, + "Video") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_DIR, + "Video Shader Danh mục") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_NUM_PASSES, + "Shader Passes") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PARAMETERS, + "Preview Shader Parameters") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET, + "Tải Shader Preset") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_PARAMETERS, + "Menu Shader Parameters") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_AS, + "Save Shader Preset As") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_CORE, + "Save Core Preset") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_PRESET_SAVE_GAME, + "Save Game Preset") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SHARED_CONTEXT, + "Kích hoạt Hardware Shared Context") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SMOOTH, + "Bilinear Filtering") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SOFT_FILTER, + "Kích hoạt Soft Filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL, + "Vertical Sync (Vsync) Swap Interval") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_TAB, + "Video") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, + "Threaded Video") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VFILTER, + "Deflicker") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, + "Custom Aspect Ratio Height") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, + "Custom Aspect Ratio Width") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, + "Custom Aspect Ratio X Pos.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, + "Custom Aspect Ratio Y Pos.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VI_WIDTH, + "Set VI Screen Width") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_VSYNC, + "Vertical Sync (Vsync)") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOWED_FULLSCREEN, + "Chế độ toàn màn hình trong khung") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, + "Window Width") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, + "Window Height") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, + "Fullscreen Width") +MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, + "Fullscreen Height") +MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_DRIVER, + "Wi-Fi Driver") +MSG_HASH(MENU_ENUM_LABEL_VALUE_WIFI_SETTINGS, + "Wi-Fi") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ALPHA_FACTOR, + "Menu Alpha Factor") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_FONT, + "Menu Font") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_CUSTOM, + "Custom") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_FLATUI, + "FlatUI") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_MONOCHROME, + "Monochrome") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_SYSTEMATIC, + "Systematic") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_NEOACTIVE, + "NeoActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_PIXEL, + "Pixel") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_RETROACTIVE, + "RetroActive") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_ICON_THEME_DOTART, + "Dot-Art") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME, + "Menu Color Theme") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_APPLE_GREEN, + "Apple Green") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK, + "Dark") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_DARK_PURPLE, + "Dark Purple") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_ELECTRIC_BLUE, + "Electric Blue") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_GOLDEN, + "Golden") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_LEGACY_RED, + "Legacy Red") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_MIDNIGHT_BLUE, + "Midnight Blue") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_PLAIN, + "Plain") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_UNDERSEA, + "Undersea") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_MENU_COLOR_THEME_VOLCANIC_RED, + "Volcanic Red") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_RIBBON_ENABLE, + "Menu Shader Pipeline") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SCALE_FACTOR, + "Menu Scale Factor") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHADOWS_ENABLE, + "Kích hoạt Icon Shadows") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_HISTORY, + "Display History Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_ADD, + "Display Import content Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_IMAGES, + "Display Image Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_MUSIC, + "Display Music Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_SETTINGS, + "Show thiết lập Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_VIDEO, + "Display Video Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_SHOW_NETPLAY, + "Display Netplay Tab") +MSG_HASH(MENU_ENUM_LABEL_VALUE_XMB_THEME, + "Menu Icon Theme") +MSG_HASH(MENU_ENUM_LABEL_VALUE_YES, + "Yes") +MSG_HASH(MENU_ENUM_LABEL_VIDEO_SHADER_PRESET_TWO, + "Shader Preset") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_ENABLE, + "Enable or disable achievements. For more information, visit http://retroachievements.org") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, + "Enable or disable unofficial achievements and/or beta features for testing purposes.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_HARDCORE_MODE_ENABLE, + "Enable or disable savestates, cheats, rewind, fast-forward, pause, and slow-motion for all games.") +MSG_HASH(MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, + "Change drivers used by the system.") +MSG_HASH(MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, + "Change achievement settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_SETTINGS, + "Change core settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, + "Change recording settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_ONSCREEN_DISPLAY_SETTINGS, + "Change display overlay and keyboard overlay, and onscreen notification settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, + "Change rewind, fast-forward, and slow-motion settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_SAVING_SETTINGS, + "Change saving settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, + "Change logging settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_USER_INTERFACE_SETTINGS, + "Change user interface settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_USER_SETTINGS, + "Change account, username, and language settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_PRIVACY_SETTINGS, + "Change your privacy settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_DIRECTORY_SETTINGS, + "Change default directories where files are located.") +MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, + "Change playlist settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_SETTINGS, + "Configure server and network settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, + "Tải/quét nội dung và thêm vào bộ sưu tập.") +MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_SETTINGS, + "Điều chỉnh thiết lập cho âm thanh ra.") +MSG_HASH(MENU_ENUM_SUBLABEL_BLUETOOTH_ENABLE, + "Bật/tắt bluetooth.") +MSG_HASH(MENU_ENUM_SUBLABEL_CONFIG_SAVE_ON_EXIT, + "Lưu cấu hình khi thoát retroarch.") +MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS, + "Change default settings for configuration files.") +MSG_HASH(MENU_ENUM_SUBLABEL_CONFIGURATIONS_LIST, + "Manage and create configuration files.") +MSG_HASH(MENU_ENUM_SUBLABEL_CPU_CORES, + "Số lượng lõi của CPU.") +MSG_HASH(MENU_ENUM_SUBLABEL_FPS_SHOW, + "Hiển thị tốc độ khung hình/giây trên màn hình.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_HOTKEY_BINDS, + "Đặt cấu hình thiết lập của hotkey.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_MENU_ENUM_TOGGLE_GAMEPAD_COMBO, + "Kết hợp nút Gamepad để vào menu bật/tắt.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_SETTINGS, + "Điều chỉnh thiết lập cho joypads, bàn phím và chuột.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_USER_BINDS, + "Configure controls for this user.") +MSG_HASH(MENU_ENUM_SUBLABEL_LOG_VERBOSITY, + "Kích hoạt or disable logging to the terminal.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY, + "Tham gia hoặc làm máy chủ cho netplay.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_LAN_SCAN_SETTINGS, + "Search for and connect to netplay hosts on the local network.") +MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION_LIST_LIST, + "Display core, network, and system information.") +MSG_HASH(MENU_ENUM_SUBLABEL_ONLINE_UPDATER, + "Tải/cập nhật tiện ích và thành phần của RetroArch.") +MSG_HASH(MENU_ENUM_SUBLABEL_SAMBA_ENABLE, + "Bật/tắt chia sẻ thư mục trên mạng.") +MSG_HASH(MENU_ENUM_SUBLABEL_SERVICES_SETTINGS, + "Quản lý dịch vụ của hệ điều hành.") +MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, + "Hiện ra tập tin và thư mục ẩn trong trình duyệt tập tin.") +MSG_HASH(MENU_ENUM_SUBLABEL_SSH_ENABLE, + "Bật/tắt giao thức SSH.") +MSG_HASH(MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, + "Chặn tính năng screensaver (màn hình chờ).") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SCALE, + "Sets the window size relative to the core viewport size. Alternatively, you can set a window width and height below for a fixed window size.") +MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, + "Thiết lập ngôn ngữ của giao diện .") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, + "Inserts a black frame inbetween frames. Useful for users with 120Hz screens who want to play 60Hz content to eliminate ghosting.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, + "Reduces latency at the cost of a higher risk of video stuttering. Adds a delay after V-Sync (in ms).") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, + "Sets how many frames the CPU can run ahead of the GPU when using 'Hard GPU Sync'.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, + "Tells the video driver to explicitly use a specified buffering mode.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, + "Chọn màn hình hiển thị để sử dụng.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, + "The accurate estimated refresh rate of the screen in Hz.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, + "Điều chỉnh thiết lập cho video ra.") +MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, + "Tìm mạng không dây và thiết lập kết nối.") +MSG_HASH(MENU_ENUM_SUBLABEL_HELP_LIST, + "Learn more about how the program works.") +MSG_HASH(MSG_APPENDED_DISK, + "Appended disk") +MSG_HASH(MSG_APPLICATION_DIR, + "Application Danh mục") +MSG_HASH(MSG_APPLYING_CHEAT, + "Đang áp dụng cheat changes.") +MSG_HASH(MSG_APPLYING_SHADER, + "Đang áp dụng shader") +MSG_HASH(MSG_AUDIO_MUTED, + "Âm thanh muted.") +MSG_HASH(MSG_AUDIO_UNMUTED, + "Âm thanh unmuted.") +MSG_HASH(MSG_AUTOCONFIG_FILE_ERROR_SAVING, + "Tập tin Autoconfig bị lỗi khi lưu.") +MSG_HASH(MSG_AUTOCONFIG_FILE_SAVED_SUCCESSFULLY, + "Tập tin Autoconfig đã lưu thành công.") +MSG_HASH(MSG_AUTOSAVE_FAILED, + "Could not initialize autosave.") +MSG_HASH(MSG_AUTO_SAVE_STATE_TO, + "Auto save state to") +MSG_HASH(MSG_BLOCKING_SRAM_OVERWRITE, + "Blocking SRAM Overwrite") +MSG_HASH(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT, + "Đang đưa lên lệnh giao diện trên cổng") +MSG_HASH(MSG_BYTES, + "bytes") +MSG_HASH(MSG_CANNOT_INFER_NEW_CONFIG_PATH, + "Cannot infer new config path. Use current time.") +MSG_HASH(MSG_CHEEVOS_HARDCORE_MODE_ENABLE, + "Hardcore Mode Enabled, savestate & rewind were disabled.") +MSG_HASH(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS, + "Comparing with known magic numbers...") +MSG_HASH(MSG_COMPILED_AGAINST_API, + "Compiled against API") +MSG_HASH(MSG_CONFIG_DIRECTORY_NOT_SET, + "Config directory not set. Cannot save new config.") +MSG_HASH(MSG_CONNECTED_TO, + "Connected to") +MSG_HASH(MSG_CONTENT_CRC32S_DIFFER, + "Content CRC32s differ. Cannot use different games.") +MSG_HASH(MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT, + "Content loading skipped. Implementation will load it on its own.") +MSG_HASH(MSG_CORE_DOES_NOT_SUPPORT_SAVESTATES, + "Core does not support save states.") +MSG_HASH(MSG_CORE_OPTIONS_FILE_CREATED_SUCCESSFULLY, + "Core options file created successfully.") +MSG_HASH(MSG_COULD_NOT_FIND_ANY_NEXT_DRIVER, + "Could not find any next driver") +MSG_HASH(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM, + "Could not find compatible system.") +MSG_HASH(MSG_COULD_NOT_FIND_VALID_DATA_TRACK, + "Could not find valid data track") +MSG_HASH(MSG_COULD_NOT_OPEN_DATA_TRACK, + "could not open data track") +MSG_HASH(MSG_COULD_NOT_READ_CONTENT_FILE, + "Could not read content file") +MSG_HASH(MSG_COULD_NOT_READ_MOVIE_HEADER, + "Could not read movie header.") +MSG_HASH(MSG_COULD_NOT_READ_STATE_FROM_MOVIE, + "Could not read state from movie.") +MSG_HASH(MSG_CRC32_CHECKSUM_MISMATCH, + "CRC32 checksum mismatch between content file and saved content checksum in replay file header. Replay highly likely to desync on playback.") +MSG_HASH(MSG_CUSTOM_TIMING_GIVEN, + "Custom timing given") +MSG_HASH(MSG_DECOMPRESSION_ALREADY_IN_PROGRESS, + "Decompression already in progress.") +MSG_HASH(MSG_DECOMPRESSION_FAILED, + "Decompression failed.") +MSG_HASH(MSG_DETECTED_VIEWPORT_OF, + "Detected viewport of") +MSG_HASH(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, + "Did not find a valid content patch.") +MSG_HASH(MSG_DISCONNECT_DEVICE_FROM_A_VALID_PORT, + "Ngắt kết nối thiết bị từ cổng hợp lệ.") +MSG_HASH(MSG_DISK_CLOSED, + "Closed") +MSG_HASH(MSG_DISK_EJECTED, + "Ejected") +MSG_HASH(MSG_DOWNLOADING, + "Downloading") +MSG_HASH(MSG_DOWNLOAD_FAILED, + "Download failed") +MSG_HASH(MSG_ERROR, + "Error") +MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_CONTENT, + "Libretro core requires content, but nothing was provided.") +MSG_HASH(MSG_ERROR_LIBRETRO_CORE_REQUIRES_SPECIAL_CONTENT, + "Libretro core requires special content, but none were provided.") +MSG_HASH(MSG_ERROR_PARSING_ARGUMENTS, + "Error parsing arguments.") +MSG_HASH(MSG_ERROR_SAVING_CORE_OPTIONS_FILE, + "Error saving core options file.") +MSG_HASH(MSG_ERROR_SAVING_REMAP_FILE, + "Error saving remap file.") +MSG_HASH(MSG_ERROR_SAVING_SHADER_PRESET, + "Error saving shader preset.") +MSG_HASH(MSG_EXTERNAL_APPLICATION_DIR, + "External Application Dir") +MSG_HASH(MSG_EXTRACTING, + "Extracting") +MSG_HASH(MSG_EXTRACTING_FILE, + "Extracting file") +MSG_HASH(MSG_FAILED_SAVING_CONFIG_TO, + "Failed saving config to") +MSG_HASH(MSG_FAILED_TO, + "Failed to") +MSG_HASH(MSG_FAILED_TO_ACCEPT_INCOMING_SPECTATOR, + "Failed to accept incoming spectator.") +MSG_HASH(MSG_FAILED_TO_ALLOCATE_MEMORY_FOR_PATCHED_CONTENT, + "Failed to allocate memory for patched content...") +MSG_HASH(MSG_FAILED_TO_APPLY_SHADER, + "Failed to apply shader.") +MSG_HASH(MSG_FAILED_TO_BIND_SOCKET, + "Failed to bind socket.") +MSG_HASH(MSG_FAILED_TO_CREATE_THE_DIRECTORY, + "Failed to create the directory.") +MSG_HASH(MSG_FAILED_TO_EXTRACT_CONTENT_FROM_COMPRESSED_FILE, + "Failed to extract content from compressed file") +MSG_HASH(MSG_FAILED_TO_GET_NICKNAME_FROM_CLIENT, + "Failed to get nickname from client.") +MSG_HASH(MSG_FAILED_TO_LOAD, + "Failed to load") +MSG_HASH(MSG_FAILED_TO_LOAD_CONTENT, + "Failed to load content") +MSG_HASH(MSG_FAILED_TO_LOAD_MOVIE_FILE, + "Failed to load movie file") +MSG_HASH(MSG_FAILED_TO_LOAD_OVERLAY, + "Failed to load overlay.") +MSG_HASH(MSG_FAILED_TO_LOAD_STATE, + "Failed to load state from") +MSG_HASH(MSG_FAILED_TO_OPEN_LIBRETRO_CORE, + "Failed to open libretro core") +MSG_HASH(MSG_FAILED_TO_PATCH, + "Failed to patch") +MSG_HASH(MSG_FAILED_TO_RECEIVE_HEADER_FROM_CLIENT, + "Failed to receive header from client.") +MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME, + "Failed to receive nickname.") +MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_FROM_HOST, + "Failed to receive nickname from host.") +MSG_HASH(MSG_FAILED_TO_RECEIVE_NICKNAME_SIZE_FROM_HOST, + "Failed to receive nickname size from host.") +MSG_HASH(MSG_FAILED_TO_RECEIVE_SRAM_DATA_FROM_HOST, + "Failed to receive SRAM data from host.") +MSG_HASH(MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY, + "Failed to remove disk from tray.") +MSG_HASH(MSG_FAILED_TO_REMOVE_TEMPORARY_FILE, + "Failed to remove temporary file") +MSG_HASH(MSG_FAILED_TO_SAVE_SRAM, + "Failed to save SRAM") +MSG_HASH(MSG_FAILED_TO_SAVE_STATE_TO, + "Failed to save state to") +MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME, + "Failed to send nickname.") +MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_SIZE, + "Failed to send nickname size.") +MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_CLIENT, + "Failed to send nickname to client.") +MSG_HASH(MSG_FAILED_TO_SEND_NICKNAME_TO_HOST, + "Failed to send nickname to host.") +MSG_HASH(MSG_FAILED_TO_SEND_SRAM_DATA_TO_CLIENT, + "Failed to send SRAM data to client.") +MSG_HASH(MSG_FAILED_TO_START_AUDIO_DRIVER, + "Bị lỗi khi chạy chương trình điều khiển âm thanh. Sẽ tiếp tục chạy và bỏ âm thanh.") +MSG_HASH(MSG_FAILED_TO_START_MOVIE_RECORD, + "Failed to start movie record.") +MSG_HASH(MSG_FAILED_TO_START_RECORDING, + "Failed to start recording.") +MSG_HASH(MSG_FAILED_TO_TAKE_SCREENSHOT, + "Bị lỗi khi chụp ảnh màn hình.") +MSG_HASH(MSG_FAILED_TO_UNDO_LOAD_STATE, + "Failed to undo load state.") +MSG_HASH(MSG_FAILED_TO_UNDO_SAVE_STATE, + "Failed to undo save state.") +MSG_HASH(MSG_FAILED_TO_UNMUTE_AUDIO, + "Failed to unmute Âm thanh.") +MSG_HASH(MSG_FATAL_ERROR_RECEIVED_IN, + "Fatal error received in") +MSG_HASH(MSG_FILE_NOT_FOUND, + "Không tìm thấy tệp") +MSG_HASH(MSG_FOUND_AUTO_SAVESTATE_IN, + "Tìm thấy savestate tự đông trong") +MSG_HASH(MSG_FOUND_DISK_LABEL, + "Found disk label") +MSG_HASH(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE, + "Found first data track on file") +MSG_HASH(MSG_FOUND_LAST_STATE_SLOT, + "Tiềm thấy state slot xài lần trước") +MSG_HASH(MSG_FOUND_SHADER, + "Found shader") +MSG_HASH(MSG_FRAMES, + "Frames") +MSG_HASH(MSG_GAME_SPECIFIC_CORE_OPTIONS_FOUND_AT, + "Per-Game Options: game-specific core options found at") +MSG_HASH(MSG_GOT_INVALID_DISK_INDEX, + "Got invalid disk index.") +MSG_HASH(MSG_GRAB_MOUSE_STATE, + "Grab mouse state") +MSG_HASH(MSG_GAME_FOCUS_ON, + "Game focus on") +MSG_HASH(MSG_GAME_FOCUS_OFF, + "Game focus off") +MSG_HASH(MSG_HW_RENDERED_MUST_USE_POSTSHADED_RECORDING, + "Libretro core is hardware rendered. Must use post-shaded recording as well.") +MSG_HASH(MSG_INFLATED_CHECKSUM_DID_NOT_MATCH_CRC32, + "Inflated checksum did not match CRC32.") +MSG_HASH(MSG_INPUT_CHEAT, + "Input Cheat") +MSG_HASH(MSG_INPUT_CHEAT_FILENAME, + "Cheat Filename") +MSG_HASH(MSG_INPUT_PRESET_FILENAME, + "Preset Filename") +MSG_HASH(MSG_INTERFACE, + "Interface") +MSG_HASH(MSG_INTERNAL_STORAGE, + "Internal Storage") +MSG_HASH(MSG_REMOVABLE_STORAGE, + "Removable Storage") +MSG_HASH(MSG_INVALID_NICKNAME_SIZE, + "Invalid nickname size.") +MSG_HASH(MSG_IN_BYTES, + "in bytes") +MSG_HASH(MSG_IN_GIGABYTES, + "in gigabytes") +MSG_HASH(MSG_IN_MEGABYTES, + "in megabytes") +MSG_HASH(MSG_LIBRETRO_ABI_BREAK, + "is compiled against a different version of libretro than this libretro implementation.") +MSG_HASH(MSG_LIBRETRO_FRONTEND, + "Frontend for libretro") +MSG_HASH(MSG_LOADED_STATE_FROM_SLOT, + "Loaded state from slot #%d.") +MSG_HASH(MSG_LOADED_STATE_FROM_SLOT_AUTO, + "Loaded state from slot #-1 (auto).") +MSG_HASH(MSG_LOADING, + "Đang tải") +MSG_HASH(MSG_FIRMWARE, + "One or more firmware files are missing") +MSG_HASH(MSG_LOADING_CONTENT_FILE, + "Loading content file") +MSG_HASH(MSG_LOADING_HISTORY_FILE, + "Đang nạp tập tin lịch sử") +MSG_HASH(MSG_LOADING_STATE, + "Đang tải state") +MSG_HASH(MSG_MEMORY, + "Memory") +MSG_HASH(MSG_MOVIE_FILE_IS_NOT_A_VALID_BSV1_FILE, + "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.") +MSG_HASH(MSG_MOVIE_PLAYBACK_ENDED, + "Movie playback ended.") +MSG_HASH(MSG_MOVIE_RECORD_STOPPED, + "Stopping movie record.") +MSG_HASH(MSG_NETPLAY_FAILED, + "Failed to initialize netplay.") +MSG_HASH(MSG_NO_CONTENT_STARTING_DUMMY_CORE, + "No content, starting dummy core.") +MSG_HASH(MSG_NO_SAVE_STATE_HAS_BEEN_OVERWRITTEN_YET, + "No save state has been overwritten yet.") +MSG_HASH(MSG_NO_STATE_HAS_BEEN_LOADED_YET, + "No state has been loaded yet.") +MSG_HASH(MSG_OVERRIDES_ERROR_SAVING, + "Error saving overrides.") +MSG_HASH(MSG_OVERRIDES_SAVED_SUCCESSFULLY, + "Overrides saved successfully.") +MSG_HASH(MSG_PAUSED, + "Paused.") +MSG_HASH(MSG_PROGRAM, + "RetroArch") +MSG_HASH(MSG_READING_FIRST_DATA_TRACK, + "Reading first data track...") +MSG_HASH(MSG_RECEIVED, + "received") +MSG_HASH(MSG_RECORDING_TERMINATED_DUE_TO_RESIZE, + "Recording terminated due to resize.") +MSG_HASH(MSG_RECORDING_TO, + "Recording to") +MSG_HASH(MSG_REDIRECTING_CHEATFILE_TO, + "Redirecting cheat file to") +MSG_HASH(MSG_REDIRECTING_SAVEFILE_TO, + "Redirecting save file to") +MSG_HASH(MSG_REDIRECTING_SAVESTATE_TO, + "Redirecting savestate to") +MSG_HASH(MSG_REMAP_FILE_SAVED_SUCCESSFULLY, + "Remap file saved successfully.") +MSG_HASH(MSG_REMOVED_DISK_FROM_TRAY, + "Removed disk from tray.") +MSG_HASH(MSG_REMOVING_TEMPORARY_CONTENT_FILE, + "Removing temporary content file") +MSG_HASH(MSG_RESET, + "Reset") +MSG_HASH(MSG_RESTARTING_RECORDING_DUE_TO_DRIVER_REINIT, + "Restarting recording due to driver reinit.") +MSG_HASH(MSG_RESTORED_OLD_SAVE_STATE, + "Restored old save state.") +MSG_HASH(MSG_RESTORING_DEFAULT_SHADER_PRESET_TO, + "Shaders: restoring default shader preset to") +MSG_HASH(MSG_REVERTING_SAVEFILE_DIRECTORY_TO, + "Reverting savefile directory to") +MSG_HASH(MSG_REVERTING_SAVESTATE_DIRECTORY_TO, + "Reverting savestate directory to") +MSG_HASH(MSG_REWINDING, + "Rewinding.") +MSG_HASH(MSG_REWIND_INIT, + "Initializing rewind buffer with size") +MSG_HASH(MSG_REWIND_INIT_FAILED, + "Failed to initialize rewind buffer. Rewinding will be disabled.") +MSG_HASH(MSG_REWIND_INIT_FAILED_THREADED_AUDIO, + "Implementation uses threaded audio. Cannot use rewind.") +MSG_HASH(MSG_REWIND_REACHED_END, + "Reached end of rewind buffer.") +MSG_HASH(MSG_SAVED_NEW_CONFIG_TO, + "Saved new config to") +MSG_HASH(MSG_SAVED_STATE_TO_SLOT, + "Saved state to slot #%d.") +MSG_HASH(MSG_SAVED_STATE_TO_SLOT_AUTO, + "Saved state to slot #-1 (auto).") +MSG_HASH(MSG_SAVED_SUCCESSFULLY_TO, + "Saved successfully to") +MSG_HASH(MSG_SAVING_RAM_TYPE, + "Saving RAM type") +MSG_HASH(MSG_SAVING_STATE, + "Saving state") +MSG_HASH(MSG_SCANNING, + "Scanning") +MSG_HASH(MSG_SCANNING_OF_DIRECTORY_FINISHED, + "Scanning of directory finished") +MSG_HASH(MSG_SENDING_COMMAND, + "Sending command") +MSG_HASH(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED, + "Several patches are explicitly defined, ignoring all...") +MSG_HASH(MSG_SHADER, + "Shader") +MSG_HASH(MSG_SHADER_PRESET_SAVED_SUCCESSFULLY, + "Shader preset saved successfully.") +MSG_HASH(MSG_SKIPPING_SRAM_LOAD, + "Skipping SRAM load.") +MSG_HASH(MSG_SLOW_MOTION, + "Slow motion.") +MSG_HASH(MSG_SLOW_MOTION_REWIND, + "Slow motion rewind.") +MSG_HASH(MSG_SRAM_WILL_NOT_BE_SAVED, + "SRAM will not be saved.") +MSG_HASH(MSG_STARTING_MOVIE_PLAYBACK, + "Starting movie playback.") +MSG_HASH(MSG_STARTING_MOVIE_RECORD_TO, + "Starting movie record to") +MSG_HASH(MSG_STATE_SIZE, + "State size") +MSG_HASH(MSG_STATE_SLOT, + "State slot") +MSG_HASH(MSG_TAKING_SCREENSHOT, + "Taking screenshot.") +MSG_HASH(MSG_TO, + "to") +MSG_HASH(MSG_UNDID_LOAD_STATE, + "Undid load state.") +MSG_HASH(MSG_UNDOING_SAVE_STATE, + "Undoing save state") +MSG_HASH(MSG_UNKNOWN, + "Unknown") +MSG_HASH(MSG_UNPAUSED, + "Unpaused.") +MSG_HASH(MSG_UNRECOGNIZED_COMMAND, + "Unrecognized command") +MSG_HASH(MSG_USING_CORE_NAME_FOR_NEW_CONFIG, + "Using core name for new config.") +MSG_HASH(MSG_USING_LIBRETRO_DUMMY_CORE_RECORDING_SKIPPED, + "Using libretro dummy core. Skipping recording.") +MSG_HASH(MSG_VALUE_CONNECT_DEVICE_FROM_A_VALID_PORT, + "Kết nối thiết bị từ cổng hợp lệ.") +MSG_HASH(MSG_VALUE_DISCONNECTING_DEVICE_FROM_PORT, + "Đang ngắt kết nối thiết bị từ cổng") +MSG_HASH(MSG_VALUE_REBOOTING, + "Đang khởi động lại...") +MSG_HASH(MSG_VALUE_SHUTTING_DOWN, + "Đang tắt máy...") +MSG_HASH(MSG_VERSION_OF_LIBRETRO_API, + "Phiên bản của libretro API") +MSG_HASH(MSG_VIEWPORT_SIZE_CALCULATION_FAILED, + "Viewport size calculation failed! Will continue using raw data. This will probably not work right ...") +MSG_HASH(MSG_VIRTUAL_DISK_TRAY, + "virtual disk tray.") +MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_LATENCY, + "Desired audio latency in milliseconds. Might not be honored if the audio driver can't provide given latency.") +MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MUTE, + "Mute/unmute audio.") +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, + "Helps smooth out imperfections in timing when synchronizing audio and video. Be aware that if disabled, proper synchronization is nearly impossible to obtain." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CAMERA_ALLOW, + "Allow or disallow camera access by cores." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_ALLOW, + "Allow or disallow location services access by cores." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MAX_USERS, + "Maximum amount of users supported by RetroArch." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_POLL_TYPE_BEHAVIOR, + "Influence how input polling is done inside RetroArch. Setting it to 'Early' or 'Late' can result in less latency, depending on your configuration." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU, + "Allows any user to control the menu. If disabled, only User 1 can control the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_VOLUME, + "Audio volume (in dB). 0 dB is normal volume, and no gain is applied." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, + "Allow the WASAPI driver to take exclusive control of the audio device. If disabled, it will use shared mode instead." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_FLOAT_FORMAT, + "Use float format for the WASAPI driver, if supported by your audio device." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH, + "The audio buffer length when using the WASAPI driver in shared mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_SYNC, + "Synchronize audio. Recommended." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD, + "How far an axis must be tilted to result in a button press." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT, + "Amount of seconds to wait until proceeding to the next bind." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD, + "Describes the period when turbo-enabled buttons are toggled. Numbers are described in frames." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE, + "Describes how long the period of a turbo-enabled button should be. Numbers are described in frames." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VSYNC, + "Synchronizes the output video of the graphics card to the refresh rate of the screen. Recommended." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ALLOW_ROTATE, + "Allow cores to set rotation. When disabled, rotation requests are ignored. Useful for setups where one manually rotates the screen." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, + "Some cores might have a shutdown feature. If enabled, it will prevent the core from shutting RetroArch down. Instead, it loads a dummy core." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHECK_FOR_MISSING_FIRMWARE, + "Check if all the required firmware is present before attempting to load content." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE, + "Vertical refresh rate of your screen. Used to calculate a suitable audio input rate. NOTE: This will be ignored if 'Threaded Video' is enabled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_ENABLE, + "Enable audio output." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MAX_TIMING_SKEW, + "The maximum change in audio input rate. Increasing this enables very large changes in timing at the cost of an inaccurate audio pitch (e.g., running PAL cores on NTSC displays)." + ) +MSG_HASH( + MSG_FAILED, + "Bị Lỗi" + ) +MSG_HASH( + MSG_SUCCEEDED, + "Đã thành công" + ) +MSG_HASH( + MSG_DEVICE_NOT_CONFIGURED, + "not configured" + ) +MSG_HASH( + MSG_DEVICE_NOT_CONFIGURED_FALLBACK, + "not configured, using fallback" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST, + "Database Cursor List" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DEVELOPER, + "Database - Filter : Developer" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, + "Database - Filter : Publisher" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DISABLED, + "Vô hiệu hoá" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ENABLED, + "Enabled" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_PATH, + "Content History Path" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, + "Database - Filter : Origin") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, + "Database - Filter : Franchise") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, + "Database - Filter : ESRB Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, + "Database - Filter : ELSPA Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, + "Database - Filter : PEGI Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, + "Database - Filter : CERO Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, + "Database - Filter : BBFC Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_MAX_USERS, + "Database - Filter : Max Users") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_MONTH, + "Database - Filter : Releasedate By Month") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_RELEASEDATE_BY_YEAR, + "Database - Filter : Releasedate By Year") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_ISSUE, + "Database - Filter : Edge Magazine Issue") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_EDGE_MAGAZINE_RATING, + "Database - Filter : Edge Magazine Rating") +MSG_HASH(MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_DATABASE_INFO, + "Database Info") +MSG_HASH(MSG_WIFI_SCAN_COMPLETE, + "Wi-Fi scan complete.") +MSG_HASH(MSG_SCANNING_WIRELESS_NETWORKS, + "Scanning wireless networks...") +MSG_HASH(MSG_NETPLAY_LAN_SCAN_COMPLETE, + "Netplay scan complete.") +MSG_HASH(MSG_NETPLAY_LAN_SCANNING, + "Scanning for netplay hosts...") +MSG_HASH(MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, + "Pause gameplay when RetroArch is not the active window.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_DISABLE_COMPOSITION, + "Enable or disable composition (Windows only).") +MSG_HASH(MENU_ENUM_SUBLABEL_HISTORY_LIST_ENABLE, + "Enable or disable recent playlist for games, images, music, and videos.") +MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_HISTORY_SIZE, + "Limit the number of entries in recent playlist for games, images, music, and videos.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_UNIFIED_MENU_CONTROLS, + "Unified Menu Controls") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_UNIFIED_MENU_CONTROLS, + "Use the same controls for both the menu and the game. Applies to the keyboard.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_ENABLE, + "Show onscreen messages.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETWORK_USER_REMOTE_ENABLE, + "User %d Remote Enable") +MSG_HASH(MENU_ENUM_LABEL_VALUE_BATTERY_LEVEL_ENABLE, + "Display battery level") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FILE, + "Select File") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SELECT_FROM_COLLECTION, + "Select From Collection") +MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER, + "Filter") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SCALE, + "Scale") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, + "Netplay will start when content is loaded.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, + "Couldn't find a suitable core or content file, load manually.") +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, + "Browse URL" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_URL, + "URL Path" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_START, + "Start" + ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, + "Bokeh") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, + "Refresh") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, + "Nickname: %s") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME_LAN, + "Nickname (lan): %s") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_COMPAT_CONTENT_FOUND, + "Compatible content found") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_CROP_OVERSCAN, + "Cuts off a few pixels around the edges of the image customarily left blank by developers which sometimes also contain garbage pixels.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SMOOTH, + "Adds a slight blur to the image to take the edge off of the hard pixel edges. This option has very little impact on performance.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FILTER, + "Apply a CPU-powered video filter. NOTE: Might come at a high performance cost. Some video filters might only work for cores that use 32bit or 16bit color.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_USERNAME, + "Input the username of your Retro Achievements account.") +MSG_HASH(MENU_ENUM_SUBLABEL_CHEEVOS_PASSWORD, + "Input the password of your Retro Achievements account.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, + "Input your user name here. This will be used for netplay sessions, among other things.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_POST_FILTER_RECORD, + "Capture the image after filters (but not shaders) are applied. Your video will look as fancy as what you see on your screen.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_LIST, + "Select which core to use.") +MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_CONTENT_LIST, + "Select which content to start.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETWORK_INFORMATION, + "Show network interface(s) and associated IP addresses.") +MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_INFORMATION, + "Show information specific to the device.") +MSG_HASH(MENU_ENUM_SUBLABEL_QUIT_RETROARCH, + "Quit the program.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_WIDTH, + "Set the custom width size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_HEIGHT, + "Set the custom height size for the display window. Leaving it at 0 will attempt to scale the window as large as possible.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_X, + "Set the custom width size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN_Y, + "Set the custom height size for the non-windowed fullscreen mode. Leaving it at 0 will use the desktop resolution") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_X, + "Specify custom X axis position for onscreen text.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MESSAGE_POS_Y, + "Specify custom Y axis position for onscreen text.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_SIZE, + "Specify the font size in points.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_OVERLAY_HIDE_IN_MENU, + "Hide the overlay while inside the menu, and show it again when exiting the menu.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_COLLECTION_LIST, + "Scanned content will appear here." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SCALE_INTEGER, + "Only scales video in integer steps. The base size depends on system-reported geometry and aspect ratio. If 'Force Aspect' is not set, X/Y will be integer scaled independently." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_SCREENSHOT, + "Screenshots output of GPU shaded material if available." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_ROTATION, + "Forces a certain rotation of the screen. The rotation is added to rotations which the core sets." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FORCE_SRGB_DISABLE, + "Forcibly disable sRGB FBO support. Some Intel OpenGL drivers on Windows have video problems with sRGB FBO support if this is enabled. Enabling this can work around it." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FULLSCREEN, + "Start in fullscreen. Can be changed at runtime." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_WINDOWED_FULLSCREEN, + "If fullscreen, prefer using a windowed fullscreen mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_GPU_RECORD, + "Records output of GPU shaded material if available." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_INDEX, + "When making a savestate, save state index is automatically increased before it is saved. When loading content, the index will be set to the highest existing index." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BLOCK_SRAM_OVERWRITE, + "Block Save RAM from being overwritten when loading save states. Might potentially lead to buggy games." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_FASTFORWARD_RATIO, + "The maximum rate at which content will be run when using fast forward (e.g., 5.0x for 60 fps content = 300 fps cap). If set to 0.0x, fastforward ratio is unlimited (no FPS cap)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SLOWMOTION_RATIO, + "When in slow motion, content will slow down by the factor specified/set." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_ENABLE, + "Enable rewinding. This will take a performance hit when playing." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, + "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LIBRETRO_LOG_LEVEL, + "Sets log level for cores. If a log level issued by a core is below this value, it is ignored." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, + "Enable performance counters for RetroArch (and cores)." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_SAVE, + "Automatically makes a savestate at the end of RetroArch's runtime. RetroArch will automatically load this savestate if 'Auto Load State' is enabled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_AUTO_LOAD, + "Automatically load the auto save state on startup." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATE_THUMBNAIL_ENABLE, + "Show thumbnails of save states inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTOSAVE_INTERVAL, + "Autosaves the non-volatile Save RAM at a regular interval. This is disabled by default unless set otherwise. The interval is measured in seconds. A value of 0 disables autosave." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_REMAP_BINDS_ENABLE, + "If enabled, overrides the input binds with the remapped binds set for the current core." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_AUTODETECT_ENABLE, + "Enable input auto-detection. Will attempt to autoconfigure joypads, Plug-and-Play style." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_INPUT_SWAP_OK_CANCEL, + "Swap buttons for OK/Cancel. Disabled is the Japanese button orientation, enabled is the western orientation." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PAUSE_LIBRETRO, + "If disabled, the content will keep running in the background when RetroArch's menu is toggled." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_DRIVER, + "Video driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DRIVER, + "Audio driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DRIVER, + "Input driver to use. Depending on the video driver, it might force a different input driver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_JOYPAD_DRIVER, + "Joypad driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_RESAMPLER_DRIVER, + "Audio resampler driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CAMERA_DRIVER, + "Camera driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOCATION_DRIVER, + "Location driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_DRIVER, + "Menu driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_RECORD_DRIVER, + "Record driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_WIFI_DRIVER, + "WiFi driver to use." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Filter files being shown in filebrowser by supported extensions." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_WALLPAPER, + "Select an image to set as menu wallpaper." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPER, + "Dynamically load a new wallpaper depending on context." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DEVICE, + "Override the default audio device the audio driver uses. This is driver dependent." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_DSP_PLUGIN, + "Audio DSP plugin that processes audio before it's sent to the driver." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_RATE, + "Audio output sample rate." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_OPACITY, + "Opacity of all UI elements of the overlay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_SCALE, + "Scale of all UI elements of the overlay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE, + "Enable the overlay." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_PRESET, + "Select an overlay from the file browser." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, + "The address of the host to connect to." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_TCP_UDP_PORT, + "The port of the host IP address. Can be either a TCP or UDP port." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PASSWORD, + "The password for connecting to the netplay host. Used only in host mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_PUBLIC_ANNOUNCE, + "Whether to announce netplay games publicly. If unset, clients must manually connect rather than using the public lobby." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_SPECTATE_PASSWORD, + "The password for connecting to the netplay host with only spectator privileges. Used only in host mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_START_AS_SPECTATOR, + "Whether to start netplay in spectator mode." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ALLOW_SLAVES, + "Whether to allow connections in slave mode. Slave-mode clients require very little processing power on either side, but will suffer significantly from network latency." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_REQUIRE_SLAVES, + "Whether to disallow connections not in slave mode. Not recommended except for very fast networks with very weak machines." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_STATELESS_MODE, + "Whether to run netplay in a mode not requiring save states. If set to true, a very fast network is required, but no rewinding is performed, so there will be no netplay jitter." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, + "The frequency in frames with which netplay will verify that the host and client are in sync." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, + "When hosting, attempt to listen for connections from the public Internet, using UPnP or similar technologies to escape LANs." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE, + "Enable stdin command interface." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MOUSE_ENABLE, + "Enable mouse controls inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_POINTER_ENABLE, + "Enable touch controls inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_THUMBNAILS, + "Type of thumbnail to display." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_TIMEDATE_ENABLE, + "Shows current date and/or time inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_BATTERY_LEVEL_ENABLE, + "Shows current battery level inside the menu." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_WRAPAROUND, + "Wrap-around to beginning and/or end if boundary of list is reached horizontally or vertically." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, + "Enables netplay in host (server) mode." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, + "Enables netplay in client mode.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, + "Disconnects an active Netplay connection.") +MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_DIRECTORY, + "Scans a directory for compatible files and add them to the collection.") +MSG_HASH(MENU_ENUM_SUBLABEL_SCAN_FILE, + "Scans a compatible file and add it to the collection.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, + "Uses a custom swap interval for Vsync. Set this to effectively halve monitor refresh rate." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVEFILES_ENABLE, + "Sort save files in folders named after the core used." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_SORT_SAVESTATES_ENABLE, + "Sort save states in folders named after the core used." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_CLIENT_SWAP_INPUT, + "When being client over netplay, use keybinds for Player 1.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_BUILDBOT_URL, + "URL to core updater directory on the Libretro buildbot.") +MSG_HASH(MENU_ENUM_SUBLABEL_BUILDBOT_ASSETS_URL, + "URL to assets updater directory on the Libretro buildbot.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_UPDATER_AUTO_EXTRACT_ARCHIVE, + "After downloading, automatically extract files contained in the downloaded archives." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, + "Scan for new rooms.") +MSG_HASH(MENU_ENUM_SUBLABEL_DELETE_ENTRY, + "Remove this entry from the collection.") +MSG_HASH(MENU_ENUM_SUBLABEL_INFORMATION, + "View more information about the content.") +MSG_HASH(MENU_ENUM_SUBLABEL_RUN, + "Start the content.") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, + "Adjusts filebrowser settings.") +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_REMAPS_ENABLE, + "Enable customized controls by default at startup." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUTO_OVERRIDES_ENABLE, + "Enable customized configuration by default at startup." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_GAME_SPECIFIC_OPTIONS, + "Enable customized core options by default at startup.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ENABLE, + "Shows current core name inside menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_DATABASE_MANAGER, + "View databases.") +MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_MANAGER, + "View previous searches.") +MSG_HASH(MENU_ENUM_SUBLABEL_TAKE_SCREENSHOT, + "Captures an image of the screen.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOSE_CONTENT, + "Closes the current content. Any unsaved changes might be lost." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_LOAD_STATE, + "Load a saved state from the currently selected slot.") +MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_STATE, + "Save a state to the currently selected slot.") +MSG_HASH(MENU_ENUM_SUBLABEL_RESUME, + "Resume the currently running content and leave the Quick Menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_RESUME_CONTENT, + "Resume the currently running content and leave the Quick Menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_STATE_SLOT, + "Changes the currently selected state slot.") +MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_LOAD_STATE, + "If a state was loaded, content will go back to the state prior to loading.") +MSG_HASH(MENU_ENUM_SUBLABEL_UNDO_SAVE_STATE, + "If a state was overwritten, it will roll back to the previous save state.") +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, + "Retro Achievements service. For more information, visit http://retroachievements.org" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ACCOUNTS_LIST, + "Manages currently configured accounts." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_META_REWIND, + "Manages rewind settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_RESTART_CONTENT, + "Restarts the content from the beginning.") +MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_CORE, + "Saves an override configuration file which will apply for all content loaded with this core. Will take precedence over the main configuration.") +MSG_HASH(MENU_ENUM_SUBLABEL_SAVE_CURRENT_CONFIG_OVERRIDE_GAME, + "Saves an override configuration file which will apply for the current content only. Will take precedence over the main configuration.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_CHEAT_OPTIONS, + "Set up cheat codes.") +MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_OPTIONS, + "Set up shaders to visually augment the image.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INPUT_REMAPPING_OPTIONS, + "Change the controls for the currently running content.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_OPTIONS, + "Change the options for the currently running content.") +MSG_HASH(MENU_ENUM_SUBLABEL_SHOW_ADVANCED_SETTINGS, + "Show advanced settings for power users (hidden by default).") +MSG_HASH(MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, + "Perform tasks on a separate thread.") +MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_ENTRY_REMOVE, + "Allow the user to remove entries from collections.") +MSG_HASH(MENU_ENUM_SUBLABEL_SYSTEM_DIRECTORY, + "Sets the System directory. Cores can query for this directory to load BIOSes, system-specific configs, etc.") +MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, + "Sets start directory for the filebrowser.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_DIR, + "Usually set by developers who bundle libretro/RetroArch apps to point to assets." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_DYNAMIC_WALLPAPERS_DIRECTORY, + "Directory to store wallpapers dynamically loaded by the menu depending on context.") +MSG_HASH(MENU_ENUM_SUBLABEL_THUMBNAILS_DIRECTORY, + "Supplementary thumbnails (boxarts/misc. images, etc.) are stored here." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_CONFIG_DIRECTORY, + "Sets start directory for menu configuration browser.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN, + "The number of frames of input latency for netplay to use to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of noticeable input lag.") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, + "The range of frames of input latency that may be used to hide network latency. Reduces jitter and makes netplay less CPU-intensive, at the expense of unpredictable input lag.") +MSG_HASH(MENU_ENUM_SUBLABEL_DISK_CYCLE_TRAY_STATUS, + "Cycle the current disk. If the disk is inserted, it will eject the disk. If the disk has not been inserted, it will be inserted. ") +MSG_HASH(MENU_ENUM_SUBLABEL_DISK_INDEX, + "Change the disk index.") +MSG_HASH(MENU_ENUM_SUBLABEL_DISK_OPTIONS, + "Disk image management.") +MSG_HASH(MENU_ENUM_SUBLABEL_DISK_IMAGE_APPEND, + "Select a disk image to insert.") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_ENUM_THROTTLE_FRAMERATE, + "Makes sure the framerate is capped while inside the menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_THEME, + "Select a different theme for the icon. Changes will take effect after you restart the program.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHADOWS_ENABLE, + "Enable drop shadows for all icons. This will have a minor performance hit.") +MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_COLOR_THEME, + "Select a different background color gradient theme.") +MSG_HASH(MENU_ENUM_SUBLABEL_MENU_WALLPAPER_OPACITY, + "Modify the opacity of the background wallpaper.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_MENU_COLOR_THEME, + "Select a different background color gradient theme.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_RIBBON_ENABLE, + "Select an animated background effect. Can be GPU-intensive depending on the effect. If performance is unsatisfactory, either turn this off or revert to a simpler effect.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_FONT, + "Select a different main font to be used by the menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_IMAGES, + "Show the image tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_MUSIC, + "Show the music tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_VIDEO, + "Show the video tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_NETPLAY, + "Show the netplay tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_SETTINGS, + "Show the settings tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_HISTORY, + "Show the recent history tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_XMB_SHOW_ADD, + "Show the import content tab inside the main menu.") +MSG_HASH(MENU_ENUM_SUBLABEL_RGUI_SHOW_START_SCREEN, + "Show startup screen in menu. This is automatically set to false after the program starts for the first time.") +MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_HEADER_OPACITY, + "Modify the opacity of the header graphic.") +MSG_HASH(MENU_ENUM_SUBLABEL_MATERIALUI_MENU_FOOTER_OPACITY, + "Modify the opacity of the footer graphic.") +MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_ENABLE, + "The menu normally scales itself dynamically. If you want to set a specific scaling size instead, enable this.") +MSG_HASH(MENU_ENUM_SUBLABEL_DPI_OVERRIDE_VALUE, + "Set the custom scaling size here. NOTE: You have to enable 'DPI Override' for this scaling size to take effect.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_ASSETS_DIRECTORY, + "Save all downloaded files to this directory.") +MSG_HASH(MENU_ENUM_SUBLABEL_INPUT_REMAPPING_DIRECTORY, + "Save all remapped controls to this directory.") +MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_DIR_PATH, + "Directory where the program searches for content/cores.") +MSG_HASH(MENU_ENUM_SUBLABEL_LIBRETRO_INFO_PATH, + "Application/core information files are stored here.") +MSG_HASH(MENU_ENUM_SUBLABEL_JOYPAD_AUTOCONFIG_DIR, + "If a joypad is plugged in, that joypad will be autoconfigured if a config file corresponding to it is present inside this directory.") +MSG_HASH(MENU_ENUM_SUBLABEL_PLAYLIST_DIRECTORY, + "Save all collections to this directory.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CACHE_DIRECTORY, + "If set to a directory, content which is temporarily extracted (e.g. from archives) will be extracted to this directory." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_CURSOR_DIRECTORY, + "Saved queries are stored to this directory.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_DATABASE_DIRECTORY, + "Databases are stored to this directory." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ASSETS_DIRECTORY, + "This location is queried by default when menu interfaces try to look for loadable assets, etc." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_SAVEFILE_DIRECTORY, + "Save all save files to this directory. If not set, will try to save inside the content file's working directory.") +MSG_HASH(MENU_ENUM_SUBLABEL_SAVESTATE_DIRECTORY, + "Save all save states to this directory. If not set, will try to save inside the content file's working directory.") +MSG_HASH(MENU_ENUM_SUBLABEL_SCREENSHOT_DIRECTORY, + "Directory to dump screenshots to.") +MSG_HASH(MENU_ENUM_SUBLABEL_OVERLAY_DIRECTORY, + "Defines a directory where overlays are kept for easy access.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_DATABASE_PATH, + "Cheat files are kept here." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_FILTER_DIR, + "Directory where audio DSP filter files are kept." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_FILTER_DIR, + "Directory where CPU-based video filter files are kept." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_DIR, + "Defines a directory where GPU-based video shader files are kept for easy access.") +MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_OUTPUT_DIRECTORY, + "Recordings will be dumped to this directory.") +MSG_HASH(MENU_ENUM_SUBLABEL_RECORDING_CONFIG_DIRECTORY, + "Recording configurations will be kept here.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FONT_PATH, + "Select a different font for onscreen notifications.") +MSG_HASH(MENU_ENUM_SUBLABEL_SHADER_APPLY_CHANGES, + "Changes to the shader configuration will take effect immediately. Use this if you changed the amount of shader passes, filtering, FBO scale, etc.") +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_NUM_PASSES, + "Increase or decrease the amount of shader pipeline passes. You can bind a separate shader to each pipeline pass and configure its scale and filtering." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET, + "Load a shader preset. The shader pipeline will be automatically set-up.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_AS, + "Save the current shader settings as a new shader preset.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_CORE, + "Save the current shader settings as the default settings for this application/core.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_SAVE_GAME, + "Save the current shader settings as the default settings for the content.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PARAMETERS, + "Modifies the current shader directly. Changes will not be saved to the preset file.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SHADER_PRESET_PARAMETERS, + "Modifies the shader preset itself currently used in the menu.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_NUM_PASSES, + "Increase or decrease the amount of cheats." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_CHEAT_APPLY_CHANGES, + "Cheat changes will take effect immediately.") +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_LOAD, + "Load a cheat file." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_FILE_SAVE_AS, + "Save current cheats as a save file." + ) +MSG_HASH(MENU_ENUM_SUBLABEL_CONTENT_SETTINGS, + "Quickly access all relevant in-game settings.") +MSG_HASH(MENU_ENUM_SUBLABEL_CORE_INFORMATION, + "View information pertaining to the application/core.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_ASPECT_RATIO, + "Floating point value for video aspect ratio (width / height), used if the Aspect Ratio is set to 'Config'.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, + "Custom viewport height that is used if the Aspect Ratio is set to 'Custom'.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, + "Custom viewport width that is used if the Aspect Ratio is set to 'Custom'.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, + "Custom viewport offset used for defining the X-axis position of the viewport. These are ignored if 'Integer Scale' is enabled. It will be automatically centered then.") +MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, + "Custom viewport offset used for defining the Y-axis position of the viewport. These are ignored if 'Integer Scale' is enabled. It will be automatically centered then.") +MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_USE_MITM_SERVER, + "Use MITM Server") +MSG_HASH(MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER, + "Forward netplay connections through a man-in-the-middle server. Useful if the host is behind a firewall or has NAT/UPnP problems.") From 66c877887810ec97e3bf9d79ebc23d2e63696194 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Fri, 12 May 2017 01:29:02 +0100 Subject: [PATCH 036/274] 'es' is required after #version 300. --- gfx/drivers_shader/shader_glsl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 42d9f1f30d..3595240763 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -263,15 +263,19 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl, if (existing_version) { + const char* version_extra = ""; unsigned version_no = strtoul(existing_version + 8, (char**)&program, 10); #ifdef HAVE_OPENGLES if (version_no < 130) version_no = 100; else + { + version_extra = " es"; version_no = 300; + } #endif - snprintf(version, sizeof(version), "#version %u\n", version_no); - RARCH_LOG("[GLSL]: Using GLSL version %u.\n", version_no); + snprintf(version, sizeof(version), "#version %u%s\n", version_no, version_extra); + RARCH_LOG("[GLSL]: Using GLSL version %u%s.\n", version_no, version_extra); } else if (glsl_core) { From 2adace47d4f4bf81b9d8f4a22088321acadc7920 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 12 May 2017 03:18:43 +0200 Subject: [PATCH 037/274] Cleanup --- menu/menu_setting.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 37594d6f0e..6cf3807e96 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1644,21 +1644,19 @@ void general_write_handler(void *data) settings->uints.input_joypad_map[4] = *setting->value.target.integer; break; case MENU_ENUM_LABEL_LOG_VERBOSITY: - { - if (setting - && setting->value.target.boolean - && *setting->value.target.boolean) - verbosity_enable(); - else - verbosity_disable(); + if (setting + && setting->value.target.boolean + && *setting->value.target.boolean) + verbosity_enable(); + else + verbosity_disable(); - if (setting - && setting->value.target.boolean - && *setting->value.target.boolean) - retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_VERBOSITY, NULL); - else - retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_VERBOSITY, NULL); - } + if (setting + && setting->value.target.boolean + && *setting->value.target.boolean) + retroarch_override_setting_set(RARCH_OVERRIDE_SETTING_VERBOSITY, NULL); + else + retroarch_override_setting_unset(RARCH_OVERRIDE_SETTING_VERBOSITY, NULL); break; case MENU_ENUM_LABEL_VIDEO_SMOOTH: video_driver_set_filtering(1, settings->bools.video_smooth); From fa4a8b8bbda81587fe9dccc529e40b97f66ead28 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 12 May 2017 03:39:37 +0200 Subject: [PATCH 038/274] Cleanups --- retroarch.c | 111 +++++++++++++++++++++++++--------------------------- retroarch.h | 12 ++---- 2 files changed, 56 insertions(+), 67 deletions(-) diff --git a/retroarch.c b/retroarch.c index 900e40a2b2..a7cd31b47c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -183,6 +183,12 @@ static enum rarch_core_type current_core_type = CORE_TYPE_PLAIN; static enum rarch_core_type explicit_current_core_type = CORE_TYPE_PLAIN; static char error_string[255] = {0}; +#ifdef HAVE_THREAD_STORAGE +static sthread_tls_t rarch_tls; +const void *MAGIC_POINTER = (void*)0xB16B00B5; +#endif + + static retro_bits_t has_set_libretro_device; static bool has_set_core = false; static bool has_set_username = false; @@ -204,6 +210,14 @@ static bool has_set_ups_pref = false; static bool has_set_bps_pref = false; static bool has_set_ips_pref = false; +static bool rarch_is_sram_load_disabled = false; +static bool rarch_is_sram_save_disabled = false; +static bool rarch_use_sram = false; +static bool rarch_ups_pref = false; +static bool rarch_bps_pref = false; +static bool rarch_ips_pref = false; +static bool rarch_patch_blocked = false; + static rarch_system_info_t runloop_system; static struct retro_frame_time_callback runloop_frame_time; static retro_keyboard_event_t runloop_key_event = NULL; @@ -275,15 +289,15 @@ static void global_free(void) command_event(CMD_EVENT_RECORD_DEINIT, NULL); command_event(CMD_EVENT_LOG_FILE_DEINIT, NULL); - rarch_ctl(RARCH_CTL_UNSET_BLOCK_CONFIG_READ, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_LOAD_DISABLED, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_SAVE_DISABLED, NULL); - rarch_ctl(RARCH_CTL_UNSET_SRAM_ENABLE, NULL); - rarch_ctl(RARCH_CTL_UNSET_BPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_IPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_UPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_PATCH_BLOCKED, NULL); - runloop_overrides_active = false; + rarch_block_config_read = false; + rarch_is_sram_load_disabled = false; + rarch_is_sram_save_disabled = false; + rarch_use_sram = false; + rarch_bps_pref = false; + rarch_ips_pref = false; + rarch_ups_pref = false; + rarch_patch_blocked = false; + runloop_overrides_active = false; core_unset_input_descriptors(); @@ -626,10 +640,10 @@ static void retroarch_parse_input(int argc, char *argv[]) retroarch_override_setting_free_state(); - rarch_ctl(RARCH_CTL_USERNAME_UNSET, NULL); - rarch_ctl(RARCH_CTL_UNSET_UPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_IPS_PREF, NULL); - rarch_ctl(RARCH_CTL_UNSET_BPS_PREF, NULL); + has_set_username = false; + rarch_ups_pref = false; + rarch_ips_pref = false; + rarch_bps_pref = false; *global->name.ups = '\0'; *global->name.bps = '\0'; *global->name.ips = '\0'; @@ -724,7 +738,7 @@ static void retroarch_parse_input(int argc, char *argv[]) break; case 'f': - rarch_ctl(RARCH_CTL_SET_FORCE_FULLSCREEN, NULL); + rarch_force_fullscreen = true; break; case 'S': @@ -824,13 +838,13 @@ static void retroarch_parse_input(int argc, char *argv[]) case 'M': if (memcmp(optarg, "noload-nosave", 13) == 0) { - rarch_ctl(RARCH_CTL_SET_SRAM_LOAD_DISABLED, NULL); - rarch_ctl(RARCH_CTL_SET_SRAM_SAVE_DISABLED, NULL); + rarch_is_sram_load_disabled = true; + rarch_is_sram_save_disabled = true; } else if (memcmp(optarg, "noload-save", 11) == 0) - rarch_ctl(RARCH_CTL_SET_SRAM_LOAD_DISABLED, NULL); + rarch_is_sram_load_disabled = true; else if (memcmp(optarg, "load-nosave", 11) == 0) - rarch_ctl(RARCH_CTL_SET_SRAM_SAVE_DISABLED, NULL); + rarch_is_sram_save_disabled = true; else if (memcmp(optarg, "load-save", 9) != 0) { RARCH_ERR("Invalid argument in --sram-mode.\n"); @@ -939,7 +953,9 @@ static void retroarch_parse_input(int argc, char *argv[]) case RA_OPT_NICK: { settings_t *settings = config_get_ptr(); - rarch_ctl(RARCH_CTL_USERNAME_SET, NULL); + + has_set_username = true; + strlcpy(settings->paths.username, optarg, sizeof(settings->paths.username)); } @@ -1053,7 +1069,7 @@ static bool retroarch_init_state(void) video_driver_set_active(); audio_driver_set_active(); - rarch_ctl(RARCH_CTL_UNSET_FORCE_FULLSCREEN, NULL); + rarch_force_fullscreen = false; return true; } @@ -1269,20 +1285,17 @@ error: return false; } +bool retroarch_is_on_main_thread(void) +{ +#ifdef HAVE_THREAD_STORAGE + if (sthread_tls_get(&rarch_tls) != MAGIC_POINTER) + return false; +#endif + return true; +} + bool rarch_ctl(enum rarch_ctl_state state, void *data) { - static bool rarch_is_sram_load_disabled = false; - static bool rarch_is_sram_save_disabled = false; - static bool rarch_use_sram = false; - static bool rarch_ups_pref = false; - static bool rarch_bps_pref = false; - static bool rarch_ips_pref = false; - static bool rarch_patch_blocked = false; -#ifdef HAVE_THREAD_STORAGE - static sthread_tls_t rarch_tls; - const void *MAGIC_POINTER = (void*)0xB16B00B5; -#endif - switch(state) { case RARCH_CTL_IS_PATCH_BLOCKED: @@ -1347,12 +1360,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) runloop_ctl(RUNLOOP_CTL_DATA_DEINIT, NULL); config_free(); break; - case RARCH_CTL_DEINIT: - if (!rarch_ctl(RARCH_CTL_IS_INITED, NULL)) - return false; - - driver_ctl(RARCH_DRIVER_CTL_UNINIT_ALL, NULL); - break; case RARCH_CTL_PREINIT: command_event(CMD_EVENT_HISTORY_DEINIT, NULL); @@ -1364,7 +1371,7 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) global_free(); break; case RARCH_CTL_MAIN_DEINIT: - if (!rarch_ctl(RARCH_CTL_IS_INITED, NULL)) + if (!rarch_is_inited) return false; command_event(CMD_EVENT_NETPLAY_DEINIT, NULL); command_event(CMD_EVENT_COMMAND_DEINIT, NULL); @@ -1394,7 +1401,9 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) #endif break; case RARCH_CTL_INIT: - rarch_ctl(RARCH_CTL_DEINIT, NULL); + if (rarch_is_inited) + driver_ctl(RARCH_DRIVER_CTL_UNINIT_ALL, NULL); + #ifdef HAVE_THREAD_STORAGE sthread_tls_create(&rarch_tls); sthread_tls_set(&rarch_tls, MAGIC_POINTER); @@ -1440,7 +1449,7 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) bool contentless = false; bool is_inited = false; content_get_status(&contentless, &is_inited); - rarch_use_sram = rarch_ctl(RARCH_CTL_IS_PLAIN_CORE, NULL) + rarch_use_sram = (current_core_type == CORE_TYPE_PLAIN) && !contentless; } break; @@ -1450,12 +1459,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) case RARCH_CTL_UNSET_SRAM_ENABLE: rarch_use_sram = false; break; - case RARCH_CTL_SET_FORCE_FULLSCREEN: - rarch_force_fullscreen = true; - break; - case RARCH_CTL_UNSET_FORCE_FULLSCREEN: - rarch_force_fullscreen = false; - break; case RARCH_CTL_IS_FORCE_FULLSCREEN: return rarch_force_fullscreen; case RARCH_CTL_SET_BLOCK_CONFIG_READ: @@ -1491,12 +1494,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data) } #endif break; - case RARCH_CTL_IS_MAIN_THREAD: -#ifdef HAVE_THREAD_STORAGE - return sthread_tls_get(&rarch_tls) == MAGIC_POINTER; -#else - return true; -#endif case RARCH_CTL_NONE: default: return false; @@ -2415,8 +2412,7 @@ static enum runloop_state runloop_check_state( { if (menu_driver_is_alive()) { - if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) && - !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + if (rarch_is_inited && (current_core_type != CORE_TYPE_DUMMY)) { rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); menu_event_kb_set(false, RETROK_F1); @@ -2425,12 +2421,11 @@ static enum runloop_state runloop_check_state( } else if ((!menu_event_kb_is_set(RETROK_F1) && runloop_cmd_triggered(trigger_input, RARCH_MENU_TOGGLE)) || - rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + (current_core_type == CORE_TYPE_DUMMY)) { if (menu_driver_is_alive()) { - if (rarch_ctl(RARCH_CTL_IS_INITED, NULL) && - !rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL)) + if (rarch_is_inited && (current_core_type != CORE_TYPE_DUMMY)) rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); } else diff --git a/retroarch.h b/retroarch.h index 33e47543a6..483df40fb5 100644 --- a/retroarch.h +++ b/retroarch.h @@ -34,10 +34,6 @@ enum rarch_ctl_state { RARCH_CTL_NONE = 0, - /* Will teardown drivers and clears all - * internal state of the program. */ - RARCH_CTL_DEINIT, - /* Initialize all drivers. */ RARCH_CTL_INIT, @@ -90,8 +86,6 @@ enum rarch_ctl_state RARCH_CTL_UNSET_SRAM_SAVE_DISABLED, /* Force fullscreen */ - RARCH_CTL_SET_FORCE_FULLSCREEN, - RARCH_CTL_UNSET_FORCE_FULLSCREEN, RARCH_CTL_IS_FORCE_FULLSCREEN, /* Block config read */ @@ -102,9 +96,7 @@ enum rarch_ctl_state /* Username */ RARCH_CTL_HAS_SET_USERNAME, RARCH_CTL_USERNAME_SET, - RARCH_CTL_USERNAME_UNSET, - - RARCH_CTL_IS_MAIN_THREAD + RARCH_CTL_USERNAME_UNSET }; enum rarch_capabilities @@ -368,6 +360,8 @@ void runloop_set(enum runloop_action action); void runloop_unset(enum runloop_action action); +bool retroarch_is_on_main_thread(void); + rarch_system_info_t *runloop_get_system_info(void); RETRO_END_DECLS From e7061a8d2a2a0d21f85039ca5c852fd6c7d8bbb7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 12 May 2017 03:45:49 +0200 Subject: [PATCH 039/274] Cleanups --- retroarch.c | 11 ++++------- retroarch.h | 1 - 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/retroarch.c b/retroarch.c index a7cd31b47c..628cde22b2 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1815,7 +1815,7 @@ bool retroarch_main_quit(void) #endif #endif - runloop_ctl(RUNLOOP_CTL_SET_SHUTDOWN, NULL); + runloop_shutdown_initiated = true; #ifdef HAVE_MENU rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL); #endif @@ -2208,11 +2208,6 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) } break; - case RUNLOOP_CTL_CORE_OPTIONS_FREE: - if (runloop_core_options) - core_option_manager_free(runloop_core_options); - runloop_core_options = NULL; - break; case RUNLOOP_CTL_CORE_OPTIONS_DEINIT: { if (!runloop_core_options) @@ -2232,7 +2227,9 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) if (runloop_game_options_active) runloop_game_options_active = false; - runloop_ctl(RUNLOOP_CTL_CORE_OPTIONS_FREE, NULL); + if (runloop_core_options) + core_option_manager_free(runloop_core_options); + runloop_core_options = NULL; } break; case RUNLOOP_CTL_KEY_EVENT_GET: diff --git a/retroarch.h b/retroarch.h index 483df40fb5..489dd3ea64 100644 --- a/retroarch.h +++ b/retroarch.h @@ -198,7 +198,6 @@ enum runloop_ctl_state RUNLOOP_CTL_CORE_OPTIONS_GET, RUNLOOP_CTL_CORE_OPTIONS_INIT, RUNLOOP_CTL_CORE_OPTIONS_DEINIT, - RUNLOOP_CTL_CORE_OPTIONS_FREE, /* System info */ RUNLOOP_CTL_SYSTEM_INFO_INIT, From 19db4f63a754f684c71bf22da8f0b06c4a5ea39b Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 13 May 2017 07:53:42 +0200 Subject: [PATCH 040/274] Take out filestream from audio_mixer.c --- libretro-common/audio/audio_mixer.c | 29 +++------------------ libretro-common/include/audio/audio_mixer.h | 5 ++-- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c index cf20e13948..f0ffce33f3 100644 --- a/libretro-common/audio/audio_mixer.c +++ b/libretro-common/audio/audio_mixer.c @@ -23,7 +23,6 @@ #include