在ALSA中有几个“高分辨率”时间戳function:
snd_pcm_status_get_trigger_htstamp snd_pcm_status_get_audio_htstamp snd_pcm_status_get_driver_htstamp snd_pcm_status_get_htstamp
我想了解结果函数代表什么时间点。
我目前的理解是, trigger_htstamp
表示stream开始/停止/暂停的时间。 snd_pcm_status_get_trigger_htstamp
返回一个常量值,当我将audio_htstamp
添加到该值时,结果非常接近当前系统时间。
audio_htstamp
似乎从我的系统上的零开始,并增加一个等于我使用的周期大小的值。 因此在我的系统上它是一个简单的帧计数器。 如果我理解ALSA正确audio_htstamp
也可以以不同的更准确的方式工作,取决于系统的能力。
driver_htstamp
我猜的名字是由audio驱动程序生成的时间戳。
问题1:什么时候通常会生成时间戳driver_htstamp
?
有了htstamp
我真的不确定它在何时何地生成。 我有一个预感,它可能与DMA有关。
问题2:生成的htstamp
在哪里?
问题3:何时生成htstamp
?
问题4:假设audio_htstamp < htstamp < driver_htstamp
大致正确吗?
这似乎与我写了一个小testing程序 ,但我想validation我的假设。
我无法在ALSA文档中find这些信息。
我只是为了自己的目的通过代码来挖掘这个东西,所以我想我会分享我发现的东西。
这些时间戳的目的是让你确定不同时钟速率的细微差别; 最重要的是在这种情况下,Linux用于一般计时的主系统时钟与用于确定采样移入和移出声音设备的速率的不同时钟相比。 这对于需要将来自不同硬件设备的音频保持同步的应用程序非常重要,因为不同物理时钟的速率从不完全相同。
所使用的技术有时被称为“交叉时间戳”。 您可以尽可能地从您想要比较的时钟捕捉时间戳,并定期重复此操作。 通常会引入一些测量误差,但是一些相对简单的滤波可以很好地表征时钟数的差异。
核心PCM驱动程序安排尽可能接近系统时钟的时间戳到音频流开始时,然后在系统时钟和音频时钟(可用不同方式测量)之间做交叉时间戳检查移动样本周围的DMA引擎的硬件指针的状态。
测量音频时钟的默认方法是通过DMA硬件指针比较。 这并不十分精确,但是在较长的时间内,您仍然可以很好地衡量差异。 在snd_pcm_update_hw_ptr0
开始时,捕获系统时间戳; 这将最终成为htstamp
。 然后检查DMA指针,并且如果确定自上次检查以来它们已经移动,则基于DMA已经复制的帧的数量和音频时钟的标称频率来计算audio_htstamp
。 然后,一旦完成了所有的DMA指针更新并且在snd_pcm_update_hw_ptr0
返回之前,另一个系统时间戳就被捕获在driver_htstamp
。 这并不意味着在使用计算audio_htstamp
的DMA hw_ptr方法时使用。
如果您碰巧有一个使用HDAudio驱动程序的音频设备,则可以使用另一种更精确的方法来测量音频时钟。 它提供了一个额外的操作回调称为get_time_info
,而不是捕获系统和音频时间戳的默认方法。 在HDAudio的情况下,它需要尽可能接近htstamp
的系统时间戳,以便当它读取由与音频时钟相同的时钟源驱动的内部计数器时; 这形成了audio_htstamp
。 之后,完成相同的DMA hw_ptr簿记,但是将指针移动转换为时间的代码被跳过。 尽管如此, driver_htstamp
仍然是在例程结束之前进行的。 这是“让应用程序检测是否由低级硬件读取的参考tstamp具有延迟”,如代码中的注释所示。 这是因为不能保证get_time_info
回调要采用新的系统时间戳。 它可能先前已经记录了音频时间戳和系统时间戳,作为中断处理程序的一部分。 在这种情况下,您获得的时间戳可能与hw_ptr簿记计算的可用帧和延迟帧计数不匹配,但是driver_htstamp
会让您知道最接近的系统时间,以及进行这些计算的时间。
在任何情况下,代码的设计都是为了尽可能地将htstamp
和audio_htstamp
尽可能紧密地集合在一起,并且htstamp - trigger_htstamp
表示在音频时钟的audio_htstamp
测量的audio_htstamp
所经过的系统时间量。 你大多不应该需要使用driver_htstamp
,但我想它可能会使用USB音频驱动程序,因为我认为它和HDAudio是目前唯一对这些接口做任何特殊处理的驱动程序。
尽管它没有包含所有你可能想知道的细节,但是它的文档是内核文档的一部分: http : //lxr.free-electrons.com/source/Documentation/sound/alsa/timestamping.txt ?v = 4.9