[alsa-devel] dmix without mmap support in soundcard driver

Robin Getz rgetz at blackfin.uclinux.org
Wed Jan 9 04:58:14 CET 2008


On Sun 6 Jan 2008 05:15, Joachim Foerster pondered:
> Hi Cliff, 
> 
> On Wed, 2008-01-02 at 06:26 +0000, cailinhua wrote:
> > I want to enable dmix for our sound card. Unfortunately for some reason
> > the sound card driver don't support 'mmap' way,it only support 'copy'
> > callback to copy data from upper level to DMA. 

A little background - the driver in question is actually doing format 
conversion. We take a PCM stream from userspace, and re-format it so we can 
talk to an AC'97 (like) codec via a standard TDM bus. 

This is why we don't allow userspace to talk to the hardware directly via 
mmap.

> > So ,I think maybe I can 
> > modify the alsa-lib dmix source code to let it use 'copy' way to send
> > data to the driver. Is it possible? Could you please give me some 
> > ideas? 
> 
> I don't know how difficult it would be to change alsa-lib's dmix
> sources, but my suggestion - in general - would be to alter the driver
> of your sound card to use the "intermediate buffer" technique (using
> pcm-indirect.h): Setup a buffer in RAM, which can be mmap'ed by
> applications and copy the contents of this buffer to the hardware in a
> background process for example.
> (See Takashi's "Writing an ALSA Driver" guide.)

OK - I see in:

http://www.alsa-project.org/~tiwai/writing-an-alsa-driver/x1405.htm

-------------
Some chips have their own hardware buffers and the DMA transfer from the host 
memory is not available. In such a case, you need to either 1) copy/set the 
audio data directly to the external hardware buffer, or 2) make an 
intermediate buffer and copy/set the data from it to the external hardware 
buffer in interrupts (or in tasklets, preferably).

The second case allows the mmap of the buffer, although you have to handle an 
interrupt or a tasklet for transferring the data from the intermediate buffer 
to the hardware buffer. You can find an example in vxpocket driver.
-------------

I assume that is what you mean?

If so, I'm still confused - since the pcmcia/vx (vxpocket driver) doesn't seem 
to do that... ??

I do see the driver in pci/rme32.c - it is using pcm-indirect.h and the 
snd_pcm_indirect_xxx functions - if that is the one we should be looking at?

My only question is - if you allow a mmaped intermediate buffer, how does the 
driver notice when ALSA writes into this buffer?

Thanks
-Robin

Thanks
-Robin


More information about the Alsa-devel mailing list