On 04/06/16 11:17, Clemens Ladisch wrote:
Alan Young wrote:
I am looking at ways to get more accurate status timestamp information for various SoC drivers.
What for?
I want to know, at any given point in wall-clock time, how many samples have been output. I want this to an accuracy better than period time. I want this when the output buffer is not being kept full, and therefore I cannot rely on polls firing only on period boundaries.
A call to snd_pcm_status() result in snd_pcm_update_hw_ptr0() being called. This gets the current output position (pos) via substream->ops->pointer(substream) and then makes all the other calculations based on the result. In theory, the result of substream->ops->pointer() could be sample accurate but in practice it is very unlikely to be better than period accurate.
Accurate timestamps make sense only with accurate pointers. The purpose of these timestamps is to allow better prediction of the position of the DMA pointer, but this is pointless when the DMA pointer does large jumps.
I think that that was exactly my point. The DMA pointer does large jumps. An accurate position is only obtained at the point of an interrupt callback. Attempting to rely on more accurate reports from the DMA subsystems outside of an interrupt is doomed to failure. Therefore, base reports on the data obtained at the last interrupt point.
Alan.