ALSA 的 snd_pcm_delay() return 究竟是什么?

What exactly does ALSA's snd_pcm_delay() return?

我想使用 snd_pcm_delay() 来查询延迟,直到我要写入 ALSA 缓冲区的样本可以听到为止。我希望这个值在各个调用之间有所不同。但是,在两个系统上这个值是不变的。函数 returns 一个值在一个平台上始终等于周期大小,在另一个平台上它等于缓冲区大小(我代码中周期大小的两倍)。

我对snd_pcm_delay()的理解有误吗?是不是驱动问题?

延迟与缓冲区中的样本数量成正比(snd_pcm_avail() 的倒数),加上描述将样本从缓冲区移动到扬声器所需时间的时间。后一部分取决于驱动程序,可能无法实现。

如果设备一次取出一个完整周期的样本(一些 DMA 控制器没有更好的粒度来报告当前位置),那么延迟值会在一段时间内保持不变,然后跳跃一个整个时期。只有在重新填充缓冲区之前,您才会看到跳转。