[alsa-devel] [PATCH] alsa-plugins: Pulse: only underrun if no more data has been written

David Henningsson david.henningsson at canonical.com
Fri Aug 19 11:49:25 CEST 2011


On 08/19/2011 09:43 AM, Takashi Iwai wrote:
> At Thu, 18 Aug 2011 17:06:15 +0200,
> David Henningsson wrote:
>>
>> With the new/upcoming version of PulseAudio (0.99.x) there is a protocol
>> addition that makes it possible to handle underruns better in the pulse
>> plugin.
>>
>> The attached patch implements that, but it has two flaws I wouldn't mind
>> getting some help with if possible:
>>
>> 1) Since this uses the new API function pa_stream_get_underflow_index,
>> it won't compile with current stable PulseAudio versions, only the
>> upcoming version.
>
> Any way (like ifdef some constant or a version number) to detect in
> build time, or do we need to check it in configure script?

I don't mess around with autotools that often, but I think I got it 
working (see attached patch)

>
>> 2) So now there are three possibilities for handle_underrun ( 0 = never,
>> 1 = always, 2 = the new improved one that IMO should be used). Since
>> handle_underrun is a bool in the config, it can not be set to "2", only
>> 0 or 1.
>
> Changing the value syntax doesn't sound good.
> IMO, better to add another option to enable/disable the advanced
> underrun handling.

Ok, I have now done so in the attached patch.

>
>
> thanks,
>
> Takashi
>
>
>> --
>> David Henningsson, Canonical Ltd.
>> http://launchpad.net/~diwic
>> [2 0001-alsa-plugins-Pulse-only-underrun-if-no-more-data-has.patch<text/x-patch (7bit)>]
>> > From 4e31ba395b751a6ab3254256dc8a227b3be67932 Mon Sep 17 00:00:00 2001
>> From: David Henningsson<david.henningsson at canonical.com>
>> Date: Tue, 2 Aug 2011 14:49:04 +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>
>> ---
>>   pulse/pcm_pulse.c |   10 +++++++---
>>   1 files changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
>> index d6c6792..9c4a7e5 100644
>> --- a/pulse/pcm_pulse.c
>> +++ b/pulse/pcm_pulse.c
>> @@ -39,9 +39,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=only if more data has not been written */
>>
>>   	size_t offset;
>> +	int64_t written;
>>
>>   	pa_stream *stream;
>>
>> @@ -459,6 +460,7 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
>>   	}
>>
>>   	/* Make sure the buffer pointer is in sync */
>> +	pcm->written += writebytes;
>>   	pcm->last_size -= writebytes;
>>   	ret = update_ptr(pcm);
>>   	if (ret<  0)
>> @@ -594,7 +596,8 @@ static void stream_underrun_cb(pa_stream * p, void *userdata)
>>   	if (!pcm->p)
>>   		return;
>>
>> -	pcm->underrun = 1;
>> +	if (pcm->handle_underrun == 1 || pcm->written<= pa_stream_get_underflow_index(p))
>> +		pcm->underrun = 1;
>>   }
>>
>>   static void stream_latency_cb(pa_stream *p, void *userdata) {
>> @@ -691,6 +694,7 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
>>   		goto finish;
>>   	}
>>
>> +	pcm->written = 0;
>>   	pa_stream_set_state_callback(pcm->stream, stream_state_cb, pcm);
>>   	pa_stream_set_latency_update_callback(pcm->stream, stream_latency_cb, pcm);
>>
>> @@ -983,7 +987,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pulse)
>>   	const char *server = NULL;
>>   	const char *device = NULL;
>>   	const char *fallback_name = NULL;
>> -	int handle_underrun = 0;
>> +	int handle_underrun = 2;
>>   	int err;
>>   	snd_pcm_pulse_t *pcm;
>>
>> --
>> 1.7.4.1
>>
>> [3<text/plain; us-ascii (7bit)>]
>> _______________________________________________
>> Alsa-devel mailing list
>> Alsa-devel at alsa-project.org
>> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>



-- 
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/20110819/02d1e886/attachment.patch 


More information about the Alsa-devel mailing list