[alsa-devel] [PATCH] alsa-plugins: Pulse: only underrun if no more data has been written
Takashi Iwai
tiwai at suse.de
Fri Aug 19 09:43:57 CEST 2011
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?
> 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.
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
More information about the Alsa-devel
mailing list