From 0d46073bb90066780a554e7948ebc05f6f736ee3 Mon Sep 17 00:00:00 2001 From: sonninnos <45124675+sonninnos@users.noreply.github.com> Date: Sun, 9 Feb 2025 15:24:14 +0200 Subject: [PATCH] Add mute on rewind option (#17541) --- audio/audio_defines.h | 8 ++- audio/audio_driver.c | 15 ++---- config.def.h | 8 +-- configuration.c | 1 + configuration.h | 1 + intl/msg_hash_us.h | 12 ++++- menu/cbs/menu_cbs_sublabel.c | 4 ++ menu/menu_displaylist.c | 96 ++++++++++++------------------------ menu/menu_setting.c | 21 ++++++-- msg_hash.h | 1 + retroarch.c | 15 +++--- runloop.c | 20 ++++++++ ui/drivers/qt/qt_options.cpp | 3 ++ 13 files changed, 109 insertions(+), 96 deletions(-) diff --git a/audio/audio_defines.h b/audio/audio_defines.h index 18de5f033820..ca2a8e162ac6 100644 --- a/audio/audio_defines.h +++ b/audio/audio_defines.h @@ -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 diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 01a727eb95f6..2b999a8364b5 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -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, diff --git a/config.def.h b/config.def.h index fc5744f2d36d..f4ea524c7c8a 100644 --- a/config.def.h +++ b/config.def.h @@ -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 */ diff --git a/configuration.c b/configuration.c index 19fec6392471..baa07769476e 100644 --- a/configuration.c +++ b/configuration.c @@ -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); diff --git a/configuration.h b/configuration.h index 185c7a833c63..258645c453e2 100644 --- a/configuration.h +++ b/configuration.h @@ -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 diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index f31243d012f8..e2aea566243d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -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)" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 0bfc17f019f5..1e3d044d0a18 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -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; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index bf2ee5a7f4cf..29fd42ba4ac0 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -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) @@ -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}, }; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index c8dc0f5d1b6f..d167d951ae24 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -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, diff --git a/msg_hash.h b/msg_hash.h index c195728ee9fd..6bf6e028b718 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -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), diff --git a/retroarch.c b/retroarch.c index 3e5e6550f926..dc692e4333b1 100644 --- a/retroarch.c +++ b/retroarch.c @@ -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); diff --git a/runloop.c b/runloop.c index 227898a6bb89..9f6ce406f77d 100644 --- a/runloop.c +++ b/runloop.c @@ -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 diff --git a/ui/drivers/qt/qt_options.cpp b/ui/drivers/qt/qt_options.cpp index 455aaf4a997c..d9ab5588f542 100644 --- a/ui/drivers/qt/qt_options.cpp +++ b/ui/drivers/qt/qt_options.cpp @@ -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);