Add support for deferred settings changes, defer audio latency

This commit is contained in:
Mike Robinson 2014-10-09 11:09:36 +01:00
parent c8b452e5ac
commit b67c86de28
6 changed files with 86 additions and 1 deletions

View File

@ -309,6 +309,61 @@ static unsigned input_frame(uint64_t trigger_state)
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:
* 0 - Forcibly wake up the loop.
* -1 - Quit out of iteration loop.

View File

@ -160,6 +160,8 @@ int menu_common_core_setting_toggle(unsigned setting, unsigned action);
int menu_common_setting_set_perf(unsigned setting, unsigned action,
struct retro_perf_counter **counters, unsigned offset);
void apply_deferred_settings();
#ifdef __cplusplus
}
#endif

View File

@ -2015,6 +2015,8 @@ void rarch_main_set_state(unsigned cmd)
break;
case RARCH_ACTION_STATE_MENU_RUNNING_FINISHED:
#ifdef HAVE_MENU
apply_deferred_settings();
g_extern.is_menu = false;
driver_set_nonblock_state(driver.nonblock_state);

View File

@ -703,6 +703,7 @@ rarch_setting_t setting_data_float_setting(const char* name,
result.change_handler = change_handler;
result.read_handler = read_handler;
result.value.fraction = target;
result.original_value.fraction = *target;
result.default_value.fraction = default_value;
return result;
}
@ -718,6 +719,7 @@ rarch_setting_t setting_data_bool_setting(const char* name,
result.change_handler = change_handler;
result.read_handler = read_handler;
result.value.boolean = target;
result.original_value.boolean = *target;
result.default_value.boolean = default_value;
result.boolean.off_label = off;
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.read_handler = read_handler;
result.value.integer = target;
result.original_value.integer = *target;
result.default_value.integer = default_value;
return result;
}
@ -750,6 +753,7 @@ rarch_setting_t setting_data_uint_setting(const char* name,
result.change_handler = change_handler;
result.read_handler = read_handler;
result.value.unsigned_integer = target;
result.original_value.unsigned_integer = *target;
result.default_value.unsigned_integer = default_value;
return result;
@ -3631,7 +3635,7 @@ bool setting_data_append_list_audio_options(
general_write_handler,
general_read_handler);
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(
g_settings.audio.rate_control_delta,

View File

@ -56,12 +56,24 @@ bool settings_list_append(rarch_setting_t **list,
return true;
}
static void null_write_handler(void *data)
{
return;
}
void settings_list_current_add_flags(
rarch_setting_t **list,
rarch_setting_info_t *list_info,
unsigned 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(

View File

@ -56,6 +56,7 @@ enum setting_flags
SD_FLAG_EXIT = (1 << 8),
SD_FLAG_CMD_APPLY_AUTO = (1 << 9),
SD_FLAG_IS_CATEGORY = (1 << 10),
SD_FLAG_IS_DEFERRED = (1 << 11),
};
enum setting_list_flags
@ -112,6 +113,7 @@ typedef struct rarch_setting
uint64_t flags;
change_handler_t change_handler;
change_handler_t deferred_handler;
change_handler_t read_handler;
union
@ -134,6 +136,14 @@ typedef struct rarch_setting
struct retro_keybind* keybind;
} value;
union
{
bool boolean;
int integer;
unsigned int unsigned_integer;
float fraction;
} original_value;
struct
{
const char *empty_path;