From cdd7fbeb52a4d1bc92785bf964257afe52c527a3 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 8 Jun 2017 22:58:43 +0200 Subject: [PATCH] Add audio mixer volume setting --- command.c | 33 +++++++++++++++++++++++++++++++++ command.h | 2 ++ config.def.h | 3 +++ configuration.c | 3 +++ configuration.h | 1 + intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.h | 12 ++++++++++++ menu/cbs/menu_cbs_sublabel.c | 4 ++++ menu/menu_displaylist.c | 3 +++ menu/menu_setting.c | 17 +++++++++++++++++ msg_hash.h | 2 ++ retroarch.cfg | 4 ++++ 12 files changed, 86 insertions(+) diff --git a/command.c b/command.c index 7d535959c7..b67ef54638 100644 --- a/command.c +++ b/command.c @@ -933,6 +933,33 @@ static void command_event_set_volume(float gain) audio_set_float(AUDIO_ACTION_VOLUME_GAIN, new_volume); } +/** + * event_set_mixer_volume: + * @gain : amount of gain to be applied to current volume level. + * + * Adjusts the current audio volume level. + * + **/ +static void command_event_set_mixer_volume(float gain) +{ + char msg[128]; + settings_t *settings = config_get_ptr(); + float new_volume = settings->floats.audio_mixer_volume + gain; + + new_volume = MAX(new_volume, -80.0f); + new_volume = MIN(new_volume, 12.0f); + + configuration_set_float(settings, settings->floats.audio_mixer_volume, new_volume); + + snprintf(msg, sizeof(msg), "%s: %.1f dB", + msg_hash_to_str(MSG_AUDIO_VOLUME), + new_volume); + runloop_msg_queue_push(msg, 1, 180, true); + RARCH_LOG("%s\n", msg); + + audio_set_float(AUDIO_ACTION_VOLUME_GAIN, new_volume); +} + /** * command_event_init_controllers: * @@ -2512,6 +2539,12 @@ bool command_event(enum event_command cmd, void *data) case CMD_EVENT_VOLUME_DOWN: command_event_set_volume(-0.5f); break; + case CMD_EVENT_MIXER_VOLUME_UP: + command_event_set_mixer_volume(0.5f); + break; + case CMD_EVENT_MIXER_VOLUME_DOWN: + command_event_set_mixer_volume(-0.5f); + break; case CMD_EVENT_SET_FRAME_LIMIT: rarch_ctl(RARCH_CTL_SET_FRAME_LIMIT, NULL); break; diff --git a/command.h b/command.h index c4a4f9a91f..e396564ab3 100644 --- a/command.h +++ b/command.h @@ -215,6 +215,8 @@ enum event_command CMD_EVENT_PERFCNT_REPORT_FRONTEND_LOG, CMD_EVENT_VOLUME_UP, CMD_EVENT_VOLUME_DOWN, + CMD_EVENT_MIXER_VOLUME_UP, + CMD_EVENT_MIXER_VOLUME_DOWN, CMD_EVENT_DISABLE_OVERRIDES, CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET }; diff --git a/config.def.h b/config.def.h index 98ad598e3a..7227b4ece9 100644 --- a/config.def.h +++ b/config.def.h @@ -414,6 +414,9 @@ static const float max_timing_skew = 0.05; /* Default audio volume in dB. (0.0 dB == unity gain). */ static const float audio_volume = 0.0; +/* Default audio volume of the audio mixer in dB. (0.0 dB == unity gain). */ +static const float audio_mixer_volume = 0.0; + #ifdef HAVE_WASAPI /* WASAPI defaults */ static const bool wasapi_exclusive_mode = true; diff --git a/configuration.c b/configuration.c index 2d860f5e05..5706502d5d 100644 --- a/configuration.c +++ b/configuration.c @@ -1270,6 +1270,7 @@ static struct config_float_setting *populate_settings_float(settings_t *settings SETTING_FLOAT("audio_rate_control_delta", audio_get_float_ptr(AUDIO_ACTION_RATE_CONTROL_DELTA), true, rate_control_delta, false); SETTING_FLOAT("audio_max_timing_skew", &settings->floats.audio_max_timing_skew, true, max_timing_skew, false); SETTING_FLOAT("audio_volume", &settings->floats.audio_volume, true, audio_volume, false); + SETTING_FLOAT("audio_mixer_volume", &settings->floats.audio_mixer_volume, true, audio_mixer_volume, false); #ifdef HAVE_OVERLAY SETTING_FLOAT("input_overlay_opacity", &settings->floats.input_overlay_opacity, true, 0.7f, false); SETTING_FLOAT("input_overlay_scale", &settings->floats.input_overlay_scale, true, 1.0f, false); @@ -1532,6 +1533,7 @@ static void config_set_defaults(void) settings->uints.audio_latency = g_defaults.settings.out_latency; audio_set_float(AUDIO_ACTION_VOLUME_GAIN, settings->floats.audio_volume); + audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, settings->floats.audio_mixer_volume); settings->rewind_buffer_size = rewind_buffer_size; @@ -2441,6 +2443,7 @@ static bool config_load_file(const char *path, bool set_defaults, settings->uints.video_swap_interval = MIN(settings->uints.video_swap_interval, 4); audio_set_float(AUDIO_ACTION_VOLUME_GAIN, settings->floats.audio_volume); + audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, settings->floats.audio_mixer_volume); if (string_is_empty(settings->paths.path_content_history)) { diff --git a/configuration.h b/configuration.h index 8183212f45..e108f2fca2 100644 --- a/configuration.h +++ b/configuration.h @@ -231,6 +231,7 @@ typedef struct settings float audio_max_timing_skew; float audio_volume; /* dB scale. */ + float audio_mixer_volume; /* dB scale. */ float input_overlay_opacity; float input_overlay_scale; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 4fd5699b25..a60fc93cf3 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1233,3 +1233,5 @@ MSG_HASH(MENU_ENUM_LABEL_ADD_TO_MIXER_AND_COLLECTION, "audio_add_to_mixer_and_collection") MSG_HASH(MENU_ENUM_LABEL_FILTER_BY_CURRENT_CORE, "filter_by_current_Core") +MSG_HASH(MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, + "audio_mixer_volume") diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 62567e1355..6238cfaae4 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3017,3 +3017,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_ADD_TO_MIXER_AND_COLLECTION, "Add to mixer") MSG_HASH(MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, "Filter by current core") +MSG_HASH( + MSG_AUDIO_MIXER_VOLUME, + "Global audio mixer volume" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME, + "Global audio mixer volume (in dB). 0 dB is normal volume, and no gain is applied." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, + "Audio Mixer Volume Level (dB)" + ) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index ced52beb67..b4d66c3988 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -105,6 +105,7 @@ default_sublabel_macro(action_bind_sublabel_input_poll_type_behavior, MENU_ default_sublabel_macro(action_bind_sublabel_input_all_users_control_menu, MENU_ENUM_SUBLABEL_INPUT_ALL_USERS_CONTROL_MENU) default_sublabel_macro(action_bind_sublabel_input_bind_timeout, MENU_ENUM_SUBLABEL_INPUT_BIND_TIMEOUT) default_sublabel_macro(action_bind_sublabel_audio_volume, MENU_ENUM_SUBLABEL_AUDIO_VOLUME) +default_sublabel_macro(action_bind_sublabel_audio_mixer_volume, MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME) default_sublabel_macro(action_bind_sublabel_audio_sync, MENU_ENUM_SUBLABEL_AUDIO_SYNC) default_sublabel_macro(action_bind_sublabel_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_AXIS_THRESHOLD) default_sublabel_macro(action_bind_sublabel_input_turbo_period, MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD) @@ -1037,6 +1038,9 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_AUDIO_VOLUME: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_volume); break; + case MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_mixer_volume); + break; case MENU_ENUM_LABEL_INPUT_ALL_USERS_CONTROL_MENU: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_all_users_control_menu); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index f188de341d..d771140435 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -5647,6 +5647,9 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_AUDIO_VOLUME, PARSE_ONLY_FLOAT, false); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, + PARSE_ONLY_FLOAT, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_SYSTEM_BGM_ENABLE, PARSE_ONLY_BOOL, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 2eceaf1d0d..18251eae8c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1688,6 +1688,9 @@ void general_write_handler(void *data) case MENU_ENUM_LABEL_AUDIO_VOLUME: audio_set_float(AUDIO_ACTION_VOLUME_GAIN, *setting->value.target.fraction); break; + case MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME: + audio_set_float(AUDIO_ACTION_MIXER_VOLUME_GAIN, *setting->value.target.fraction); + break; case MENU_ENUM_LABEL_AUDIO_LATENCY: case MENU_ENUM_LABEL_AUDIO_DEVICE: case MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE: @@ -3816,6 +3819,20 @@ static bool setting_append_list( general_read_handler); menu_settings_list_current_add_range(list, list_info, -80, 12, 1.0, true, true); + CONFIG_FLOAT( + list, list_info, + &settings->floats.audio_mixer_volume, + MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME, + MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME, + audio_mixer_volume, + "%.1f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, -80, 12, 1.0, true, true); + #ifdef __CELLOS_LV2__ CONFIG_BOOL( list, list_info, diff --git a/msg_hash.h b/msg_hash.h index 60aa55c89d..5aaadf35de 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -170,6 +170,7 @@ enum msg_hash_enums MSG_NETPLAY_CHANGED_NICK, MSG_AUTODETECT, MSG_AUDIO_VOLUME, + MSG_AUDIO_MIXER_VOLUME, MSG_LIBRETRO_FRONTEND, MSG_CAPABILITIES, MSG_DEVICE_CONFIGURED_IN_PORT, @@ -974,6 +975,7 @@ enum msg_hash_enums MENU_LABEL(AUDIO_MUTE), MENU_LABEL(AUDIO_SYNC), MENU_LABEL(AUDIO_VOLUME), + MENU_LABEL(AUDIO_MIXER_VOLUME), MENU_LABEL(AUDIO_RATE_CONTROL_DELTA), MENU_LABEL(AUDIO_LATENCY), MENU_LABEL(AUDIO_WASAPI_EXCLUSIVE_MODE), diff --git a/retroarch.cfg b/retroarch.cfg index f9a45abb4c..b5e0aaa05f 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -325,6 +325,10 @@ # Gain can be controlled in runtime with input_volume_up/input_volume_down. # audio_volume = 0.0 +# Audio mixer volume. Volume is expressed in dB. +# 0 dB is normal volume. No gain will be applied. +# audio_mixer_volume = 0.0 + #### Overlay # Defines a directory where overlays are kept for easy access.