At Tue, 17 Apr 2007 04:36:28 -0700 (PDT), Ciaccia wrote:
Hi Takashi, Thanks for your explanation. My request was not clear, since my understanding of ALSA is lacking and I need to understand more...
The driver I currently have is here: http://www.pecore.ch/test/ep93xx-i2s.c.txt
It's really messy, it performs all the format conversions in the driver (they could be done in the alsa-lib) and it lacks some functionalities, so I would like to make it shorter, better and more readable.
The driver does not currently define SNDRV_PCM_INFO_MMAP and the memory is copied in the copy callback. I would like to delete the copy callback (which is not really used), since the samples could be written directly to the dma buffer by alsa-lib.
How does alsa-lib know how to store the samples in the dma-buffer?
Based on the information the driver gives: access, formats, channels, etc.
How does alsa-lib know that the samples are interleaved,
access has SNDRV_PCM_ACCESS_{MMAP|RW}_INTERLEAVED.
occupy 32 bits each one (even if the format is 24 bits) and that the left channel samples are at index #0 and the left ones at index #1?
formats has SNDRV_PCM_FMTBIT_S16_{LE|BE}.
Or that between two consecutive samples in mono there should be a 4 bytes gap?
It's possible to support a non-standard stream like that, but it's a bit complicated. So, I recommend not to support this first (i.e. channels_max = channels_min = 2). Then alsa-lib will copy the mono stream automatically to stereo.
Takashi