Add support for deferred settings changes, defer audio latency
This commit is contained in:
parent
c8b452e5ac
commit
b67c86de28
|
@ -309,6 +309,61 @@ static unsigned input_frame(uint64_t trigger_state)
|
||||||
return MENU_ACTION_NOOP;
|
return MENU_ACTION_NOOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void apply_deferred_settings()
|
||||||
|
{
|
||||||
|
rarch_setting_t *setting = driver.menu->list_settings;
|
||||||
|
bool change = false;
|
||||||
|
|
||||||
|
for (; setting->type != ST_NONE; setting++)
|
||||||
|
{
|
||||||
|
if ((setting->type < ST_GROUP) && (setting->flags & SD_FLAG_IS_DEFERRED))
|
||||||
|
{
|
||||||
|
switch (setting->type)
|
||||||
|
{
|
||||||
|
case ST_BOOL:
|
||||||
|
if (*setting->value.boolean != setting->original_value.boolean)
|
||||||
|
{
|
||||||
|
setting->original_value.boolean = *setting->value.boolean;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ST_INT:
|
||||||
|
if (*setting->value.integer != setting->original_value.integer)
|
||||||
|
{
|
||||||
|
setting->original_value.integer = *setting->value.integer;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ST_UINT:
|
||||||
|
if (*setting->value.unsigned_integer != setting->original_value.unsigned_integer)
|
||||||
|
{
|
||||||
|
setting->original_value.unsigned_integer = *setting->value.unsigned_integer;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ST_FLOAT:
|
||||||
|
if (*setting->value.fraction != setting->original_value.fraction)
|
||||||
|
{
|
||||||
|
setting->original_value.fraction = *setting->value.fraction;
|
||||||
|
change = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ST_PATH:
|
||||||
|
case ST_DIR:
|
||||||
|
case ST_STRING:
|
||||||
|
case ST_BIND:
|
||||||
|
/* always run the deferred write handler */
|
||||||
|
change = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (change)
|
||||||
|
setting->deferred_handler(setting);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns:
|
/* Returns:
|
||||||
* 0 - Forcibly wake up the loop.
|
* 0 - Forcibly wake up the loop.
|
||||||
* -1 - Quit out of iteration loop.
|
* -1 - Quit out of iteration loop.
|
||||||
|
|
|
@ -160,6 +160,8 @@ int menu_common_core_setting_toggle(unsigned setting, unsigned action);
|
||||||
int menu_common_setting_set_perf(unsigned setting, unsigned action,
|
int menu_common_setting_set_perf(unsigned setting, unsigned action,
|
||||||
struct retro_perf_counter **counters, unsigned offset);
|
struct retro_perf_counter **counters, unsigned offset);
|
||||||
|
|
||||||
|
void apply_deferred_settings();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2015,6 +2015,8 @@ void rarch_main_set_state(unsigned cmd)
|
||||||
break;
|
break;
|
||||||
case RARCH_ACTION_STATE_MENU_RUNNING_FINISHED:
|
case RARCH_ACTION_STATE_MENU_RUNNING_FINISHED:
|
||||||
#ifdef HAVE_MENU
|
#ifdef HAVE_MENU
|
||||||
|
apply_deferred_settings();
|
||||||
|
|
||||||
g_extern.is_menu = false;
|
g_extern.is_menu = false;
|
||||||
|
|
||||||
driver_set_nonblock_state(driver.nonblock_state);
|
driver_set_nonblock_state(driver.nonblock_state);
|
||||||
|
|
|
@ -703,6 +703,7 @@ rarch_setting_t setting_data_float_setting(const char* name,
|
||||||
result.change_handler = change_handler;
|
result.change_handler = change_handler;
|
||||||
result.read_handler = read_handler;
|
result.read_handler = read_handler;
|
||||||
result.value.fraction = target;
|
result.value.fraction = target;
|
||||||
|
result.original_value.fraction = *target;
|
||||||
result.default_value.fraction = default_value;
|
result.default_value.fraction = default_value;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -718,6 +719,7 @@ rarch_setting_t setting_data_bool_setting(const char* name,
|
||||||
result.change_handler = change_handler;
|
result.change_handler = change_handler;
|
||||||
result.read_handler = read_handler;
|
result.read_handler = read_handler;
|
||||||
result.value.boolean = target;
|
result.value.boolean = target;
|
||||||
|
result.original_value.boolean = *target;
|
||||||
result.default_value.boolean = default_value;
|
result.default_value.boolean = default_value;
|
||||||
result.boolean.off_label = off;
|
result.boolean.off_label = off;
|
||||||
result.boolean.on_label = on;
|
result.boolean.on_label = on;
|
||||||
|
@ -735,6 +737,7 @@ rarch_setting_t setting_data_int_setting(const char* name,
|
||||||
result.change_handler = change_handler;
|
result.change_handler = change_handler;
|
||||||
result.read_handler = read_handler;
|
result.read_handler = read_handler;
|
||||||
result.value.integer = target;
|
result.value.integer = target;
|
||||||
|
result.original_value.integer = *target;
|
||||||
result.default_value.integer = default_value;
|
result.default_value.integer = default_value;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -750,6 +753,7 @@ rarch_setting_t setting_data_uint_setting(const char* name,
|
||||||
result.change_handler = change_handler;
|
result.change_handler = change_handler;
|
||||||
result.read_handler = read_handler;
|
result.read_handler = read_handler;
|
||||||
result.value.unsigned_integer = target;
|
result.value.unsigned_integer = target;
|
||||||
|
result.original_value.unsigned_integer = *target;
|
||||||
result.default_value.unsigned_integer = default_value;
|
result.default_value.unsigned_integer = default_value;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -3631,7 +3635,7 @@ bool setting_data_append_list_audio_options(
|
||||||
general_write_handler,
|
general_write_handler,
|
||||||
general_read_handler);
|
general_read_handler);
|
||||||
settings_list_current_add_range(list, list_info, 1, 256, 1.0, true, true);
|
settings_list_current_add_range(list, list_info, 1, 256, 1.0, true, true);
|
||||||
|
settings_list_current_add_flags(list, list_info, SD_FLAG_IS_DEFERRED);
|
||||||
|
|
||||||
CONFIG_FLOAT(
|
CONFIG_FLOAT(
|
||||||
g_settings.audio.rate_control_delta,
|
g_settings.audio.rate_control_delta,
|
||||||
|
|
|
@ -56,12 +56,24 @@ bool settings_list_append(rarch_setting_t **list,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void null_write_handler(void *data)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void settings_list_current_add_flags(
|
void settings_list_current_add_flags(
|
||||||
rarch_setting_t **list,
|
rarch_setting_t **list,
|
||||||
rarch_setting_info_t *list_info,
|
rarch_setting_info_t *list_info,
|
||||||
unsigned values)
|
unsigned values)
|
||||||
{
|
{
|
||||||
|
|
||||||
(*list)[list_info->index - 1].flags |= values;
|
(*list)[list_info->index - 1].flags |= values;
|
||||||
|
|
||||||
|
if (values & SD_FLAG_IS_DEFERRED)
|
||||||
|
{
|
||||||
|
(*list)[list_info->index - 1].deferred_handler = (*list)[list_info->index - 1].change_handler;
|
||||||
|
(*list)[list_info->index - 1].change_handler = null_write_handler;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void settings_list_current_add_range(
|
void settings_list_current_add_range(
|
||||||
|
|
|
@ -56,6 +56,7 @@ enum setting_flags
|
||||||
SD_FLAG_EXIT = (1 << 8),
|
SD_FLAG_EXIT = (1 << 8),
|
||||||
SD_FLAG_CMD_APPLY_AUTO = (1 << 9),
|
SD_FLAG_CMD_APPLY_AUTO = (1 << 9),
|
||||||
SD_FLAG_IS_CATEGORY = (1 << 10),
|
SD_FLAG_IS_CATEGORY = (1 << 10),
|
||||||
|
SD_FLAG_IS_DEFERRED = (1 << 11),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum setting_list_flags
|
enum setting_list_flags
|
||||||
|
@ -112,6 +113,7 @@ typedef struct rarch_setting
|
||||||
uint64_t flags;
|
uint64_t flags;
|
||||||
|
|
||||||
change_handler_t change_handler;
|
change_handler_t change_handler;
|
||||||
|
change_handler_t deferred_handler;
|
||||||
change_handler_t read_handler;
|
change_handler_t read_handler;
|
||||||
|
|
||||||
union
|
union
|
||||||
|
@ -134,6 +136,14 @@ typedef struct rarch_setting
|
||||||
struct retro_keybind* keybind;
|
struct retro_keybind* keybind;
|
||||||
} value;
|
} value;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
bool boolean;
|
||||||
|
int integer;
|
||||||
|
unsigned int unsigned_integer;
|
||||||
|
float fraction;
|
||||||
|
} original_value;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
const char *empty_path;
|
const char *empty_path;
|
||||||
|
|
Loading…
Reference in New Issue