[alsa-devel] Underrun problem and some basic queries

Jaroslav Kysela perex at perex.cz
Mon Jan 25 11:56:36 CET 2010


On Mon, 4 Jan 2010, ANISH KUMAR wrote:

>
> Dear ALSA Team,
> I have some queries.Please answer them.(previous post please ignore as they couldn't appear because of encoding problem)
> I am getting underrun problem whenever the playback is about to get finished.
> happening in snd_pcm_update_hw_ptr_post function:
> if (avail >= stop_threshold) {
>        if (substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING)
>            snd_pcm_drain_done(substream);
>        else
>            xrun(substream); //here it is happening..........
>        return -EPIPE; }
>
> 1. As i understand if i dont call drain function 
> this will happen.Ismy understanding correct?Because if am calling drain 
> function then thisproblem is not happening.If the application doesn't 
> call drain functionthen xrun is the only way to stop ALSA or does ALSA 
> detect that thereare no more samples to play and automatically stop the 
> play(if yes,canyou point out the source code)?

You showed the stop point in above if (avail >= threshold) condition.

> 2. snd_pcm_playback_avail() returns the number of samples that 
> stillneeds to be played?Below is the diagram which is my understanding.

No, it's the room for new samples to fill the ring buffer to full.

>    Ring buffer (DMA buffer created using preallocated buffer during system initalisation)
> -----------------------------------------------------------------
> |          |          |          |          |          |          |
> -----------------------------------------------------------------
>    ^  ^
>    |   |
> hw_ptr appl_ptr
> After first write call:
> -----------------------------------------------------------------
> |          |          |          |          |          |          |
> -----------------------------------------------------------------
>     ^                               ^
>     |                                |
> appl_ptr                     hw_ptr

If hw_ptr > appl_ptr then underrun occurs.

> So my understanding is once wait_for_avail_min returns 
> insnd_pcm_lib_write1 function.hw_ptr is increased by some 
> amount(periodsize) but appl_ptr will increase only when 
> wait_for_avail_minreturns.And difference of 
> (hw_ptr+runtime->buffersize-appl_ptr) will give us unplayed samples in 
> the case of playback?

No.

> Is this whole ring buffer is filled after the 
> snd_pcm_lib_write_transfer function is returned?

Not necessary. It depends how much samples an application feeds in.

> 3.In some rare cases (playback case) i have seen thatwait_for_avail_min 
> doesn't return and driver pointer function keeps ongetting called 
> causing hw_ptr to increase.This causessnd_pcm_playback_avail() function 
> to return a value less than avail_min(as hw_ptr is increasing and 
> appl_ptr is stagnant as it is stuck insnd_pcm_lib_write1 function) which 
> inturn causes wake-up fromsnd_pcm_update_hw_ptr_post() not to get 
> called.When this type ofscenario happens?Is it a normal scenario if 
> yes,then how will it willever come out from wait_for_avail_min? 
> According to my understanding appl_ptr will increase only when we return 
> from wait_for_avail_min?

I'm not sure if you're not mentioning a problem solved in:

http://git.alsa-project.org/?p=alsa-kernel.git;a=commitdiff;h=c91a988dc6551c66418690e36b2a23cdb0255da8

> 4.how does alsa know that it is running short 
> of data?As iunderstand that it does not free the memory and data is 
> onlyoverwritten.So how does it distinguish between old and new data?

Everything in ALSA PCM is about comparing hw_ptr and appl_ptr. So 
basically, the ring buffer size is maximum time for application to fill 
and for driver to eat samples. If this time is surpased, wrong things 
happen.

> 5.Burst of noise due to stale data problem reported by Jon Smirl and for 
> which Mr Jaroslav has suggested this solution 
> http://mailman.alsa-project.org/pipermail/alsa-devel/2009-May/017119.html.Is 
> it implemented?

Nope. Patches are welcome.

 						Jaroslav

-----
Jaroslav Kysela <perex at perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.



More information about the Alsa-devel mailing list