[alsa-devel] [PATCHv2 1/1] pcm_pulse: set prebuf parameter according to software parameters
David Henningsson
david.henningsson at canonical.com
Tue Nov 20 08:51:29 CET 2012
On 11/19/2012 07:09 PM, Takashi Iwai wrote:
> 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?
I think so too.
Acked-by: David Henningsson <david.henningsson at canonical.com>
> Also, the first patch isn't needed, right?
I think the "pcm_pulse: do not trigger immediately at start" patch
should not be applied.
>
>
> 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
>>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the Alsa-devel
mailing list