@@ -73,6 +73,8 @@ pub fn process_audio<F>(data: &mut [F], consumer: &mut Consumer<u8>, frame_bytes
7373where
7474 F : cpal:: SizedSample + AudioBytes ,
7575{
76+ data. fill ( F :: from_f32 ( 0.0 ) ) ;
77+
7678 let frame_size = std:: mem:: size_of :: < F > ( ) ;
7779
7880 let byte_len = std:: mem:: size_of_val ( data) ;
@@ -143,3 +145,38 @@ where
143145 None ,
144146 )
145147}
148+
149+ #[ cfg( test) ]
150+ mod tests {
151+ use std:: io:: Write ;
152+
153+ use rtrb:: RingBuffer ;
154+
155+ use super :: * ;
156+
157+ fn i16_samples_to_bytes ( samples : & [ i16 ] ) -> Vec < u8 > {
158+ samples. iter ( ) . flat_map ( AudioBytes :: to_bytes) . collect ( )
159+ }
160+
161+ #[ test]
162+ fn process_audio_silences_output_when_buffer_is_empty ( ) {
163+ let ( _producer, mut consumer) = RingBuffer :: < u8 > :: new ( 16 ) ;
164+ let mut output = [ 123_i16 , -456 , 789 , -111 ] ;
165+
166+ process_audio ( & mut output, & mut consumer, std:: mem:: size_of :: < i16 > ( ) ) ;
167+
168+ assert_eq ! ( output, [ 0 ; 4 ] ) ;
169+ }
170+
171+ #[ test]
172+ fn process_audio_zero_fills_after_partial_read ( ) {
173+ let ( mut producer, mut consumer) = RingBuffer :: < u8 > :: new ( 16 ) ;
174+ let input = i16_samples_to_bytes ( & [ 1000 , -2000 ] ) ;
175+ producer. write_all ( & input) . unwrap ( ) ;
176+
177+ let mut output = [ 55_i16 , 55 , 55 , 55 ] ;
178+ process_audio ( & mut output, & mut consumer, std:: mem:: size_of :: < i16 > ( ) ) ;
179+
180+ assert_eq ! ( output, [ 1000 , -2000 , 0 , 0 ] ) ;
181+ }
182+ }
0 commit comments