On Tue, May 5, 2009 at 10:35 AM, Jon Smirl jonsmirl@gmail.com wrote:
Is there some way to get a call out after a period DMA buffer is filled so that I can add it to the DMA queue?
The current model in my driver is to queue up a bunch of DMA descriptors, one per period. When I queue these I don't know if the DMA buffers have music in them or not. I then start this queue playing and tell ALSA when each period has finished. After each period plays I requeue the descriptor. I keep hoping that ALSA can get these filled before they start playing.
After the last period plays ALSA calls trigger(STOP). At that point I try to shut down the DMA hardware and get the descriptors back. But because of the FIFO and asynchronous DMA engine I can't stop DMA fast enough in the trigger(STOP) routine. The result is that the next period starts playing. This period has data from earlier in the stream and it sounds like a burst of noise.
What I need is a call back indicating which buffers have valid data in them. When I know the buffer is valid I can queue the descriptor. This will fix the problem at end of stream since there won't be buffers queued containing invalid data.