[alsa-devel] ### Question on HW Pointer

Clemens Ladisch clemens at ladisch.de
Wed Oct 6 08:46:51 CEST 2010


Steve Spano wrote:
> I think the flow should be as follows (lets consider the dac part)
> 
> Step #1 ) interrupt occurs
> Step #2) dma/transfer begins as kicked off in interrupt routine

So I assume the driver is responsible for telling the hardware to begin
transferring the next period.  Doesn't it do this automatically?

> Step #3) we advance the buffer pointer for the alsa buffer

An interrupt (that is, for ALSA, the call to snd_pcm_period_elapsed)
signals the end of the previous period.

> Step #4) we exit the interrupt
> 
> . then the hardware should start advancing its pointer as it is reading the
> new samples
> 
> .. then sometime later, the alsa layer calls the "hw_pointer" function

The pointer callback can be called at any time.  It will definitely be
called from snd_pcm_period_elapsed, so the buffer pointer must already
have been increased before that call.

> And then we return the current value of the hardware pointer from the board?

Drop the word "then"; the pointer callback _always_ must return the
current value. :)

> So alsa knows how many samples the board has processed from the interrupt?

Yes; ALSA (or the application) wants to know how many samples the board
has processed.  If your DMA controller does not have a register for this,
the pointer must be calculated and updated in the interrupt handler (as
you do).

> Can someone explain how this pointer/etc is supposed to flow and what alsa
> may be using it for? Maybe some latency calculation in a an upper layer?

This, and to know which part of the buffer can be written to (the
hardware pointer indicates which part of the buffer has been processed
by the hardware; the samples after the pointer will be read now or
later).


Regards,
Clemens


More information about the Alsa-devel mailing list