From 898ebd930e0c5bb8b3f092d4c462bc38130adccf Mon Sep 17 00:00:00 2001 From: salmonik Date: Sat, 9 May 2026 17:14:39 +0200 Subject: Fix buffer underrun - pre-decode samples before playback --- src/audio.rs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/audio.rs') diff --git a/src/audio.rs b/src/audio.rs index 7218f84..386c041 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -197,6 +197,37 @@ fn audio_thread( Some(device_sample_rate as f64 / data.sample_rate as f64); } + // Pre-decode some samples before starting playback to prevent buffer underrun + let channels = data.channels as usize; + for _ in 0..50 { + match data.format.next_packet() { + Ok(packet) => { + match data.decoder.decode(&packet) { + Ok(decoded) => { + let spec = *decoded.spec(); + let mut sample_buf = + symphonia::core::audio::SampleBuffer::::new( + decoded.capacity() as u64, spec + ); + sample_buf.copy_interleaved_ref(decoded); + let samples = sample_buf.samples(); + + let resampled = if let Some(ratio) = data.resample_ratio { + resample_linear(samples, ratio, channels) + } else { + samples.to_vec() + }; + + data.sample_buffer.extend(resampled); + } + Err(_) => break, + } + } + Err(_) => break, + } + } + data.buffer_pos = 0; + let stream_config: cpal::StreamConfig = device.default_output_config().unwrap().into(); -- cgit v1.2.3