From 1d605c2dc8f2b46f51b149e8e0755441889db1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Sun, 18 Apr 2021 19:28:28 +0100 Subject: [PATCH] Voxygen: Update ambient channels volume --- voxygen/src/audio/channel.rs | 14 +++++++++++--- voxygen/src/audio/mod.rs | 24 ++++++++++++++++-------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/voxygen/src/audio/channel.rs b/voxygen/src/audio/channel.rs index 65e1d79099..97a2bddcca 100644 --- a/voxygen/src/audio/channel.rs +++ b/voxygen/src/audio/channel.rs @@ -165,18 +165,24 @@ pub enum AmbientChannelTag { /// which are always heard at the camera's position. pub struct AmbientChannel { tag: AmbientChannelTag, + multiplier: f32, sink: Sink, } impl AmbientChannel { - pub fn new(stream: &OutputStreamHandle, tag: AmbientChannelTag) -> Self { + pub fn new(stream: &OutputStreamHandle, tag: AmbientChannelTag, multiplier: f32) -> Self { let new_sink = Sink::try_new(stream); match new_sink { - Ok(sink) => Self { tag, sink }, + Ok(sink) => Self { + tag, + multiplier, + sink, + }, Err(_) => { warn!("Failed to create rodio sink. May not play wind sounds."); Self { tag, + multiplier, sink: Sink::new_idle().0, } }, @@ -195,7 +201,9 @@ impl AmbientChannel { pub fn stop(&mut self) { self.sink.stop(); } - pub fn set_volume(&mut self, volume: f32) { self.sink.set_volume(volume); } + pub fn set_volume(&mut self, volume: f32) { self.sink.set_volume(volume * self.multiplier); } + + pub fn set_multiplier(&mut self, multiplier: f32) { self.multiplier = multiplier; } pub fn get_volume(&mut self) -> f32 { self.sink.volume() } diff --git a/voxygen/src/audio/mod.rs b/voxygen/src/audio/mod.rs index ce0d3fd761..ac93170c00 100644 --- a/voxygen/src/audio/mod.rs +++ b/voxygen/src/audio/mod.rs @@ -308,14 +308,16 @@ impl AudioFrontend { ) -> Option<&mut AmbientChannel> { if let Some(audio_stream) = &self.audio_stream { if self.ambient_channels.is_empty() { - let mut ambient_channel = AmbientChannel::new(audio_stream, channel_tag); - ambient_channel.set_volume(self.get_sfx_volume() * volume_multiplier); + let mut ambient_channel = + AmbientChannel::new(audio_stream, channel_tag, volume_multiplier); + ambient_channel.set_volume(self.get_sfx_volume()); self.ambient_channels.push(ambient_channel); } else { let sfx_volume = self.get_sfx_volume(); for channel in self.ambient_channels.iter_mut() { if channel.get_tag() == channel_tag { - channel.set_volume(sfx_volume * volume_multiplier); + channel.set_multiplier(volume_multiplier); + channel.set_volume(sfx_volume); return Some(channel); } } @@ -329,7 +331,8 @@ impl AudioFrontend { if self.audio_stream.is_some() { let sfx_volume = self.get_sfx_volume(); if let Some(channel) = self.ambient_channels.iter_mut().last() { - channel.set_volume(sfx_volume * volume_multiplier); + channel.set_multiplier(volume_multiplier); + channel.set_volume(sfx_volume); } } } @@ -416,10 +419,7 @@ impl AudioFrontend { pub fn set_sfx_volume(&mut self, sfx_volume: f32) { self.sfx_volume = sfx_volume; - let sfx_volume = self.get_sfx_volume(); - for channel in self.sfx_channels.iter_mut() { - channel.set_volume(sfx_volume); - } + self.update_sfx_volumes(); } pub fn set_music_volume(&mut self, music_volume: f32) { @@ -439,10 +439,18 @@ impl AudioFrontend { channel.set_volume(music_volume); } + self.update_sfx_volumes(); + } + + fn update_sfx_volumes(&mut self) { let sfx_volume = self.get_sfx_volume(); for channel in self.sfx_channels.iter_mut() { channel.set_volume(sfx_volume); } + + for channel in self.ambient_channels.iter_mut() { + channel.set_volume(sfx_volume); + } } pub fn stop_ambient_sounds(&mut self) {