@@ -7,10 +7,13 @@ use tokio_util::{codec::LengthDelimitedCodec, udp::UdpFramed};
77
88use crate :: {
99 config:: ConnectionMode ,
10- streamer:: { AudioPacketMessage , WriteError } ,
10+ streamer:: {
11+ AudioPacketMessage , CHECK_2 , WriteError ,
12+ message:: { MessageWrapper , message_wrapper:: Payload } ,
13+ } ,
1114} ;
1215
13- use super :: { AudioPacketMessageOrdered , AudioStream , ConnectError , StreamerMsg , StreamerTrait } ;
16+ use super :: { AudioStream , ConnectError , StreamerMsg , StreamerTrait } ;
1417
1518const MAX_WAIT_TIME : Duration = Duration :: from_millis ( 1500 ) ;
1619
@@ -25,10 +28,14 @@ pub struct UdpStreamer {
2528 tracked_sequence : u32 ,
2629}
2730
28- pub async fn new ( ip : IpAddr , port : u16 , stream_config : AudioStream ) -> Result < UdpStreamer , ConnectError > {
31+ pub async fn new (
32+ ip : IpAddr ,
33+ port : u16 ,
34+ stream_config : AudioStream ,
35+ ) -> Result < UdpStreamer , ConnectError > {
2936 let socket = UdpSocket :: bind ( ( ip, port) )
3037 . await
31- . map_err ( ConnectError :: CantBindPort ) ?;
38+ . map_err ( |e| ConnectError :: CantBindPort ( port , e ) ) ?;
3239
3340 let addr = socket. local_addr ( ) . map_err ( ConnectError :: NoLocalAddress ) ?;
3441
@@ -66,48 +73,77 @@ impl StreamerTrait for UdpStreamer {
6673
6774 async fn next ( & mut self ) -> Result < Option < StreamerMsg > , ConnectError > {
6875 match tokio:: time:: timeout (
69- Duration :: from_secs ( if self . is_listening { Duration :: MAX . as_secs ( ) } else { 1 } ) ,
76+ Duration :: from_secs ( if self . is_listening {
77+ Duration :: MAX . as_secs ( )
78+ } else {
79+ 1
80+ } ) ,
7081 self . framed . next ( ) ,
7182 )
7283 . await
7384 {
7485 Ok ( res) => match res {
7586 Some ( Ok ( ( frame, addr) ) ) => {
76- match AudioPacketMessageOrdered :: decode ( frame) {
87+ match MessageWrapper :: decode ( frame) {
7788 Ok ( packet) => {
78- if self . is_listening {
79- self . is_listening = false ;
80- return Ok ( Some ( StreamerMsg :: Connected {
81- ip : Some ( self . ip ) ,
82- port : Some ( self . port ) ,
83- mode : ConnectionMode :: Udp ,
84- } ) ) ;
85- }
86-
87- if packet. sequence_number < self . tracked_sequence {
88- // drop packet
89- info ! (
90- "dropped packet: old sequence number {} < {}" ,
91- packet. sequence_number, self . tracked_sequence
92- ) ;
93- }
94- self . tracked_sequence = packet. sequence_number ;
95-
96- let packet = packet. audio_packet . unwrap ( ) ;
97- let buffer_size = packet. buffer . len ( ) ;
98- let sample_rate = packet. sample_rate ;
99-
100- match self . stream_config . process_audio_packet ( packet) {
101- Ok ( Some ( buffer) ) => {
102- debug ! ( "From {:?}, received {} bytes" , addr, buffer_size) ;
103- Ok ( Some ( StreamerMsg :: UpdateAudioWave {
104- data : AudioPacketMessage :: to_wave_data (
105- & buffer,
106- sample_rate,
107- ) ,
108- } ) )
89+ match packet. payload {
90+ Some ( payload) => {
91+ let message = match payload {
92+ Payload :: AudioPacket ( packet) => {
93+ if packet. sequence_number < self . tracked_sequence {
94+ // drop packet
95+ info ! (
96+ "dropped packet: old sequence number {} < {}" ,
97+ packet. sequence_number, self . tracked_sequence
98+ ) ;
99+ }
100+ self . tracked_sequence = packet. sequence_number ;
101+
102+ let packet = packet. audio_packet . unwrap ( ) ;
103+ let buffer_size = packet. buffer . len ( ) ;
104+ let sample_rate = packet. sample_rate ;
105+
106+ match self . stream_config . process_audio_packet ( packet) {
107+ Ok ( Some ( buffer) ) => {
108+ debug ! (
109+ "From {:?}, received {} bytes" ,
110+ addr, buffer_size
111+ ) ;
112+ Some ( StreamerMsg :: UpdateAudioWave {
113+ data : AudioPacketMessage :: to_wave_data (
114+ & buffer,
115+ sample_rate,
116+ ) ,
117+ } )
118+ }
119+ _ => None ,
120+ }
121+ }
122+ Payload :: Connect ( _) => {
123+ self . framed
124+ . get_ref ( )
125+ . send_to ( CHECK_2 . as_bytes ( ) , & addr)
126+ . await
127+ . map_err ( |e| {
128+ ConnectError :: HandShakeFailed ( "writing" , e)
129+ } ) ?;
130+
131+ None
132+ }
133+ } ;
134+
135+ if self . is_listening {
136+ self . is_listening = false ;
137+ Ok ( Some ( StreamerMsg :: Connected {
138+ ip : Some ( self . ip ) ,
139+ port : Some ( self . port ) ,
140+ mode : ConnectionMode :: Udp ,
141+ } ) )
142+ } else {
143+ Ok ( message)
144+ }
109145 }
110- _ => Ok ( None ) ,
146+ None => todo ! ( ) ,
111147 }
112148 }
113149 Err ( e) => Err ( ConnectError :: WriteError ( WriteError :: Deserializer ( e) ) ) ,
0 commit comments