diff options
| author | Eskil Queseth <eskilq@kth.se> | 2020-11-03 22:13:37 +0100 |
|---|---|---|
| committer | Eskil Queseth <eskilq@kth.se> | 2020-11-03 22:13:37 +0100 |
| commit | 4dd73f7b837572211b71483d62bbdfb1227d2aee (patch) | |
| tree | b0ae8e001e1ada802a95fd1a2fc2b59272f45f27 /mumd/src/audio | |
| parent | 71941137265669013ef64473748c4fde6bc48f1c (diff) | |
| parent | d6496cb0f6abba855b04338fa8bc5aaa89487c29 (diff) | |
| download | mum-4dd73f7b837572211b71483d62bbdfb1227d2aee.tar.gz | |
Merge branch 'main' into mute
Diffstat (limited to 'mumd/src/audio')
| -rw-r--r-- | mumd/src/audio/output.rs | 10 |
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), )); } } |
