Due to a round-off error, snd_pcm_avail could in some cases return 0 even though more data could be written to the stream.
This was discovered by Maarten Lankhorst [1], and there is also a test program available that triggers this error [2].
[1] https://tango.0pointer.de/pipermail/pulseaudio-discuss/2011-April/009935.html
[2] https://tango.0pointer.de/pipermail/pulseaudio-discuss/attachments/20110420/3c852d6e/attachment.c
-- David Henningsson, Canonical Ltd. http://launchpad.net/~diwic
>From 73ff6f83e1e4c53181e1794bf2cec3baee7c81b7 Mon Sep 17 00:00:00 2001 From: David Henningsson <david.hennings...@canonical.com> Date: Thu, 21 Apr 2011 15:10:19 +0200 Subject: [PATCH] Pulse: Fix snd_pcm_avail returning 0 in some cases Due to a round-off error, snd_pcm_avail could in some cases return 0 even though more data could be written to the stream. Reported-by: Maarten Lankhorst <m.b.lankho...@gmail.com> Signed-off-by: David Henningsson <david.hennings...@canonical.com> --- pulse/pcm_pulse.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c index 2df0a80..9105d4d 100644 --- a/pulse/pcm_pulse.c +++ b/pulse/pcm_pulse.c @@ -92,8 +92,8 @@ static int update_ptr(snd_pcm_pulse_t *pcm) size -= pcm->offset; /* Prevent accidental overrun of the fake ringbuffer */ - if (size >= pcm->buffer_attr.tlength) - size = pcm->buffer_attr.tlength-1; + if (size > pcm->buffer_attr.tlength - pcm->frame_size) + size = pcm->buffer_attr.tlength - pcm->frame_size; if (size > pcm->last_size) { pcm->ptr += size - pcm->last_size; -- 1.7.4.1
_______________________________________________ pulseaudio-discuss mailing list pulseaudio-discuss@mail.0pointer.de https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss