Skip to content

Commit 6495f3f

Browse files
authored
Merge pull request #152 from failuresmith/codex/clear-stale-output-samples-on-underrun
[codex] Clear stale output samples on underrun
2 parents 8d1e4da + 929bbd2 commit 6495f3f

1 file changed

Lines changed: 37 additions & 0 deletions

File tree

RustApp/src/audio/player.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ pub fn process_audio<F>(data: &mut [F], consumer: &mut Consumer<u8>, frame_bytes
7373
where
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

Comments
 (0)