From 6605c2657f08d77bb2b142389815aa3f4b35b89e Mon Sep 17 00:00:00 2001 From: Mckol Date: Mon, 9 May 2022 03:11:34 +0200 Subject: [PATCH] Added mute buttons for all of the audio sliders in settings --- .../element/ui/generic/buttons/mute_btn.png | 3 + .../ui/generic/buttons/mute_btn_hover.png | 3 + .../element/ui/generic/buttons/muted_btn.png | 3 + .../ui/generic/buttons/muted_btn_hover.png | 3 + voxygen/src/hud/img_ids.rs | 7 + voxygen/src/hud/settings_window/sound.rs | 127 +++++++++++++++--- voxygen/src/main.rs | 8 +- voxygen/src/run.rs | 10 +- voxygen/src/session/settings_change.rs | 78 +++++++++-- voxygen/src/settings/audio.rs | 38 ++++-- 10 files changed, 232 insertions(+), 48 deletions(-) create mode 100644 assets/voxygen/element/ui/generic/buttons/mute_btn.png create mode 100644 assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png create mode 100644 assets/voxygen/element/ui/generic/buttons/muted_btn.png create mode 100644 assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn.png b/assets/voxygen/element/ui/generic/buttons/mute_btn.png new file mode 100644 index 0000000000..dedca5520c --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af54ab92914772171fe25abb02b79bda3b2fab8bbf3491f6d50dfa3ab4a62825 +size 9711 diff --git a/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png b/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png new file mode 100644 index 0000000000..2efe112e80 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/mute_btn_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a3cb4d6bf5262474233e1df5799b30d00bc145b180d6f121307ca8ede3b6b3c +size 9578 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn.png b/assets/voxygen/element/ui/generic/buttons/muted_btn.png new file mode 100644 index 0000000000..4c75976525 --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2b2a9f0cbd164f066fe8d49524f5b08ec3e5b3f3070200fd0c3e1dcb8557f96 +size 8151 diff --git a/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png b/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png new file mode 100644 index 0000000000..91b3973e0b --- /dev/null +++ b/assets/voxygen/element/ui/generic/buttons/muted_btn_hover.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7412295437dc9dcde313d436fd84830e580506c52e5d7ff9c2622d2126075783 +size 8007 diff --git a/voxygen/src/hud/img_ids.rs b/voxygen/src/hud/img_ids.rs index 19a36b0455..4153bee932 100644 --- a/voxygen/src/hud/img_ids.rs +++ b/voxygen/src/hud/img_ids.rs @@ -556,6 +556,13 @@ image_ids! { button_hover: "voxygen.element.ui.generic.buttons.button_hover", button_press: "voxygen.element.ui.generic.buttons.button_press", + // Mute Buttons + button_mute: "voxygen.element.ui.generic.buttons.mute_btn", + button_mute_hover: "voxygen.element.ui.generic.buttons.mute_btn_hover", + button_muted: "voxygen.element.ui.generic.buttons.muted_btn", + button_muted_hover: "voxygen.element.ui.generic.buttons.muted_btn_hover", + + // Enemy Healthbar enemy_health: "voxygen.element.ui.generic.frames.enemybar", enemy_health_bg: "voxygen.element.ui.generic.frames.enemybar_bg", diff --git a/voxygen/src/hud/settings_window/sound.rs b/voxygen/src/hud/settings_window/sound.rs index a575753b49..ba361f3376 100644 --- a/voxygen/src/hud/settings_window/sound.rs +++ b/voxygen/src/hud/settings_window/sound.rs @@ -3,7 +3,7 @@ use super::{RESET_BUTTONS_HEIGHT, RESET_BUTTONS_WIDTH}; use crate::{ hud::{img_ids::Imgs, TEXT_COLOR}, session::settings_change::{Audio as AudioChange, Audio::*}, - ui::{fonts::Fonts, ImageSlider}, + ui::{fonts::Fonts, ImageSlider, ToggleButton}, GlobalState, }; use conrod_core::{ @@ -22,18 +22,23 @@ widget_ids! { master_volume_text, master_volume_slider, master_volume_number, + master_volume_muted, inactive_master_volume_text, inactive_master_volume_slider, inactive_master_volume_number, + inactive_master_volume_muted, music_volume_text, music_volume_slider, music_volume_number, + music_volume_muted, sfx_volume_text, sfx_volume_slider, sfx_volume_number, + sfx_volume_muted, ambience_volume_text, ambience_volume_slider, ambience_volume_number, + ambience_volume_muted, music_spacing_text, music_spacing_slider, music_spacing_number, @@ -116,14 +121,14 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.master_volume_text, ui); // Master Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.master_volume, + self.global_state.settings.audio.master_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.master_volume_text, 10.0) + .right_from(state.ids.master_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -134,13 +139,26 @@ impl<'a> Widget for Sound<'a> { // Master Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.master_volume * 100.0 + self.global_state.settings.audio.master_volume.volume * 100.0 )) .right_from(state.ids.master_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.master_volume_number, ui); + // Master Volume Muted Indicator + let master_muted = ToggleButton::new( + self.global_state.settings.audio.master_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.master_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.master_volume_muted, ui); + if master_muted != self.global_state.settings.audio.master_volume.muted { + events.push(MuteMasterVolume(master_muted)); + } // Master Volume (inactive window) Text::new( @@ -148,21 +166,25 @@ impl<'a> Widget for Sound<'a> { .localized_strings .get_msg("hud-settings-inactive_master_volume_perc"), ) - .down_from(state.ids.master_volume_slider, 10.0) + .down_from(state.ids.master_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.inactive_master_volume_text, ui); // Master Volume (inactive window) Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.inactive_master_volume_perc, + self.global_state + .settings + .audio + .inactive_master_volume_perc + .volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.inactive_master_volume_text, 10.0) + .right_from(state.ids.inactive_master_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -173,31 +195,60 @@ impl<'a> Widget for Sound<'a> { // Master Volume (inactive window) Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.inactive_master_volume_perc * 100.0 + self.global_state + .settings + .audio + .inactive_master_volume_perc + .volume + * 100.0 )) .right_from(state.ids.inactive_master_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.inactive_master_volume_number, ui); + // Master Volume (inactive window) Muted Indicator + let inactive_master_muted = ToggleButton::new( + self.global_state + .settings + .audio + .inactive_master_volume_perc + .muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.inactive_master_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.inactive_master_volume_muted, ui); + if inactive_master_muted + != self + .global_state + .settings + .audio + .inactive_master_volume_perc + .muted + { + events.push(MuteInactiveMasterVolume(inactive_master_muted)); + } // Music Volume Text::new(&self.localized_strings.get_msg("hud-settings-music_volume")) - .down_from(state.ids.inactive_master_volume_slider, 10.0) + .down_from(state.ids.inactive_master_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.music_volume_text, ui); // Music Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.music_volume, + self.global_state.settings.audio.music_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.music_volume_text, 10.0) + .right_from(state.ids.music_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -208,13 +259,26 @@ impl<'a> Widget for Sound<'a> { // Music Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.music_volume * 100.0 + self.global_state.settings.audio.music_volume.volume * 100.0 )) .right_from(state.ids.music_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.music_volume_number, ui); + // Music Muted Indicator + let music_muted = ToggleButton::new( + self.global_state.settings.audio.music_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.music_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.music_volume_muted, ui); + if music_muted != self.global_state.settings.audio.music_volume.muted { + events.push(MuteMusicVolume(music_muted)); + } // SFX Volume Text::new( @@ -222,21 +286,21 @@ impl<'a> Widget for Sound<'a> { .localized_strings .get_msg("hud-settings-sound_effect_volume"), ) - .down_from(state.ids.music_volume_slider, 10.0) + .down_from(state.ids.music_volume_muted, 10.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.sfx_volume_text, ui); // SFX Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.sfx_volume, + self.global_state.settings.audio.sfx_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, self.imgs.slider, ) .w_h(104.0, 22.0) - .down_from(state.ids.sfx_volume_text, 10.0) + .right_from(state.ids.sfx_volume_muted, 8.0) .track_breadth(12.0) .slider_length(10.0) .pad_track((5.0, 5.0)) @@ -247,13 +311,27 @@ impl<'a> Widget for Sound<'a> { // SFX Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.sfx_volume * 100.0 + self.global_state.settings.audio.sfx_volume.volume * 100.0 )) .right_from(state.ids.sfx_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.sfx_volume_number, ui); + // SFX Volume Muted Indicator + let sfx_muted = ToggleButton::new( + self.global_state.settings.audio.sfx_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.sfx_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.sfx_volume_muted, ui); + if sfx_muted != self.global_state.settings.audio.sfx_volume.muted { + events.push(MuteSfxVolume(sfx_muted)); + } + // Ambience Volume Text::new( &self @@ -267,7 +345,7 @@ impl<'a> Widget for Sound<'a> { .set(state.ids.ambience_volume_text, ui); // Ambience Volume Slider if let Some(new_val) = ImageSlider::continuous( - self.global_state.settings.audio.ambience_volume, + self.global_state.settings.audio.ambience_volume.volume, 0.0, 1.0, self.imgs.slider_indicator, @@ -285,13 +363,26 @@ impl<'a> Widget for Sound<'a> { // Ambience Volume Number Text::new(&format!( "{:2.0}%", - self.global_state.settings.audio.ambience_volume * 100.0 + self.global_state.settings.audio.ambience_volume.volume * 100.0 )) .right_from(state.ids.ambience_volume_slider, 8.0) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) .color(TEXT_COLOR) .set(state.ids.ambience_volume_number, ui); + // Ambience Volume Muted Indicator + let ambience_muted = ToggleButton::new( + self.global_state.settings.audio.ambience_volume.muted, + self.imgs.button_mute, + self.imgs.button_muted, + ) + .w_h(24.0, 25.0) + .down_from(state.ids.ambience_volume_text, 10.0) + .press_images(self.imgs.button_mute_hover, self.imgs.button_muted_hover) + .set(state.ids.ambience_volume_muted, ui); + if ambience_muted != self.global_state.settings.audio.ambience_volume.muted { + events.push(MuteAmbienceVolume(ambience_muted)); + } // Music spacing Text::new(&self.localized_strings.get_msg("hud-settings-music_spacing")) diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 4e3f8ae100..0f0e76cfef 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -230,10 +230,10 @@ fn main() { // AudioOutput::Device(ref dev) => Some(dev.clone()), }; - audio.set_master_volume(settings.audio.master_volume); - audio.set_music_volume(settings.audio.music_volume); - audio.set_sfx_volume(settings.audio.sfx_volume); - audio.set_ambience_volume(settings.audio.ambience_volume); + audio.set_master_volume(settings.audio.master_volume.get_checked()); + audio.set_music_volume(settings.audio.music_volume.get_checked()); + audio.set_sfx_volume(settings.audio.sfx_volume.get_checked()); + audio.set_ambience_volume(settings.audio.ambience_volume.get_checked()); audio.set_music_spacing(settings.audio.music_spacing); // Load the profile. diff --git a/voxygen/src/run.rs b/voxygen/src/run.rs index 64a09ecd09..472eb4bbcc 100644 --- a/voxygen/src/run.rs +++ b/voxygen/src/run.rs @@ -89,10 +89,14 @@ pub fn run(mut global_state: GlobalState, event_loop: EventLoop) { if let winit::event::WindowEvent::Focused(focused) = event { global_state.audio.set_master_volume(if focused { - global_state.settings.audio.master_volume + global_state.settings.audio.master_volume.get_checked() } else { - global_state.settings.audio.inactive_master_volume_perc - * global_state.settings.audio.master_volume + global_state + .settings + .audio + .inactive_master_volume_perc + .get_checked() + * global_state.settings.audio.master_volume.get_checked() }); } diff --git a/voxygen/src/session/settings_change.rs b/voxygen/src/session/settings_change.rs index 4c82431be8..56f413e996 100644 --- a/voxygen/src/session/settings_change.rs +++ b/voxygen/src/session/settings_change.rs @@ -8,8 +8,8 @@ use crate::{ }, render::RenderMode, settings::{ - AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings, GameplaySettings, - GraphicsSettings, InterfaceSettings, + audio::AudioVolume, AudioSettings, ChatSettings, ControlSettings, Fps, GamepadSettings, + GameplaySettings, GraphicsSettings, InterfaceSettings, }, window::FullScreenSettings, GlobalState, @@ -19,10 +19,15 @@ use i18n::{LanguageMetadata, LocalizationHandle}; #[derive(Clone)] pub enum Audio { AdjustMasterVolume(f32), + MuteMasterVolume(bool), AdjustInactiveMasterVolume(f32), + MuteInactiveMasterVolume(bool), AdjustMusicVolume(f32), + MuteMusicVolume(bool), AdjustSfxVolume(f32), + MuteSfxVolume(bool), AdjustAmbienceVolume(f32), + MuteAmbienceVolume(bool), AdjustMusicSpacing(f32), //ChangeAudioDevice(String), ResetAudioSettings, @@ -194,31 +199,73 @@ settings_change_from!(Networking); impl SettingsChange { pub fn process(self, global_state: &mut GlobalState, session_state: &mut SessionState) { let mut settings = &mut global_state.settings; + match self { SettingsChange::Audio(audio_change) => { + fn update_volume(audio: &mut AudioVolume, volume: f32) -> f32 { + audio.volume = volume; + audio.get_checked() + } + fn update_muted(audio: &mut AudioVolume, muted: bool) -> f32 { + audio.muted = muted; + audio.get_checked() + } + match audio_change { Audio::AdjustMasterVolume(master_volume) => { - global_state.audio.set_master_volume(master_volume); + let volume_checked = + update_volume(&mut settings.audio.master_volume, master_volume); - settings.audio.master_volume = master_volume; + global_state.audio.set_master_volume(volume_checked); + }, + Audio::MuteMasterVolume(master_muted) => { + let volume_checked = + update_muted(&mut settings.audio.master_volume, master_muted); + + global_state.audio.set_master_volume(volume_checked); }, Audio::AdjustInactiveMasterVolume(inactive_master_volume_perc) => { - settings.audio.inactive_master_volume_perc = inactive_master_volume_perc; + settings.audio.inactive_master_volume_perc.volume = + inactive_master_volume_perc; + }, + Audio::MuteInactiveMasterVolume(inactive_master_volume_muted) => { + settings.audio.inactive_master_volume_perc.muted = + inactive_master_volume_muted; }, Audio::AdjustMusicVolume(music_volume) => { - global_state.audio.set_music_volume(music_volume); + let volume_checked = + update_volume(&mut settings.audio.music_volume, music_volume); - settings.audio.music_volume = music_volume; + global_state.audio.set_music_volume(volume_checked); + }, + Audio::MuteMusicVolume(music_muted) => { + let volume_checked = + update_muted(&mut settings.audio.music_volume, music_muted); + + global_state.audio.set_music_volume(volume_checked); }, Audio::AdjustSfxVolume(sfx_volume) => { - global_state.audio.set_sfx_volume(sfx_volume); + let volume_checked = + update_volume(&mut settings.audio.sfx_volume, sfx_volume); - settings.audio.sfx_volume = sfx_volume; + global_state.audio.set_sfx_volume(volume_checked); + }, + Audio::MuteSfxVolume(sfx_muted) => { + let volume_checked = + update_muted(&mut settings.audio.sfx_volume, sfx_muted); + + global_state.audio.set_sfx_volume(volume_checked); }, Audio::AdjustAmbienceVolume(ambience_volume) => { global_state.audio.set_ambience_volume(ambience_volume); - settings.audio.ambience_volume = ambience_volume; + settings.audio.ambience_volume.volume = ambience_volume; + }, + Audio::MuteAmbienceVolume(ambience_muted) => { + let volume_checked = + update_muted(&mut settings.audio.ambience_volume, ambience_muted); + + global_state.audio.set_ambience_volume(volume_checked); }, Audio::AdjustMusicSpacing(multiplier) => { global_state.audio.set_music_spacing(multiplier); @@ -232,9 +279,14 @@ impl SettingsChange { //}, Audio::ResetAudioSettings => { settings.audio = AudioSettings::default(); - let audio = &settings.audio; - global_state.audio.set_music_volume(audio.music_volume); - global_state.audio.set_sfx_volume(audio.sfx_volume); + + let audio = &mut global_state.audio; + + // TODO: check if updating the master volume is necessary + // (it wasn't done before) + audio.set_master_volume(settings.audio.master_volume.get_checked()); + audio.set_music_volume(settings.audio.music_volume.get_checked()); + audio.set_sfx_volume(settings.audio.sfx_volume.get_checked()); }, } }, diff --git a/voxygen/src/settings/audio.rs b/voxygen/src/settings/audio.rs index 11758daa9f..7e43300b3a 100644 --- a/voxygen/src/settings/audio.rs +++ b/voxygen/src/settings/audio.rs @@ -15,17 +15,35 @@ pub enum AudioOutput { impl AudioOutput { pub fn is_enabled(&self) -> bool { !matches!(self, Self::Off) } } + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub struct AudioVolume { + pub volume: f32, + pub muted: bool, +} + +impl AudioVolume { + pub fn new(volume: f32, muted: bool) -> Self { Self { volume, muted } } + + pub fn get_checked(&self) -> f32 { + match self.muted { + true => 0.0, + false => self.volume, + } + } +} + /// `AudioSettings` controls the volume of different audio subsystems and which /// device is used. #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default)] pub struct AudioSettings { - pub master_volume: f32, + pub master_volume: AudioVolume, #[serde(rename = "inactive_master_volume")] - pub inactive_master_volume_perc: f32, - pub music_volume: f32, - pub sfx_volume: f32, - pub ambience_volume: f32, + pub inactive_master_volume_perc: AudioVolume, + pub music_volume: AudioVolume, + pub sfx_volume: AudioVolume, + pub ambience_volume: AudioVolume, pub num_sfx_channels: usize, pub num_ui_channels: usize, pub music_spacing: f32, @@ -37,11 +55,11 @@ pub struct AudioSettings { impl Default for AudioSettings { fn default() -> Self { Self { - master_volume: 1.0, - inactive_master_volume_perc: 0.5, - music_volume: 0.25, - sfx_volume: 0.6, - ambience_volume: 0.6, + master_volume: AudioVolume::new(1.0, false), + inactive_master_volume_perc: AudioVolume::new(0.5, false), + music_volume: AudioVolume::new(0.4, false), + sfx_volume: AudioVolume::new(0.6, false), + ambience_volume: AudioVolume::new(0.6, false), num_sfx_channels: 60, num_ui_channels: 10, music_spacing: 1.0,