Hi, I'm a newbie of ALSA.
I've wrote some audio applications under Windows OS with DirectSound and Waveform Audio API. And I also have some knowledge about Sound Architecture of Windows Vista/Windows 7. All my experience about audio architecture was from Windows. I'm currently working on a ALSA plugin for AEC function. What I have to do is to retrieve audio data being played (after mixing) as reference to cancel the echo captured by MIC. According to my previous experience about Sound Architecture of Win7/Vista, the audio data is sending from OS component to my own component: no matter for capture or playback. All I have to do is just simply modify the input data and put them into output buffer. If my component is under OS mixer, the received audio data is after mixing. When I read source code of ALSA lib, I found the mechanism between Windows and ALSA lib are quite different.
Following was my understanding about ALSA lib mechanism during playback.
There is a hardware buffer. ALSA driver takes data from the buffer and sends it to HW. The driver also update the play position on the fly. dmix receive the data from application and mix them into a shared memory, and then copy it into hardware buffer. Each of dmix instance keep a pointer to indicate current mixing position which might different from other instance.
[play pos] [1st mixed data] | | +----------------------------+ hardware buffer +----------------------------+ | [2nd mixed data]
The figure shows, the data mixed from 1st dmix instance lasts to [1st mixed data] pos, and data mixed from 2nd dmix instance lasts to [2nd mixed data]. The buffer between [1st mixed data] and [2nd mixed data] contains only data of 2nd dmix instance, but it does not matter, ALSA just guarantees the data of 1st dmix instance can be mixed up before the [play pos] reaches [1st mixed data] pos.
Of course the hardware buffer is not unlimited (it's a ring buffer), so before dmix mix data to hardware buffer, it has to check if there is enough space.
Is my understanding of ALSA playback mechanism correct?