[RFC PATCH (alsa-lib)] pcm: Modify check condition in snd_pcm_sw_params_set_avail_min
Takashi Iwai
tiwai at suse.de
Thu Sep 3 00:08:14 PDT 2015
On Thu, 03 Sep 2015 05:20:54 +0200,
Koro Chen wrote:
>
> When we use a ping-ping buffer in capture, and if hw_ptr reported
> at IRQ is a little smaller than period_size:
>
> |xxxxxxxxxxxxxxxxxxxxxxxxxxxx--|-----------------------------|
> hw_ptr < period_size
How this happens? The period size is the size where irq (or wakeup)
wakes up for read/write. Why the driver wakes up even if there is no
enough data?
> This available buffer will not be read since its size is smaller than
> avail_min (which is set to be period_size), and read thread continues
> to sleep. If the next hw_ptr is just a little larger than buffer_size,
> overrun occurs.
>
> This could be resolved by setting a small avail_min to kernel,
> for example, 1, so read thread wakes up and reads every data at IRQ.
> But current alsa-lib only allows avail_min to be at least period_size.
> Remove the constraint and only check for zero case.
The restriction was introduced for avoiding CPU hogs with rate plugin
in many years ago. avail_min=1 *might* work now because of the later
fix for rate plugin, but this must be verified.
thanks,
Takashi
>
> Signed-off-by: Koro Chen <koro.chen at mediatek.com>
> ---
> src/pcm/pcm.c | 8 ++------
> 1 file changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
> index f5fc728..8492689 100644
> --- a/src/pcm/pcm.c
> +++ b/src/pcm/pcm.c
> @@ -5958,12 +5958,8 @@ int snd_pcm_sw_params_set_avail_min(snd_pcm_t *pcm, snd_pcm_sw_params_t *params,
> #endif
> {
> assert(pcm && params);
> - /* Fix avail_min if it's below period size. The period_size
> - * defines the minimal wake-up timing accuracy, so it doesn't
> - * make sense to set below that.
> - */
> - if (val < pcm->period_size)
> - val = pcm->period_size;
> + if (!val)
> + val = 1;
> params->avail_min = val;
> return 0;
> }
> --
> 1.7.9.5
>
More information about the Linux-mediatek
mailing list