aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/audio/output.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/output.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/output.rs')
-rw-r--r--mumd/src/audio/output.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/mumd/src/audio/output.rs b/mumd/src/audio/output.rs
index 94e4b21..56da596 100644
--- a/mumd/src/audio/output.rs
+++ b/mumd/src/audio/output.rs
@@ -4,6 +4,7 @@ use opus::Channels;
use std::collections::{HashMap, VecDeque};
use std::ops::AddAssign;
use std::sync::{Arc, Mutex};
+use tokio::sync::watch;
pub struct ClientStream {
buffer: VecDeque<f32>, //TODO ring buffer?
@@ -72,17 +73,22 @@ impl SaturatingAdd for u16 {
pub fn curry_callback<T: Sample + AddAssign + SaturatingAdd>(
buf: Arc<Mutex<HashMap<u32, ClientStream>>>,
+ output_volume_receiver: watch::Receiver<f32>,
+ user_volumes: Arc<Mutex<HashMap<u32, f32>>>,
) -> impl FnMut(&mut [T], &OutputCallbackInfo) + Send + 'static {
move |data: &mut [T], _info: &OutputCallbackInfo| {
for sample in data.iter_mut() {
*sample = Sample::from(&0.0);
}
+ let volume = *output_volume_receiver.borrow();
+
let mut lock = buf.lock().unwrap();
- for client_stream in lock.values_mut() {
+ for (id, client_stream) in &mut *lock {
+ let user_volume = user_volumes.lock().unwrap().get(id).cloned().unwrap_or(1.0);
for sample in data.iter_mut() {
*sample = sample.saturating_add(Sample::from(
- &client_stream.buffer.pop_front().unwrap_or(0.0),
+ &(client_stream.buffer.pop_front().unwrap_or(0.0) * volume * user_volume),
));
}
}