[alsa-devel] more on appl_ptr and DMA overrun at end of stream

Takashi Iwai tiwai at suse.de
Fri May 22 09:14:44 CEST 2009


At Fri, 22 May 2009 09:07:43 +0200 (CEST),
Jaroslav Kysela wrote:
> 
> On Fri, 22 May 2009, Takashi Iwai wrote:
> 
> > At Thu, 21 May 2009 14:44:27 -0400,
> > Jon Smirl wrote:
> >>
> >> I've been reading Lennart's article on glitch free audio....
> >>
> >> On my scatter/gather DMA hardware I generate an interrupt at the end
> >> of each period. On the last period this causes ALSA to issue a
> >> trigger(STOP). However, there is a latency from when that interrupt is
> >> generated and when ALSA does the trigger(STOP). During that latency my
> >> hardware starts playing the next buffer (which contains stale data).
> >> Playing stale data causes a noise burst. I fixed this by programming
> >> my DMA hardware to not overrun appl_ptr.
> >>
> >> There's another solution. ALSA already knows the stream ends
> >> mid-period and pads out the partial period with silence. If it simply
> >> padded out the next period with silence too the overrun problem would
> >> become non-audible and there would time to process trigger(STOP).
> >>
> >> If padding out two periods at end of stream is possible, it then
> >> becomes possible for me to turn off interrupts in my audio driver.
> >
> > This can be another interesting feature.  For example, you could add
> > a soft-mute padding to avoid a click noise at the end instead of a
> > whole silence.
> >
> > But, this kind of hack really depends on the hardware implementation.
> > If a hardware has no DMA but require explicit writes, adding two
> > periods is too much.  Just a few samples would be enough.
> 
> I agree to leave such things to lowlevel drivers.
> 
> > Or, in the case of normal PCI DMA transfer, how can it be stopped?
> > That is, the stream is still running although it's claimed to be
> > stopped.  If a period size is big (say over one second), the stop at
> > the next interrupt doesn't sound good.
> 
> I would suggest to improve drain() logic in kernel with
> snd_pcm_update_hw_ptr() calls and using proper timeouts for 
> schedule_timeout().
> 
> Note that this situation were handled with dead and removed pcm tick API - 
> although it required assistance (setup) from application.

... and, the results was no one used it :)
Apps don't want to set up such details at all -- that's the lesson
we had to learn...


Takashi


More information about the Alsa-devel mailing list