On 09/21/2014 04:02 AM, Raymond Yau wrote: [...]
https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/so...
a) Set the SNDRV_PCM_INFO_BATCH if the granularity is per period or worse. b) Fallback to the (race condition prone) period counting if the driver does not support any residue reporting.
Seem soc already have this granularity
How can the granularity worse more than one period ?
The granularity is the granularity that the DMA driver is able to report. In some cases the DMA driver is only able to tell whether a transfer has finished or not, but is not able tell any intermediate position. In case of a cyclic transfer the transfer never stops, so the DMA driver will only ever tell us that it hasn't finished the transfer yet. But the DMA driver will still generate a interrupt after every finished period. So we use this as a fallback mechanism and simply increase the pointer position after each interrupt by one period size. So userspace will never see a granularity that is worse than one descriptor. This is just something kernel internal.
On a side node, this period counting scheme is prone to race conditions and we strongly discourage new drivers from using it. Its mainly for supporting old DMA drivers which do not implement progress reporting (yet).
https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/include/li...
enum dma_residue_granularity { DMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0, DMA_RESIDUE_GRANULARITY_SEGMENT = 1, DMA_RESIDUE_GRANULARITY_BURST = 2, };
There are three type of granularity
Only SEGMENT and BURST granularity are relevant for audio userspace.
For ALSA we'd probably see different kind of categories of granularity though. E.g. one field which is the unit of the granularity
PERIOD: The granularity is a multiple of the period size FRAME: The granularity is a multiple of the frame size BYTE: The granularity is a fixed number of bytes MS: The granularity is a fixed amount of time
and then a second field that has a integer number of the granularity in that unit.
And then there is of course the issue that for some chips you can trade granularity for e.g. power efficiency or similar (e.g. by changing the transfer burst size). And this needs to be modeled somehow as well.
Does this mean the those sound card can report DMA_RESIDUE_GRANULARITY_BURST and driver use readl in pcm pointer callback ?
A few PCI sound cards use SG buffer including hda
It seem that pulseaudio expect the driver support DMA_RESIDUE_GRANULARITY_BURST for rewind/ timer scheduling
Yes. This is why we set the BATCH flag if the granularity is not DMA_RESIDUE_GRANULARITY_BURST so for example pulse audio can disable timer scheduling.
- Lars