diff --git a/configuration.c b/configuration.c index ae26ae8b65..35fc9fb20d 100644 --- a/configuration.c +++ b/configuration.c @@ -475,9 +475,10 @@ static void config_set_defaults(void) if (def_menu) strlcpy(settings->menu.driver, def_menu, sizeof(settings->menu.driver)); - settings->menu.xmb_scale_factor = xmb_scale_factor; - settings->menu.xmb_alpha_factor = xmb_alpha_factor; - settings->menu.xmb_font[0] = '\0'; + settings->menu.xmb_scale_factor = xmb_scale_factor; + settings->menu.xmb_alpha_factor = xmb_alpha_factor; + settings->menu.xmb_font[0] = '\0'; + settings->menu.throttle_framerate = true; #endif settings->history_list_enable = def_history_list_enable; @@ -1314,6 +1315,8 @@ static bool config_load_file(const char *path, bool set_defaults) "threaded_data_runloop_enable"); #endif + CONFIG_GET_BOOL_BASE(conf, settings, menu.throttle_framerate, + "menu_throttle_framerate"); CONFIG_GET_BOOL_BASE(conf, settings, menu.dpi.override_enable, "dpi_override_enable"); CONFIG_GET_INT_BASE (conf, settings, menu.dpi.override_value, @@ -2611,6 +2614,7 @@ bool config_save_file(const char *path) settings->threaded_data_runloop_enable); #endif + config_set_bool(conf, "menu_throttle_framerate", settings->menu.throttle_framerate); config_set_bool(conf, "dpi_override_enable", settings->menu.dpi.override_enable); config_set_int (conf, "dpi_override_value", settings->menu.dpi.override_value); config_set_string(conf,"menu_driver", settings->menu.driver); diff --git a/configuration.h b/configuration.h index 31f8a27f62..ebff3194db 100644 --- a/configuration.h +++ b/configuration.h @@ -167,6 +167,7 @@ typedef struct settings unsigned xmb_scale_factor; unsigned xmb_alpha_factor; char xmb_font[PATH_MAX_LENGTH]; + bool throttle_framerate; } menu; #endif diff --git a/menu/intl/menu_hash_us.c b/menu/intl/menu_hash_us.c index 15954c1a9c..cdc5534eb3 100644 --- a/menu/intl/menu_hash_us.c +++ b/menu/intl/menu_hash_us.c @@ -26,6 +26,8 @@ static const char *menu_hash_to_str_us_label(uint32_t hash) { switch (hash) { + case MENU_LABEL_MENU_THROTTLE_FRAMERATE: + return "menu_throttle_framerate"; case MENU_LABEL_START_CORE: return "start_core"; case MENU_LABEL_CHEEVOS_TEST_UNOFFICIAL: @@ -728,6 +730,8 @@ const char *menu_hash_to_str_us(uint32_t hash) switch (hash) { + case MENU_LABEL_VALUE_MENU_THROTTLE_FRAMERATE: + return "Throttle Menu Framerate"; case MENU_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL: return "Test unofficial"; case MENU_LABEL_VALUE_CHEEVOS_SETTINGS: diff --git a/menu/menu_hash.h b/menu/menu_hash.h index f72df225cf..4c3a1fcab6 100644 --- a/menu/menu_hash.h +++ b/menu/menu_hash.h @@ -22,6 +22,9 @@ extern "C" { #endif +#define MENU_LABEL_MENU_THROTTLE_FRAMERATE 0x9a8681c5U +#define MENU_LABEL_VALUE_MENU_THROTTLE_FRAMERATE 0x285bb667U + #define MENU_LABEL_INPUT_POLL_TYPE_BEHAVIOR 0x8360107bU #define MENU_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR 0xaa23fc1eU diff --git a/menu/menu_setting.c b/menu/menu_setting.c index e00bb73b3b..5fee2a7064 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -4120,6 +4120,20 @@ static bool setting_append_list_frame_throttling_options( general_read_handler); menu_settings_list_current_add_range(list, list_info, 1, 10, 1.0, true, true); + CONFIG_BOOL( + list, list_info, + &settings->menu.throttle_framerate, + menu_hash_to_str(MENU_LABEL_MENU_THROTTLE_FRAMERATE), + menu_hash_to_str(MENU_LABEL_VALUE_MENU_THROTTLE_FRAMERATE), + true, + menu_hash_to_str(MENU_VALUE_OFF), + menu_hash_to_str(MENU_VALUE_ON), + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); diff --git a/runloop.c b/runloop.c index 5165252d02..5da1fd832c 100644 --- a/runloop.c +++ b/runloop.c @@ -1378,6 +1378,11 @@ int runloop_iterate(unsigned *sleep_ms) return 1; } + if (!settings->menu.throttle_framerate) + { + if (!settings->fastforward_ratio) + return 0; + } goto end; } #endif