From b583f6dbe521e01e879e16605026997dfa10c3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Tue, 13 Oct 2020 02:31:09 +0200 Subject: join different channels Co-authored-by: Eskil Queseth --- mumd/src/network/udp.rs | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'mumd/src/network/udp.rs') diff --git a/mumd/src/network/udp.rs b/mumd/src/network/udp.rs index 39f16b6..5f76501 100644 --- a/mumd/src/network/udp.rs +++ b/mumd/src/network/udp.rs @@ -1,4 +1,4 @@ -use crate::audio::Audio; +use crate::state::State; use log::*; use bytes::Bytes; @@ -36,10 +36,28 @@ pub async fn connect( UdpFramed::new(udp_socket, crypt_state).split() } +pub async fn handle( + state: Arc>, + server_addr: SocketAddr, + crypt_state: oneshot::Receiver, +) { + let (mut sink, source) = connect(crypt_state).await; + + // Note: A normal application would also send periodic Ping packets, and its own audio + // via UDP. We instead trick the server into accepting us by sending it one + // dummy voice packet. + send_ping(&mut sink, server_addr).await; + + let sink = Arc::new(Mutex::new(sink)); + join!( + listen(Arc::clone(&state), source), + send_voice(state, sink, server_addr) + ); +} + async fn listen( - _sink: Arc>, + state: Arc>, mut source: UdpReceiver, - audio: Arc>, ) { while let Some(packet) = source.next().await { let (packet, _src_addr) = match packet { @@ -63,7 +81,7 @@ async fn listen( // position_info, .. } => { - audio.lock().unwrap().decode_packet(session_id, payload); + state.lock().unwrap().audio().decode_packet(session_id, payload); } } } @@ -86,11 +104,11 @@ async fn send_ping(sink: &mut UdpSender, server_addr: SocketAddr) { } async fn send_voice( + state: Arc>, sink: Arc>, server_addr: SocketAddr, - audio: Arc>, ) { - let mut receiver = audio.lock().unwrap().take_receiver().unwrap(); + let mut receiver = state.lock().unwrap().audio_mut().take_receiver().unwrap(); let mut count = 0; while let Some(payload) = receiver.recv().await { @@ -111,21 +129,3 @@ async fn send_voice( } } -pub async fn handle( - server_addr: SocketAddr, - crypt_state: oneshot::Receiver, - audio: Arc>, -) { - let (mut sink, source) = connect(crypt_state).await; - - // Note: A normal application would also send periodic Ping packets, and its own audio - // via UDP. We instead trick the server into accepting us by sending it one - // dummy voice packet. - send_ping(&mut sink, server_addr).await; - - let sink = Arc::new(Mutex::new(sink)); - join!( - listen(Arc::clone(&sink), source, Arc::clone(&audio)), - send_voice(sink, server_addr, audio) - ); -} -- cgit v1.2.1