diff --git a/audio/audio_driver.c b/audio/audio_driver.c index 926add793a..ad569f52c8 100644 --- a/audio/audio_driver.c +++ b/audio/audio_driver.c @@ -148,6 +148,7 @@ static size_t audio_driver_buffer_size = 0; static size_t audio_driver_data_ptr = 0; static bool audio_driver_control = false; +static bool audio_driver_mixer_mute_enable = false; static bool audio_driver_mute_enable = false; static bool audio_driver_use_float = false; static bool audio_driver_active = false; @@ -534,6 +535,8 @@ static bool audio_driver_flush(const int16_t *data, size_t samples) bool is_slowmotion = false; const void *output_data = NULL; unsigned output_frames = 0; + float audio_volume_gain = !audio_driver_mute_enable ? + audio_driver_volume_gain : 0.0f; src_data.data_in = NULL; src_data.data_out = NULL; @@ -553,7 +556,7 @@ static bool audio_driver_flush(const int16_t *data, size_t samples) return false; convert_s16_to_float(audio_driver_input_data, data, samples, - audio_driver_mute_enable ? 0.0f : audio_driver_volume_gain); + audio_volume_gain); src_data.data_in = audio_driver_input_data; src_data.input_frames = samples >> 1; @@ -622,8 +625,14 @@ static bool audio_driver_flush(const int16_t *data, size_t samples) audio_driver_resampler->process(audio_driver_resampler_data, &src_data); if (audio_mixer_active) - audio_mixer_mix(audio_driver_output_samples_buf, src_data.output_frames, - audio_driver_mixer_volume_gain); + { + bool override = audio_driver_mixer_mute_enable ? true : + (audio_driver_mixer_volume_gain != 0.0f) ? true : false; + float mixer_gain = !audio_driver_mixer_mute_enable ? + audio_driver_mixer_volume_gain : 0.0f; + audio_mixer_mix(audio_driver_output_samples_buf, + src_data.output_frames, mixer_gain, override); + } output_data = audio_driver_output_samples_buf; output_frames = (unsigned)src_data.output_frames; @@ -1141,6 +1150,12 @@ bool audio_driver_toggle_mute(void) return true; } +bool audio_driver_mixer_toggle_mute(void) +{ + audio_driver_mixer_mute_enable = !audio_driver_mixer_mute_enable; + return true; +} + static INLINE bool audio_driver_alive(void) { if ( current_audio @@ -1274,6 +1289,8 @@ bool *audio_get_bool_ptr(enum audio_action action) { switch (action) { + case AUDIO_ACTION_MIXER_MUTE_ENABLE: + return &audio_driver_mixer_mute_enable; case AUDIO_ACTION_MUTE_ENABLE: return &audio_driver_mute_enable; case AUDIO_ACTION_NONE: diff --git a/audio/audio_driver.h b/audio/audio_driver.h index a7da6b2efa..7df25d6b31 100644 --- a/audio/audio_driver.h +++ b/audio/audio_driver.h @@ -38,6 +38,7 @@ enum audio_action { AUDIO_ACTION_NONE = 0, AUDIO_ACTION_RATE_CONTROL_DELTA, + AUDIO_ACTION_MIXER_MUTE_ENABLE, AUDIO_ACTION_MUTE_ENABLE, AUDIO_ACTION_VOLUME_GAIN, AUDIO_ACTION_MIXER_VOLUME_GAIN, diff --git a/configuration.c b/configuration.c index 5706502d5d..fd7fcf0ee2 100644 --- a/configuration.c +++ b/configuration.c @@ -1153,6 +1153,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("core_set_supports_no_game_enable", &settings->bools.set_supports_no_game_enable, true, true, false); SETTING_BOOL("audio_enable", &settings->bools.audio_enable, true, audio_enable, false); SETTING_BOOL("audio_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MUTE_ENABLE), true, false, false); + SETTING_BOOL("audio_mixer_mute_enable", audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE), true, false, false); SETTING_BOOL("location_allow", &settings->bools.location_allow, true, false, false); SETTING_BOOL("video_font_enable", &settings->bools.video_font_enable, true, font_enable, false); SETTING_BOOL("core_updater_auto_extract_archive", &settings->bools.network_buildbot_auto_extract_archive, true, true, false); diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index a60fc93cf3..0a8bc42628 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1235,3 +1235,5 @@ MSG_HASH(MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, "filter_by_current_Core") MSG_HASH(MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, "audio_mixer_volume") +MSG_HASH(MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, + "audio_mixer_mute_enable") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 6238cfaae4..0d1dc68e19 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3029,3 +3029,9 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, "Audio Mixer Volume Level (dB)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, + "Audio Mixer Mute" + ) +MSG_HASH(MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE, + "Mute/unmute mixer audio.") diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c index 187cce2175..8afea64b78 100644 --- a/libretro-common/audio/audio_mixer.c +++ b/libretro-common/audio/audio_mixer.c @@ -608,7 +608,7 @@ again: } #endif -void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override) +void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override, bool override) { unsigned i; size_t j = 0; @@ -621,7 +621,7 @@ void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override) for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++, voice++) { - float volume = (volume_override == 0.0f) ? voice->volume : volume_override; + float volume = (override) ? volume_override : voice->volume; switch (voice->type) { diff --git a/libretro-common/include/audio/audio_mixer.h b/libretro-common/include/audio/audio_mixer.h index 5aec714092..f9044bd3d6 100644 --- a/libretro-common/include/audio/audio_mixer.h +++ b/libretro-common/include/audio/audio_mixer.h @@ -67,7 +67,7 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, void audio_mixer_stop(audio_mixer_voice_t* voice); -void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override); +void audio_mixer_mix(float* buffer, size_t num_frames, float volume_override, bool override); RETRO_END_DECLS diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index b4d66c3988..68c47a7d4c 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -98,6 +98,7 @@ default_sublabel_macro(action_bind_sublabel_video_shared_context, MENU_ default_sublabel_macro(action_bind_sublabel_audio_latency, MENU_ENUM_SUBLABEL_AUDIO_LATENCY) default_sublabel_macro(action_bind_sublabel_audio_rate_control_delta, MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA) default_sublabel_macro(action_bind_sublabel_audio_mute, MENU_ENUM_SUBLABEL_AUDIO_MUTE) +default_sublabel_macro(action_bind_sublabel_audio_mixer_mute, MENU_ENUM_SUBLABEL_AUDIO_MIXER_MUTE) 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) default_sublabel_macro(action_bind_sublabel_input_max_users, MENU_ENUM_SUBLABEL_INPUT_MAX_USERS) @@ -1062,6 +1063,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_AUDIO_MUTE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_mute); break; + case MENU_ENUM_LABEL_AUDIO_MIXER_MUTE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_mixer_mute); + break; case MENU_ENUM_LABEL_AUDIO_LATENCY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_latency); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index d771140435..2778a7147a 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5644,6 +5644,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_MUTE, PARSE_ONLY_BOOL, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, + PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_VOLUME, PARSE_ONLY_FLOAT, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 18251eae8c..847e3fe82a 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -3805,6 +3805,22 @@ static bool setting_append_list( SD_FLAG_NONE ); + CONFIG_BOOL( + list, list_info, + audio_get_bool_ptr(AUDIO_ACTION_MIXER_MUTE_ENABLE), + MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_MUTE, + false, + 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 5aaadf35de..72e5d16571 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -973,6 +973,7 @@ enum msg_hash_enums MENU_LABEL(AUDIO_BLOCK_FRAMES), MENU_LABEL(AUDIO_DSP_PLUGIN), MENU_LABEL(AUDIO_MUTE), + MENU_LABEL(AUDIO_MIXER_MUTE), MENU_LABEL(AUDIO_SYNC), MENU_LABEL(AUDIO_VOLUME), MENU_LABEL(AUDIO_MIXER_VOLUME), diff --git a/retroarch.cfg b/retroarch.cfg index b5e0aaa05f..6682ba5d0f 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -284,6 +284,9 @@ # Mutes audio. # audio_mute_enable = false +# Mutes audio mixer volume globally. +# audio_mixer_mute_enable = false + # Audio output samplerate. # audio_out_rate = 48000