Add mute on rewind option (#17541)

This commit is contained in:
sonninnos 2025-02-09 15:24:14 +02:00 committed by GitHub
parent 81df9b0491
commit 0d46073bb9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 108 additions and 95 deletions

View File

@ -161,7 +161,13 @@ enum audio_driver_state_flags
* @see audio_driver_t::write_avail
* @see audio_driver_t::buffer_size
*/
AUDIO_FLAG_CONTROL = (1 << 5)
AUDIO_FLAG_CONTROL = (1 << 5),
/**
* Indicates that the audio driver is forcing gain to 0.
* Used for temporary rewind and fast-forward muting.
*/
AUDIO_FLAG_MUTED = (1 << 6)
};
typedef struct audio_statistics

View File

@ -400,22 +400,20 @@ bool audio_driver_find_driver(
* @param audio_st The overall state of the audio driver.
* @param slowmotion_ratio The factor by which slow motion extends the core's runtime
* (e.g. a value of 2 means the core is running at half speed).
* @param audio_fastforward_mute True if no audio should be output while the game is in fast-forward.
* @param data Audio output data that was most recently provided by the core.
* @param samples The size of \c data, in samples.
* @param is_slowmotion True if the player is currently running the game in slow motion.
* @param is_fastmotion True if the player is currently running the game in fast-forward.
* @param is_slowmotion True if the core is currently running in slow motion.
* @param is_fastmotion True if the core is currently running in fast-forward.
**/
static void audio_driver_flush(
audio_driver_state_t *audio_st,
float slowmotion_ratio,
bool audio_fastforward_mute,
const int16_t *data, size_t samples,
bool is_slowmotion, bool is_fastforward)
{
struct resampler_data src_data;
float audio_volume_gain = (audio_st->mute_enable ||
(audio_fastforward_mute && is_fastforward))
float audio_volume_gain =
(audio_st->mute_enable || audio_st->flags & AUDIO_FLAG_MUTED)
? 0.0f
: audio_st->volume_gain;
@ -850,7 +848,6 @@ void audio_driver_sample(int16_t left, int16_t right)
|| !(audio_st->output_samples_buf)))
audio_driver_flush(audio_st,
config_get_ptr()->floats.slowmotion_ratio,
config_get_ptr()->bools.audio_fastforward_mute,
audio_st->output_samples_conv_buf,
audio_st->data_ptr,
(runloop_flags & RUNLOOP_FLAG_SLOWMOTION) ? true : false,
@ -900,7 +897,6 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames)
|| !(audio_st->output_samples_buf)))
audio_driver_flush(audio_st,
config_get_ptr()->floats.slowmotion_ratio,
config_get_ptr()->bools.audio_fastforward_mute,
data,
frames_to_write << 1,
(runloop_flags & RUNLOOP_FLAG_SLOWMOTION) ? true : false,
@ -1741,7 +1737,6 @@ void audio_driver_frame_is_reverse(void)
settings_t *settings = config_get_ptr();
audio_driver_flush(audio_st,
settings->floats.slowmotion_ratio,
settings->bools.audio_fastforward_mute,
audio_st->rewind_buf +
audio_st->rewind_ptr,
audio_st->rewind_size -
@ -1911,7 +1906,6 @@ void audio_driver_menu_sample(void)
if (check_flush)
audio_driver_flush(audio_st,
settings->floats.slowmotion_ratio,
settings->bools.audio_fastforward_mute,
samples_buf,
1024,
(runloop_flags & RUNLOOP_FLAG_SLOWMOTION) ? true : false,
@ -1933,7 +1927,6 @@ void audio_driver_menu_sample(void)
if (check_flush)
audio_driver_flush(audio_st,
settings->floats.slowmotion_ratio,
settings->bools.audio_fastforward_mute,
samples_buf,
sample_count,
(runloop_flags & RUNLOOP_FLAG_SLOWMOTION) ? true : false,

View File

@ -1215,12 +1215,12 @@
#define DEFAULT_AUDIO_RESPECT_SILENT_MODE true
#endif
/* Automatically mute audio when fast forward
* is enabled */
/* Automatically mute audio when fast forward is enabled. */
#define DEFAULT_AUDIO_FASTFORWARD_MUTE false
/* Speed up audio to match fast-forward speed up.
* Avoids crackling */
/* Speed up audio to match fast forward speed up. */
#define DEFAULT_AUDIO_FASTFORWARD_SPEEDUP false
/* Automatically mute audio when rewind is enabled. */
#define DEFAULT_AUDIO_REWIND_MUTE false
#ifdef HAVE_MICROPHONE
/* Microphone support */

View File

@ -1838,6 +1838,7 @@ static struct config_bool_setting *populate_settings_bool(
#endif
SETTING_BOOL("audio_fastforward_mute", &settings->bools.audio_fastforward_mute, true, DEFAULT_AUDIO_FASTFORWARD_MUTE, false);
SETTING_BOOL("audio_fastforward_speedup", &settings->bools.audio_fastforward_speedup, true, DEFAULT_AUDIO_FASTFORWARD_SPEEDUP, false);
SETTING_BOOL("audio_rewind_mute", &settings->bools.audio_rewind_mute, true, DEFAULT_AUDIO_REWIND_MUTE, false);
#ifdef HAVE_WASAPI
SETTING_BOOL("audio_wasapi_exclusive_mode", &settings->bools.audio_wasapi_exclusive_mode, true, DEFAULT_WASAPI_EXCLUSIVE_MODE, false);

View File

@ -662,6 +662,7 @@ typedef struct settings
bool audio_rate_control;
bool audio_fastforward_mute;
bool audio_fastforward_speedup;
bool audio_rewind_mute;
#ifdef IOS
bool audio_respect_silent_mode;
#endif

View File

@ -2986,7 +2986,7 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_AUDIO_FASTFORWARD_MUTE,
"Mute When Fast-Forwarding"
"Fast-Forward Audio Mute"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_AUDIO_FASTFORWARD_MUTE,
@ -2994,12 +2994,20 @@ MSG_HASH(
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_AUDIO_FASTFORWARD_SPEEDUP,
"Speedup When Fast-Forwarding"
"Fast-Forward Audio Speedup"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_AUDIO_FASTFORWARD_SPEEDUP,
"Speed up audio when fast-forwarding. Prevents crackling but shifts pitch."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_AUDIO_REWIND_MUTE,
"Rewind Audio Mute"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_AUDIO_REWIND_MUTE,
"Automatically mute audio when using rewind."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME,
"Volume Gain (dB)"

View File

@ -538,6 +538,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_mixer_mute, MENU_
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_respect_silent_mode, MENU_ENUM_SUBLABEL_AUDIO_RESPECT_SILENT_MODE)
#endif
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_fastforward_mute, MENU_ENUM_SUBLABEL_AUDIO_FASTFORWARD_MUTE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_rewind_mute, MENU_ENUM_SUBLABEL_AUDIO_REWIND_MUTE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_fastforward_speedup, MENU_ENUM_SUBLABEL_AUDIO_FASTFORWARD_SPEEDUP)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_camera_allow, MENU_ENUM_SUBLABEL_CAMERA_ALLOW)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_location_allow, MENU_ENUM_SUBLABEL_LOCATION_ALLOW)
@ -4675,6 +4676,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_respect_silent_mode);
break;
#endif
case MENU_ENUM_LABEL_AUDIO_REWIND_MUTE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_rewind_mute);
break;
case MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_fastforward_mute);
break;

View File

@ -7731,52 +7731,31 @@ unsigned menu_displaylist_build_list(
break;
case DISPLAYLIST_AUDIO_SETTINGS_LIST:
{
bool audio_mute_enable = *audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE);
#if defined(HAVE_AUDIOMIXER)
bool audio_mixer_mute_enable = *audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE);
#else
bool audio_mixer_mute_enable = true;
#endif
menu_displaylist_build_info_selective_t build_list[] = {
{MENU_ENUM_LABEL_AUDIO_OUTPUT_SETTINGS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_AUDIO_OUTPUT_SETTINGS, PARSE_ACTION, true },
#ifdef HAVE_MICROPHONE
{MENU_ENUM_LABEL_MICROPHONE_SETTINGS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_MICROPHONE_SETTINGS, PARSE_ACTION, true },
#endif
{MENU_ENUM_LABEL_AUDIO_SYNCHRONIZATION_SETTINGS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_MIDI_SETTINGS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_AUDIO_MIXER_SETTINGS, PARSE_ACTION, false },
{MENU_ENUM_LABEL_MENU_SOUNDS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_AUDIO_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_RESPECT_SILENT_MODE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_FASTFORWARD_SPEEDUP, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_VOLUME, PARSE_ONLY_FLOAT, false },
{MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, PARSE_ONLY_FLOAT, false },
{MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_SYNCHRONIZATION_SETTINGS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_MIDI_SETTINGS, PARSE_ACTION, true },
#if defined(HAVE_AUDIOMIXER)
{MENU_ENUM_LABEL_AUDIO_MIXER_SETTINGS, PARSE_ACTION, true },
#endif
{MENU_ENUM_LABEL_MENU_SOUNDS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_AUDIO_VOLUME, PARSE_ONLY_FLOAT, true },
{MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, PARSE_ONLY_FLOAT, true },
{MENU_ENUM_LABEL_AUDIO_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_RESPECT_SILENT_MODE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_REWIND_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_FASTFORWARD_SPEEDUP, PARSE_ONLY_BOOL, true },
#if defined(HAVE_DSP_FILTER)
{MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN, PARSE_ONLY_PATH, true },
{MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN, PARSE_ONLY_PATH, true },
#endif
};
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
switch (build_list[i].enum_idx)
{
case MENU_ENUM_LABEL_AUDIO_VOLUME:
if (!audio_mute_enable)
build_list[i].checked = true;
break;
case MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME:
case MENU_ENUM_LABEL_AUDIO_MIXER_SETTINGS:
if (!audio_mixer_mute_enable)
build_list[i].checked = true;
break;
default:
break;
}
}
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
if (!build_list[i].checked && !include_everything)
@ -11441,29 +11420,14 @@ unsigned menu_displaylist_build_list(
break;
case DISPLAYLIST_REWIND_SETTINGS_LIST:
{
bool rewind_enable = settings->bools.rewind_enable;
menu_displaylist_build_info_selective_t build_list[] = {
{MENU_ENUM_LABEL_REWIND_ENABLE, PARSE_ONLY_BOOL, true},
{MENU_ENUM_LABEL_REWIND_GRANULARITY, PARSE_ONLY_UINT, false},
{MENU_ENUM_LABEL_REWIND_BUFFER_SIZE, PARSE_ONLY_SIZE, false},
{MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP, PARSE_ONLY_UINT, false},
{MENU_ENUM_LABEL_REWIND_ENABLE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_REWIND_GRANULARITY, PARSE_ONLY_UINT, true },
{MENU_ENUM_LABEL_REWIND_BUFFER_SIZE, PARSE_ONLY_SIZE, true },
{MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP, PARSE_ONLY_UINT, true },
{MENU_ENUM_LABEL_AUDIO_REWIND_MUTE, PARSE_ONLY_BOOL, true },
};
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
switch (build_list[i].enum_idx)
{
case MENU_ENUM_LABEL_REWIND_GRANULARITY:
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE:
case MENU_ENUM_LABEL_REWIND_BUFFER_SIZE_STEP:
if (rewind_enable)
build_list[i].checked = true;
break;
default:
break;
}
}
for (i = 0; i < ARRAY_SIZE(build_list); i++)
{
if (!build_list[i].checked && !include_everything)
@ -11485,11 +11449,13 @@ unsigned menu_displaylist_build_list(
#ifdef HAVE_REWIND
{MENU_ENUM_LABEL_REWIND_SETTINGS, PARSE_ACTION, false},
#endif
{MENU_ENUM_LABEL_FRAME_TIME_COUNTER_SETTINGS, PARSE_ACTION, true},
{MENU_ENUM_LABEL_FASTFORWARD_RATIO, PARSE_ONLY_FLOAT, true},
{MENU_ENUM_LABEL_FASTFORWARD_FRAMESKIP, PARSE_ONLY_BOOL, true},
{MENU_ENUM_LABEL_SLOWMOTION_RATIO, PARSE_ONLY_FLOAT, true},
{MENU_ENUM_LABEL_VRR_RUNLOOP_ENABLE, PARSE_ONLY_BOOL, true},
{MENU_ENUM_LABEL_FRAME_TIME_COUNTER_SETTINGS, PARSE_ACTION, true },
{MENU_ENUM_LABEL_FASTFORWARD_RATIO, PARSE_ONLY_FLOAT, true },
{MENU_ENUM_LABEL_FASTFORWARD_FRAMESKIP, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_AUDIO_FASTFORWARD_SPEEDUP, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_SLOWMOTION_RATIO, PARSE_ONLY_FLOAT, true },
{MENU_ENUM_LABEL_VRR_RUNLOOP_ENABLE, PARSE_ONLY_BOOL, true },
{MENU_ENUM_LABEL_MENU_THROTTLE_FRAMERATE, PARSE_ONLY_BOOL, false},
};

View File

@ -12210,10 +12210,7 @@ static bool setting_append_list(
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_CMD_APPLY_AUTO);
(*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
(*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
(*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;
SD_FLAG_NONE);
MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_REWIND_TOGGLE);
CONFIG_UINT(
@ -14742,6 +14739,22 @@ static bool setting_append_list(
SD_FLAG_NONE
);
CONFIG_BOOL(
list, list_info,
&settings->bools.audio_rewind_mute,
MENU_ENUM_LABEL_AUDIO_REWIND_MUTE,
MENU_ENUM_LABEL_VALUE_AUDIO_REWIND_MUTE,
DEFAULT_AUDIO_REWIND_MUTE,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE
);
CONFIG_FLOAT(
list, list_info,
&settings->floats.audio_volume,

View File

@ -2294,6 +2294,7 @@ enum msg_hash_enums
MENU_LABEL(AUDIO_RESPECT_SILENT_MODE),
MENU_LABEL(AUDIO_FASTFORWARD_MUTE),
MENU_LABEL(AUDIO_FASTFORWARD_SPEEDUP),
MENU_LABEL(AUDIO_REWIND_MUTE),
MENU_LABEL(AUDIO_SYNC),
MENU_LBL_H(AUDIO_VOLUME),
MENU_LABEL(AUDIO_MIXER_VOLUME),

View File

@ -5289,17 +5289,14 @@ bool command_event(enum event_command cmd, void *data)
}
break;
case CMD_EVENT_VOLUME_UP:
{
audio_driver_state_t
*audio_st = audio_state_get_ptr();
command_event_set_volume(settings, 0.5f,
command_event_set_volume(settings, 0.5f,
#if defined(HAVE_GFX_WIDGETS)
dispwidget_get_ptr()->active,
dispwidget_get_ptr()->active,
#else
false,
false,
#endif
audio_st->mute_enable);
}
audio_state_get_ptr()->mute_enable
);
break;
case CMD_EVENT_VOLUME_DOWN:
command_event_set_volume(settings, -0.5f,
@ -5309,7 +5306,7 @@ bool command_event(enum event_command cmd, void *data)
false,
#endif
audio_state_get_ptr()->mute_enable
);
);
break;
case CMD_EVENT_MIXER_VOLUME_UP:
command_event_set_mixer_volume(settings, 0.5f);

View File

@ -3965,6 +3965,7 @@ static void runloop_apply_fastmotion_override(runloop_state_t *runloop_st, setti
{
float fastforward_ratio_current;
video_driver_state_t *video_st = video_state_get_ptr();
audio_driver_state_t *audio_st = audio_state_get_ptr();
bool frame_time_counter_reset_after_fastforwarding = settings ?
settings->bools.frame_time_counter_reset_after_fastforwarding : false;
float fastforward_ratio_default = settings ?
@ -3992,6 +3993,11 @@ static void runloop_apply_fastmotion_override(runloop_state_t *runloop_st, setti
else
runloop_st->flags &= ~RUNLOOP_FLAG_FASTMOTION;
if (settings->bools.audio_fastforward_mute && (runloop_st->flags & RUNLOOP_FLAG_FASTMOTION))
audio_st->flags |= AUDIO_FLAG_MUTED;
else
audio_st->flags &= ~AUDIO_FLAG_MUTED;
if (input_st)
{
if (runloop_st->flags & RUNLOOP_FLAG_FASTMOTION)
@ -5458,6 +5464,7 @@ static enum runloop_state_enum runloop_check_state(
uico_driver_state_t *uico_st = uico_state_get_ptr();
input_driver_state_t *input_st = input_state_get_ptr();
video_driver_state_t *video_st = video_state_get_ptr();
audio_driver_state_t *audio_st = audio_state_get_ptr();
gfx_display_t *p_disp = disp_get_ptr();
runloop_state_t *runloop_st = &runloop_state;
static bool old_focus = true;
@ -6165,6 +6172,14 @@ static enum runloop_state_enum runloop_check_state(
,
s, sizeof(s), &t);
if (rewind_pressed != old_rewind_pressed)
{
if (settings->bools.audio_rewind_mute && rewind_pressed)
audio_st->flags |= AUDIO_FLAG_MUTED;
else
audio_st->flags &= ~AUDIO_FLAG_MUTED;
}
old_rewind_pressed = rewind_pressed;
#if defined(HAVE_GFX_WIDGETS)
@ -6438,6 +6453,11 @@ static enum runloop_state_enum runloop_check_state(
command_event(CMD_EVENT_SET_FRAME_LIMIT, NULL);
}
if (settings->bools.audio_fastforward_mute && (runloop_st->flags & RUNLOOP_FLAG_FASTMOTION))
audio_st->flags |= AUDIO_FLAG_MUTED;
else
audio_st->flags &= ~AUDIO_FLAG_MUTED;
driver_set_nonblock_state();
/* Reset frame time counter when toggling

View File

@ -190,7 +190,10 @@ QWidget *AudioPage::widget()
2, 3, 1, 1);
volumeGroup->addRow(volumeLayout);
volumeGroup->add(MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE);
volumeGroup->add(MENU_ENUM_LABEL_AUDIO_FASTFORWARD_SPEEDUP);
volumeGroup->add(MENU_ENUM_LABEL_AUDIO_REWIND_MUTE);
layout->addWidget(outputGroup);
layout->addWidget(resamplerGroup);