Skip to content

Commit

Permalink
Add mute on rewind option (#17541)
Browse files Browse the repository at this point in the history
  • Loading branch information
sonninnos authored Feb 9, 2025
1 parent 81df9b0 commit 0d46073
Show file tree
Hide file tree
Showing 13 changed files with 109 additions and 96 deletions.
8 changes: 7 additions & 1 deletion audio/audio_defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 4 additions & 11 deletions audio/audio_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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 -
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
1 change: 1 addition & 0 deletions configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 10 additions & 2 deletions intl/msg_hash_us.h
Original file line number Diff line number Diff line change
Expand Up @@ -2986,20 +2986,28 @@ 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,
"Automatically mute audio when using fast-forward."
)
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)"
Expand Down
4 changes: 4 additions & 0 deletions menu/cbs/menu_cbs_sublabel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
96 changes: 31 additions & 65 deletions menu/menu_displaylist.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
#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_MICROPHONE_SETTINGS, PARSE_ACTION, true },
#endif
{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)
Expand Down Expand Up @@ -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)
Expand All @@ -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},
};

Expand Down
21 changes: 17 additions & 4 deletions menu/menu_setting.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions msg_hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
15 changes: 6 additions & 9 deletions retroarch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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);
Expand Down
Loading

0 comments on commit 0d46073

Please sign in to comment.