ALSA 时间戳函数 return 是什么以及结果如何相互关联?
What do the ALSA timestamping function return and how do the result relate to each other?
ALSA 中有几个 "hi-res" 时间戳函数:
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是started/stopped/paused的时间。 snd_pcm_status_get_trigger_htstamp
returns 一个常量值,当我将 audio_htstamp
添加到该值时,结果非常接近当前系统时间。
audio_htstamp
在我的系统上似乎是从零开始的,它递增的值等于我使用的周期大小。因此在我的系统上它是一个简单的帧计数器。如果我正确理解 ALSA audio_htstamp
也可以根据系统功能以不同的更准确的方式工作。
driver_htstamp
我猜名字是音频驱动程序生成的时间戳。
问题一:时间戳driver_htstamp
一般在什么时候产生?
With htstamp
我真的不确定它是在何时何地生成的。我预感可能和DMA有关。
问题2:htstamp
是在哪里生成的?
问题三:htstamp
是什么时候生成的?
问题 4: 假设 audio_htstamp < htstamp < driver_htstamp
大体上正确吗?
我写的有点像program,但我想验证我的假设。
我在 ALSA 文档中找不到此信息。
我只是为了自己的目的研究了这些东西的代码,所以我想我会分享我发现的东西。
这些时间戳的目的是让您确定不同时钟速率的细微差异;在这种情况下,最重要的是 Linux 用于一般计时的主系统时钟与确定样本进出声音设备的速率的不同时钟相比。这对于需要使来自不同硬件设备的音频保持同步的应用程序非常重要,因为不同物理时钟的速率永远不会完全相同。
所使用的技术有时称为"cross-timestamping";您从要比较的时钟中尽可能接近地捕获时间戳,并定期重复此操作。通常会引入一些测量误差,但一些相对简单的过滤可以让您很好地表征时钟计数速率的差异。
核心 PCM 驱动程序安排尽可能接近音频流开始时的系统时钟时间戳,然后在系统时钟和音频时钟之间做一个交叉时间戳(可以用不同的方式测量) ) 每当它被要求检查移动样本的 DMA 引擎的硬件指针的状态时。
测量音频时钟的默认方法是通过 DMA 硬件指针比较。这不是非常精确,但在更长的时间段内,您仍然可以很好地衡量速率差异。在snd_pcm_update_hw_ptr0
的开始,捕获了一个系统时间戳;这将最终成为 htstamp
。然后检查 DMA 指针,如果确定自上次检查以来它们已经移动,则根据 DMA 复制的帧数和音频时钟的标称频率计算 audio_htstamp
。然后,一旦所有 DMA 指针更新完成并且就在 snd_pcm_update_hw_ptr0
returns 之前,另一个系统时间戳将在 driver_htstamp
中捕获。但是,当您使用 DMA hw_ptr 方法计算 audio_htstamp
时,这并不意味着要使用。
如果您碰巧有一个使用 HDAudio 驱动程序的音频设备,您可以使用另一种更精确的方法来测量音频时钟。它提供了一个名为 get_time_info
的额外操作回调,用于代替捕获系统和音频时间戳的默认方法。在 HDAudio 的情况下,它需要 htstamp
的系统时间戳,尽可能接近它读取由与音频时钟相同的时钟源驱动的内部计数器的时间;这形成了 audio_htstamp
。之后,同样的DMAhw_ptr记账,只是跳过了将指针移动转化为时间的代码。不过,driver_htstamp
仍然在例程结束前进行;正如代码中的注释所说,这是 "to let apps detect if the reference tstamp read by low-level hardware was provided with a delay"。这是因为无法保证 get_time_info
回调将采用新的系统时间戳;它可能先前记录了音频时间戳和系统时间戳作为中断处理程序的一部分。在这种情况下,您获得的时间戳可能与 hw_ptr 簿记计算的可用帧和延迟帧计数不匹配,但 driver_htstamp
会让您知道最接近这些计算时的系统时间。
在任何情况下,代码在这两种情况下都设计为尽可能紧密地捕获 htstamp
和 audio_htstamp
,并且 htstamp - trigger_htstamp
表示系统时间量在音频时钟的 audio_htstamp
测量的时间段内通过。大多数情况下,您不需要使用 driver_htstamp
,但我猜它可能会与 USB 音频驱动程序一起使用,因为我认为它和 HDAudio 是目前唯一对这些接口执行任何特殊操作的驱动程序。
虽然它没有包含您可能想知道的所有详细信息,但它的文档是内核文档的一部分:http://lxr.free-electrons.com/source/Documentation/sound/alsa/timestamping.txt?v=4.9
ALSA 中有几个 "hi-res" 时间戳函数:
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是started/stopped/paused的时间。 snd_pcm_status_get_trigger_htstamp
returns 一个常量值,当我将 audio_htstamp
添加到该值时,结果非常接近当前系统时间。
audio_htstamp
在我的系统上似乎是从零开始的,它递增的值等于我使用的周期大小。因此在我的系统上它是一个简单的帧计数器。如果我正确理解 ALSA audio_htstamp
也可以根据系统功能以不同的更准确的方式工作。
driver_htstamp
我猜名字是音频驱动程序生成的时间戳。
问题一:时间戳driver_htstamp
一般在什么时候产生?
With htstamp
我真的不确定它是在何时何地生成的。我预感可能和DMA有关。
问题2:htstamp
是在哪里生成的?
问题三:htstamp
是什么时候生成的?
问题 4: 假设 audio_htstamp < htstamp < driver_htstamp
大体上正确吗?
我写的有点像program,但我想验证我的假设。
我在 ALSA 文档中找不到此信息。
我只是为了自己的目的研究了这些东西的代码,所以我想我会分享我发现的东西。
这些时间戳的目的是让您确定不同时钟速率的细微差异;在这种情况下,最重要的是 Linux 用于一般计时的主系统时钟与确定样本进出声音设备的速率的不同时钟相比。这对于需要使来自不同硬件设备的音频保持同步的应用程序非常重要,因为不同物理时钟的速率永远不会完全相同。
所使用的技术有时称为"cross-timestamping";您从要比较的时钟中尽可能接近地捕获时间戳,并定期重复此操作。通常会引入一些测量误差,但一些相对简单的过滤可以让您很好地表征时钟计数速率的差异。
核心 PCM 驱动程序安排尽可能接近音频流开始时的系统时钟时间戳,然后在系统时钟和音频时钟之间做一个交叉时间戳(可以用不同的方式测量) ) 每当它被要求检查移动样本的 DMA 引擎的硬件指针的状态时。
测量音频时钟的默认方法是通过 DMA 硬件指针比较。这不是非常精确,但在更长的时间段内,您仍然可以很好地衡量速率差异。在snd_pcm_update_hw_ptr0
的开始,捕获了一个系统时间戳;这将最终成为 htstamp
。然后检查 DMA 指针,如果确定自上次检查以来它们已经移动,则根据 DMA 复制的帧数和音频时钟的标称频率计算 audio_htstamp
。然后,一旦所有 DMA 指针更新完成并且就在 snd_pcm_update_hw_ptr0
returns 之前,另一个系统时间戳将在 driver_htstamp
中捕获。但是,当您使用 DMA hw_ptr 方法计算 audio_htstamp
时,这并不意味着要使用。
如果您碰巧有一个使用 HDAudio 驱动程序的音频设备,您可以使用另一种更精确的方法来测量音频时钟。它提供了一个名为 get_time_info
的额外操作回调,用于代替捕获系统和音频时间戳的默认方法。在 HDAudio 的情况下,它需要 htstamp
的系统时间戳,尽可能接近它读取由与音频时钟相同的时钟源驱动的内部计数器的时间;这形成了 audio_htstamp
。之后,同样的DMAhw_ptr记账,只是跳过了将指针移动转化为时间的代码。不过,driver_htstamp
仍然在例程结束前进行;正如代码中的注释所说,这是 "to let apps detect if the reference tstamp read by low-level hardware was provided with a delay"。这是因为无法保证 get_time_info
回调将采用新的系统时间戳;它可能先前记录了音频时间戳和系统时间戳作为中断处理程序的一部分。在这种情况下,您获得的时间戳可能与 hw_ptr 簿记计算的可用帧和延迟帧计数不匹配,但 driver_htstamp
会让您知道最接近这些计算时的系统时间。
在任何情况下,代码在这两种情况下都设计为尽可能紧密地捕获 htstamp
和 audio_htstamp
,并且 htstamp - trigger_htstamp
表示系统时间量在音频时钟的 audio_htstamp
测量的时间段内通过。大多数情况下,您不需要使用 driver_htstamp
,但我猜它可能会与 USB 音频驱动程序一起使用,因为我认为它和 HDAudio 是目前唯一对这些接口执行任何特殊操作的驱动程序。
虽然它没有包含您可能想知道的所有详细信息,但它的文档是内核文档的一部分:http://lxr.free-electrons.com/source/Documentation/sound/alsa/timestamping.txt?v=4.9