[alsa-devel] [PATCH] alsa-plugins: Pulse: only underrun if no more data has been written
David Henningsson
david.henningsson at canonical.com
Tue Aug 23 13:56:58 CEST 2011
Behold the third version of the patch.
On 08/19/2011 02:46 PM, Takashi Iwai wrote:
> At Fri, 19 Aug 2011 11:49:25 +0200,
> David Henningsson wrote:
>>
>> > From 8098c77a447a80d2860588387d18b3aa6d23b6bb Mon Sep 17 00:00:00 2001
>> From: David Henningsson<david.henningsson at canonical.com>
>> Date: Fri, 19 Aug 2011 11:47:07 +0200
>> Subject: [PATCH] alsa-plugins: Pulse: only underrun if no more data has been
>> written
>>
>> If more data has already been written after the underrun, the underrun
>> will automatically end and therefore we should not report it or
>> restart the stream.
>>
>> Signed-off-by: David Henningsson<david.henningsson at canonical.com>
>> ---
>> configure.in | 7 +++++++
>> pulse/pcm_pulse.c | 28 ++++++++++++++++++++++++++--
>> 2 files changed, 33 insertions(+), 2 deletions(-)
>>
>> diff --git a/configure.in b/configure.in
>> index ccf59ba..f6886b1 100644
>> --- a/configure.in
>> +++ b/configure.in
>> @@ -31,8 +31,14 @@ AC_ARG_ENABLE([pulseaudio],
>>
>> if test "x$enable_pulseaudio" != "xno"; then
>> PKG_CHECK_MODULES(pulseaudio, [libpulse>= 0.9.11], [HAVE_PULSE=yes], [HAVE_PULSE=no])
>> + PKG_CHECK_MODULES(pulseaudio_099, [libpulse>= 0.99.1],
>> + [HAVE_PULSE_UNDERRUN_INDEX=yes], [HAVE_PULSE_UNDERRUN_INDEX=no])
>
> Hm, can we use PA_CHECK_VERSION() or such simply in the code?
Ok, good idea.
>
>> diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
>> index d6c6792..61f1c0c 100644
>> --- a/pulse/pcm_pulse.c
>> +++ b/pulse/pcm_pulse.c
>> @@ -26,6 +26,10 @@
>> #include<alsa/asoundlib.h>
>> #include<alsa/pcm_external.h>
>>
>> +#ifdef HAVE_CONFIG_H
>> +#include<config.h>
>> +#endif
>> +
>> #include "pulse.h"
>>
>> typedef struct snd_pcm_pulse {
>> @@ -39,9 +43,10 @@ typedef struct snd_pcm_pulse {
>> size_t last_size;
>> size_t ptr;
>> int underrun;
>> - int handle_underrun;
>> + int handle_underrun; /* can be 0=never, 1=always or 2,3=only if more data has not been written */
>
> I think it'd be simpler to introduce one more boolean variable.
> Otherwise the logic looks too complex than needed.
I've now done that. I don't know if it became simpler though.
>
>> @@ -594,7 +600,12 @@ static void stream_underrun_cb(pa_stream * p, void *userdata)
>> if (!pcm->p)
>> return;
>>
>> - pcm->underrun = 1;
>> + if (pcm->handle_underrun == 1
>> +#ifdef HAVE_PULSE_UNDERRUN_INDEX
>> + || pcm->written<= pa_stream_get_underflow_index(p)
>> +#endif
>> + )
>> + pcm->underrun = 1;
>
> A nicer way is to define a macro such as
>
> #ifdef HAVE_PULSE_UNDERRUN_INDEX
> static inline int handle_underrun_detect(snd_pcm_pulse_t *pcm, pa_stream *p)
> {
> return !pcm->handle_underrun_detect ||
> pcm->written<= pa_stream_get_underflow_index(p);
> }
> #else
> #define handle_underrun_detect(pcm, p) 1
> #endif
>
> Then
>
> if (pcm->handle_underrun&& handle_underrun_detect(pcm, p))
> pcm->underrun = 1;
Ok, works for me.
--
David Henningsson, Canonical Ltd.
http://launchpad.net/~diwic
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-alsa-plugins-Pulse-only-underrun-if-no-more-data-has.patch
Type: text/x-patch
Size: 0 bytes
Desc: not available
Url : http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20110823/ac5f100b/attachment.patch
More information about the Alsa-devel
mailing list