From edbb4ce1b41701322ebe0f534cb2558111d180c5 Mon Sep 17 00:00:00 2001 From: Henrik Enquist Date: Sun, 5 Jan 2025 00:07:09 +0100 Subject: [PATCH] Use avail instead of delay to avoid glitches --- src/alsadevice.rs | 13 ++++++------- src/alsadevice_buffermanager.rs | 10 ++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/alsadevice.rs b/src/alsadevice.rs index 5660fa6..bf30dd1 100644 --- a/src/alsadevice.rs +++ b/src/alsadevice.rs @@ -520,14 +520,14 @@ fn playback_loop_bytes( match msg { Ok(AudioMessage::Audio(chunk)) => { // measure delay only on running non-stalled device - let delay_at_chunk_recvd = if !device_stalled + let avail_at_chunk_recvd = if !device_stalled && pcmdevice.state_raw() == alsa_sys::SND_PCM_STATE_RUNNING as i32 { - pcmdevice.status().ok().map(|status| status.get_delay()) + pcmdevice.avail().ok() } else { None }; - //trace!("PB: Delay at chunk rcvd: {:?}", delay_at_chunk_recvd); + //trace!("PB: Avail at chunk rcvd: {:?}", avail_at_chunk_recvd); conversion_result = chunk_to_buffer_rawbytes(&chunk, &mut buffer, ¶ms.sample_format); @@ -602,10 +602,9 @@ fn playback_loop_bytes( } else { xtrace!("playback status blocked, skip update"); } - if let Some(delay) = delay_at_chunk_recvd { - if delay != 0 { - buffer_avg.add_value(delay as f64); - } + if let Some(avail) = avail_at_chunk_recvd { + let delay = buf_manager.current_delay(avail); + buffer_avg.add_value(delay as f64); } if timer.larger_than_millis((1000.0 * params.adjust_period) as u64) { if let Some(avg_delay) = buffer_avg.average() { diff --git a/src/alsadevice_buffermanager.rs b/src/alsadevice_buffermanager.rs index 4534b18..fd61aef 100644 --- a/src/alsadevice_buffermanager.rs +++ b/src/alsadevice_buffermanager.rs @@ -125,6 +125,8 @@ pub trait DeviceBufferManager { // +1 to make sure the device really stalls data.bufsize - data.avail_min + 1 } + + fn current_delay(&self, avail: Frames) -> Frames; } #[derive(Debug)] @@ -182,6 +184,10 @@ impl DeviceBufferManager for CaptureBufferManager { self.data.threshold = threshold; Ok(()) } + + fn current_delay(&self, avail: Frames) -> Frames { + avail + } } #[derive(Debug)] @@ -233,4 +239,8 @@ impl DeviceBufferManager for PlaybackBufferManager { self.data.threshold = threshold; Ok(()) } + + fn current_delay(&self, avail: Frames) -> Frames { + self.data.bufsize - avail + } }