diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-10-11 01:30:48 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-10-11 01:30:48 +0200 |
| commit | d0a82ae5ef6b47c3b973d16d3be6b7d89bc2826f (patch) | |
| tree | e5041814fbf3549a20084be2ef4b1bf887bca169 /mumd/src/network.rs | |
| parent | fd8a9f28b036315c0ade03a6df2999305807021d (diff) | |
| download | mum-d0a82ae5ef6b47c3b973d16d3be6b7d89bc2826f.tar.gz | |
working microphone stuff
Co-authored-by: Eskil Queseth <eskilq@kth.se>
Diffstat (limited to 'mumd/src/network.rs')
| -rw-r--r-- | mumd/src/network.rs | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/mumd/src/network.rs b/mumd/src/network.rs index c59754d..875463c 100644 --- a/mumd/src/network.rs +++ b/mumd/src/network.rs @@ -1,15 +1,15 @@ use crate::audio::Audio; use bytes::Bytes; -use futures::SinkExt; -use futures::StreamExt; use futures::channel::oneshot; use futures::join; +use futures::SinkExt; +use futures::StreamExt; use futures_util::stream::{SplitSink, SplitStream}; +use mumble_protocol::control::msgs; use mumble_protocol::control::ClientControlCodec; use mumble_protocol::control::ControlCodec; use mumble_protocol::control::ControlPacket; -use mumble_protocol::control::msgs; use mumble_protocol::crypt::ClientCryptState; use mumble_protocol::voice::VoicePacket; use mumble_protocol::voice::VoicePacketPayload; @@ -217,17 +217,6 @@ async fn listen_udp( .. } => { audio.lock().unwrap().decode_packet(session_id, payload); - - // Got audio, naively echo it back - //let reply = VoicePacket::Audio { - // _dst: std::marker::PhantomData, - // target: 0, // normal speech - // session_id: (), // unused for server-bound packets - // seq_num, - // payload, - // position_info, - //}; - //sink.send((reply, src_addr)).await.unwrap(); } } } @@ -249,6 +238,32 @@ async fn send_ping_udp(sink: &mut UdpSender, server_addr: SocketAddr) { .unwrap(); } +async fn send_voice_udp( + sink: Arc<Mutex<UdpSender>>, + server_addr: SocketAddr, + audio: Arc<Mutex<Audio>>, +) { + let mut receiver = audio.lock().unwrap().take_receiver().unwrap(); + + let mut count = 0; + while let Some(payload) = receiver.recv().await { + let reply = VoicePacket::Audio { + _dst: std::marker::PhantomData, + target: 0, // normal speech + session_id: (), // unused for server-bound packets + seq_num: count, + payload, + position_info: None, + }; + count += 1; + sink.lock() + .unwrap() + .send((reply, server_addr)) + .await + .unwrap(); + } +} + pub async fn handle_udp( server_addr: SocketAddr, crypt_state: oneshot::Receiver<ClientCryptState>, @@ -261,5 +276,9 @@ pub async fn handle_udp( // dummy voice packet. send_ping_udp(&mut sink, server_addr).await; - listen_udp(Arc::new(Mutex::new(sink)), source, audio).await; + let sink = Arc::new(Mutex::new(sink)); + join!( + listen_udp(Arc::clone(&sink), source, Arc::clone(&audio)), + send_voice_udp(sink, server_addr, audio) + ); } |
