[alsa-devel] [PATCHv2 1/1] pcm_pulse: set prebuf parameter according to software parameters

Takashi Iwai tiwai at suse.de
Mon Nov 19 19:09:33 CET 2012


At Sun, 18 Nov 2012 12:01:49 +0200,
Rémi Denis-Courmont wrote:
> 
> The current default value for prebuf is very high, almost the full
> virtual ALSA buffer. This breaks some application especially where
> low latency is involved.
> 
> This patch makes pcm_pulse implement the sw_params callback and get
> the prebuf value from the ALSA software parameters. Thus the
> trigger latency is much more like what an ALSA application should
> expect from an ALSA PCM device.

Looks good to me.  David, could you review?
Also, the first patch isn't needed, right?


Takashi

> ---
>  pulse/pcm_pulse.c |   32 ++++++++++++++++++++++++++++++--
>  1 file changed, 30 insertions(+), 2 deletions(-)
> 
> diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
> index 24fd4da..4226d30 100644
> --- a/pulse/pcm_pulse.c
> +++ b/pulse/pcm_pulse.c
> @@ -854,8 +854,9 @@ static int pulse_hw_params(snd_pcm_ioplug_t * io,
>  		4 * 1024 * 1024;
>  	pcm->buffer_attr.tlength =
>  		io->buffer_size * pcm->frame_size;
> -	pcm->buffer_attr.prebuf =
> -	    (io->buffer_size - io->period_size) * pcm->frame_size;
> +	if (pcm->buffer_attr.prebuf == (uint32_t)-1)
> +		pcm->buffer_attr.prebuf =
> +			(io->buffer_size - io->period_size) * pcm->frame_size;
>  	pcm->buffer_attr.minreq = io->period_size * pcm->frame_size;
>  	pcm->buffer_attr.fragsize = io->period_size * pcm->frame_size;
>  
> @@ -865,6 +866,31 @@ static int pulse_hw_params(snd_pcm_ioplug_t * io,
>  	return err;
>  }
>  
> +static int pulse_sw_params(snd_pcm_ioplug_t *io, snd_pcm_sw_params_t *params)
> +{
> +	snd_pcm_pulse_t *pcm = io->private_data;
> +	snd_pcm_uframes_t start_threshold;
> +
> +	assert(pcm);
> +
> +	if (!pcm->p || !pcm->p->mainloop)
> +		return -EBADFD;
> +
> +	pa_threaded_mainloop_lock(pcm->p->mainloop);
> +
> +	snd_pcm_sw_params_get_start_threshold(params, &start_threshold);
> +
> +	/* At least one period to keep PulseAudio happy */
> +	if (start_threshold < io->period_size)
> +		start_threshold = io->period_size;
> +
> +	pcm->buffer_attr.prebuf = start_threshold * pcm->frame_size;
> +
> +	pa_threaded_mainloop_unlock(pcm->p->mainloop);
> +
> +	return 0;
> +}
> +
>  static int pulse_close(snd_pcm_ioplug_t * io)
>  {
>  	snd_pcm_pulse_t *pcm = io->private_data;
> @@ -931,6 +957,7 @@ static const snd_pcm_ioplug_callback_t pulse_playback_callback = {
>  	.poll_revents = pulse_pcm_poll_revents,
>  	.prepare = pulse_prepare,
>  	.hw_params = pulse_hw_params,
> +	.sw_params = pulse_sw_params,
>  	.close = pulse_close,
>  	.pause = pulse_pause
>  };
> @@ -1088,6 +1115,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pulse)
>  	}
>  
>  	pcm->handle_underrun = handle_underrun;
> +	pcm->buffer_attr.prebuf = -1;
>  
>  	err = pulse_connect(pcm->p, server, fallback_name != NULL);
>  	if (err < 0)
> -- 
> 1.7.10.4
> 
> _______________________________________________
> 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