
Hi, I'm working with a SoC sound hw that requires that all the data written into the DMA memory is aligned a 64 byte boundary. Actually the alignment is required since the format of the data into the DMA memory is (for a 2 channel 16bit audio): 16 samples for the left channel followed by 16 samples for the right channel.
Do you mean the sound card only support non interleaved mode ?
If I try to write anything that is not aligned to the 64 bytes I got audio corruption (high pitched noise). Several user-space programs (like aplay) work well with my hw, since the buffer sent from the user-space is always (padded) of period-size bytes, that is aligned to my 64 bytes boundary. Others (like speaker-test) are not working because sometimes they snd_pcm_writei() a buffer that is not multiple of 64 bytes. In general every time I write into the DMA area a buffer that is not aligned, my hw pointer is not aligned anymore with the 64 bytes and the noise starts.
You need to add constraint to restrict period bytes to 64
enum dma_residue_granularity { DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, DMA_RESIDUE_GRANULARITY_SEGMENT = 1, DMA_RESIDUE_GRANULARITY_BURST = 2, };
Can it report DMA_RESIDUE_GRANULARITY_SEGMENT or DMA_RESIDUE_GRANULARITY_BURST ?
IIUC it is not possible to force the user-space programs to send buffers with a fixed size so the problem should be solved in kernel-space (am I wrong on this point?). Any suggestion on how to tackle this problem?
pulseaudio seem not support non interleaved mode ?