aboutsummaryrefslogtreecommitdiffstats
path: root/mumd
diff options
context:
space:
mode:
Diffstat (limited to 'mumd')
-rw-r--r--mumd/Cargo.toml2
-rw-r--r--mumd/src/audio.rs11
-rw-r--r--mumd/src/network/udp.rs5
-rw-r--r--mumd/src/state.rs2
-rw-r--r--mumd/src/state/user.rs65
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
+ }
+}