[alsa-devel] Modifying PCM buffer before DMA
Working with a SoC which has an I2S interface which reuquires 16-bit-swapped 32 bit samples (i.e. the first and 16 halfwords are swapped, but within the halfwords the bytes themselves are little endian), I'm trying to figure out a way to adjust the data in the PCM driver so that ALSA sees standard S32_LE samples.
My approach is to use a tight loop to halfword-swap the data. This works fine for capture, where the swap routine can be run triggered by the DMA interrupt as each period arrives from the I2S interface, before calling snd_pcm_period_elapsed().
The problem I have is for playback. I want to have SNDRV_PCM_INFO_MMAP set in snd_pcm_hardware.info in order to be use plugins such as dmix, which in practice means that the PCM driver doesn't really know exactly how much data the application has written before the DMA starts writing it out to the I2S interface. As far as I can tell, the application layer asks the driver for the hw_ptr but there is no way the driver can actually know how much data the application has in fact written.
Contrary to the capture case, once the DMA interrupt for a previous period has been triggered, the data for the current period will already be on its way out to the I2S interface, courtesy of the DMA.
Disabling MMAP seems to be one way to get the PCM driver to take greater control of the transfer (for instance via snd_pcm_ops->copy() ), but I want to avoid that as mentioned above. My question is, is there another way?
/Ricard
participants (1)
-
Ricard Wanderlof