diff options
Diffstat (limited to 'mumd')
| -rw-r--r-- | mumd/Cargo.toml | 2 | ||||
| -rw-r--r-- | mumd/src/audio.rs | 11 | ||||
| -rw-r--r-- | mumd/src/network/udp.rs | 5 | ||||
| -rw-r--r-- | mumd/src/state.rs | 2 | ||||
| -rw-r--r-- | mumd/src/state/user.rs | 65 |
5 files changed, 76 insertions, 9 deletions
diff --git a/mumd/Cargo.toml b/mumd/Cargo.toml index ba0f5a0..39b9d26 100644 --- a/mumd/Cargo.toml +++ b/mumd/Cargo.toml @@ -26,7 +26,7 @@ futures-util = "0.3" hound = "3.4" ipc-channel = "0.14" log = "0.4" -mumble-protocol = "0.3" +mumble-protocol = "0.3.1" native-tls = "0.2" openssl = { version = "0.10" } opus = "0.2" diff --git a/mumd/src/audio.rs b/mumd/src/audio.rs index 812bb4c..8f9e2ab 100644 --- a/mumd/src/audio.rs +++ b/mumd/src/audio.rs @@ -231,12 +231,19 @@ impl Audio { .map(|e| cpal::Sample::to_f32(&e.unwrap())) .collect::<Vec<_>>(), }; - let mut signal = signal::from_iter(samples.iter().cloned()); + let iter: Box<dyn Iterator<Item = f32>> = match spec.channels { + 1 => Box::new(samples.into_iter().flat_map(|e| vec![e, e])), + 2 => Box::new(samples.into_iter()), + _ => unimplemented!() // TODO handle gracefully (this might not even happen) + }; + let mut signal = signal::from_interleaved_samples_iter::<_, [f32; 2]>(iter); let interp = Linear::new(signal.next(), signal.next()); let samples = signal .from_hz_to_hz(interp, spec.sample_rate as f64, SAMPLE_RATE as f64) .until_exhausted() - .collect::<Vec<_>>(); + // if the source audio is stereo and is being played as mono, discard the right audio + .flat_map(|e| if output_config.channels == 1 { vec![e[0]] } else { e.to_vec() }) + .collect::<Vec<f32>>(); (*event, samples) }) .collect(); diff --git a/mumd/src/network/udp.rs b/mumd/src/network/udp.rs index b303f8c..b1c202a 100644 --- a/mumd/src/network/udp.rs +++ b/mumd/src/network/udp.rs @@ -283,10 +283,7 @@ pub async fn handle_pings( while let Ok(read) = receiver.recv(&mut buf).await { assert_eq!(read, 24); - let packet = match PongPacket::try_from(buf.as_slice()) { - Ok(v) => v, - Err(_) => panic!(), - }; + let packet = PongPacket::try_from(buf.as_slice()).unwrap(); if let Some(handler) = pending.lock().unwrap().remove(&packet.id) { handler(packet); diff --git a/mumd/src/state.rs b/mumd/src/state.rs index 7a4704a..aba0931 100644 --- a/mumd/src/state.rs +++ b/mumd/src/state.rs @@ -16,7 +16,7 @@ use mumble_protocol::voice::Serverbound; use mumlib::command::{Command, CommandResponse}; use mumlib::config::Config; use mumlib::error::{ChannelIdentifierError, Error}; -use mumlib::state::UserDiff; +use crate::state::user::UserDiff; use std::net::{SocketAddr, ToSocketAddrs}; use tokio::sync::{mpsc, watch}; diff --git a/mumd/src/state/user.rs b/mumd/src/state/user.rs index 913f91b..5770bca 100644 --- a/mumd/src/state/user.rs +++ b/mumd/src/state/user.rs @@ -78,7 +78,7 @@ impl User { } } - pub fn apply_user_diff(&mut self, diff: &mumlib::state::UserDiff) { + pub fn apply_user_diff(&mut self, diff: &crate::state::user::UserDiff) { if let Some(comment) = diff.comment.clone() { self.comment = Some(comment); } @@ -155,3 +155,66 @@ impl From<&User> for mumlib::state::User { } } } + +#[derive(Debug, Default)] +pub struct UserDiff { + pub comment: Option<String>, + pub hash: Option<String>, + pub name: Option<String>, + pub priority_speaker: Option<bool>, + pub recording: Option<bool>, + + pub suppress: Option<bool>, // by me + pub self_mute: Option<bool>, // by self + pub self_deaf: Option<bool>, // by self + pub mute: Option<bool>, // by admin + pub deaf: Option<bool>, // by admin + + pub channel_id: Option<u32>, +} + +impl UserDiff { + pub fn new() -> Self { + UserDiff::default() + } +} + +impl From<msgs::UserState> for UserDiff { + fn from(mut msg: msgs::UserState) -> Self { + let mut ud = UserDiff::new(); + if msg.has_comment() { + ud.comment = Some(msg.take_comment()); + } + if msg.has_hash() { + ud.hash = Some(msg.take_hash()); + } + if msg.has_name() { + ud.name = Some(msg.take_name()); + } + if msg.has_priority_speaker() { + ud.priority_speaker = Some(msg.get_priority_speaker()); + } + if msg.has_recording() { + ud.recording = Some(msg.get_recording()); + } + if msg.has_suppress() { + ud.suppress = Some(msg.get_suppress()); + } + if msg.has_self_mute() { + ud.self_mute = Some(msg.get_self_mute()); + } + if msg.has_self_deaf() { + ud.self_deaf = Some(msg.get_self_deaf()); + } + if msg.has_mute() { + ud.mute = Some(msg.get_mute()); + } + if msg.has_deaf() { + ud.deaf = Some(msg.get_deaf()); + } + if msg.has_channel_id() { + ud.channel_id = Some(msg.get_channel_id()); + } + ud + } +} |
