aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/audio.rs
diff options
context:
space:
mode:
authorEskil <eskilq@kth.se>2020-11-03 22:02:32 +0100
committerEskil <eskilq@kth.se>2020-11-03 22:02:32 +0100
commitd6496cb0f6abba855b04338fa8bc5aaa89487c29 (patch)
tree929f5c18babe5bc27676c88aae6b9d3795b09917 /mumd/src/audio.rs
parent831182b69eb1bbfedfad1288b73a822241f18d25 (diff)
parent972c11fe66c17728981ec57796c78fb70c7bd180 (diff)
downloadmum-d6496cb0f6abba855b04338fa8bc5aaa89487c29.tar.gz
Merge branch 'audio-volume' into 'main'
Refactor of config and add support for changing global output volume and individual user's volume See merge request gustav/mum!28
Diffstat (limited to 'mumd/src/audio.rs')
-rw-r--r--mumd/src/audio.rs41
1 files changed, 35 insertions, 6 deletions
diff --git a/mumd/src/audio.rs b/mumd/src/audio.rs
index ad4a762..9f837f7 100644
--- a/mumd/src/audio.rs
+++ b/mumd/src/audio.rs
@@ -19,6 +19,10 @@ pub struct Audio {
input_channel_receiver: Option<mpsc::Receiver<VoicePacketPayload>>,
input_volume_sender: watch::Sender<f32>,
+ output_volume_sender: watch::Sender<f32>,
+
+ user_volumes: Arc<Mutex<HashMap<u32, f32>>>,
+
client_streams: Arc<Mutex<HashMap<u32, output::ClientStream>>>,
}
@@ -65,21 +69,36 @@ impl Audio {
let err_fn = |err| error!("An error occurred on the output audio stream: {}", err);
+ let user_volumes = Arc::new(Mutex::new(HashMap::new()));
+ let (output_volume_sender, output_volume_receiver) = watch::channel::<f32>(1.0);
+
let client_streams = Arc::new(Mutex::new(HashMap::new()));
let output_stream = match output_supported_sample_format {
SampleFormat::F32 => output_device.build_output_stream(
&output_config,
- output::curry_callback::<f32>(Arc::clone(&client_streams)),
+ output::curry_callback::<f32>(
+ Arc::clone(&client_streams),
+ output_volume_receiver,
+ Arc::clone(&user_volumes),
+ ),
err_fn,
),
SampleFormat::I16 => output_device.build_output_stream(
&output_config,
- output::curry_callback::<i16>(Arc::clone(&client_streams)),
+ output::curry_callback::<i16>(
+ Arc::clone(&client_streams),
+ output_volume_receiver,
+ Arc::clone(&user_volumes),
+ ),
err_fn,
),
SampleFormat::U16 => output_device.build_output_stream(
&output_config,
- output::curry_callback::<u16>(Arc::clone(&client_streams)),
+ output::curry_callback::<u16>(
+ Arc::clone(&client_streams),
+ output_volume_receiver,
+ Arc::clone(&user_volumes),
+ ),
err_fn,
),
}
@@ -109,7 +128,7 @@ impl Audio {
input_encoder,
input_sender,
input_config.sample_rate.0,
- input_volume_receiver.clone(),
+ input_volume_receiver,
4, // 10 ms
),
err_fn,
@@ -120,7 +139,7 @@ impl Audio {
input_encoder,
input_sender,
input_config.sample_rate.0,
- input_volume_receiver.clone(),
+ input_volume_receiver,
4, // 10 ms
),
err_fn,
@@ -131,7 +150,7 @@ impl Audio {
input_encoder,
input_sender,
input_config.sample_rate.0,
- input_volume_receiver.clone(),
+ input_volume_receiver,
4, // 10 ms
),
err_fn,
@@ -148,6 +167,8 @@ impl Audio {
input_volume_sender,
input_channel_receiver: Some(input_receiver),
client_streams,
+ output_volume_sender,
+ user_volumes,
}
}
@@ -203,4 +224,12 @@ impl Audio {
pub fn set_input_volume(&self, input_volume: f32) {
self.input_volume_sender.broadcast(input_volume).unwrap();
}
+
+ pub fn set_output_volume(&self, output_volume: f32) {
+ self.output_volume_sender.broadcast(output_volume).unwrap();
+ }
+
+ pub fn set_user_volume(&self, id: u32, volume: f32) {
+ self.user_volumes.lock().unwrap().insert(id, volume);
+ }
}