【问题标题】:Retrieving ALSA playback delay检索 ALSA 播放延迟
【发布时间】:2018-05-12 04:28:28
【问题描述】:
我正在尝试在从库中检索到的 Raspberry Pi 3 上播放声音。我需要提供一个准确的时间来确定样本何时会击中扬声器。然后图书馆将提供与时间同步的样本。我正在使用 ALSA 播放声音。但是我似乎无法准确获得时间。我尝试了 snd_pcm_htimestamp()、snd_pcm_delay()、snd_pcm_status_get_delay() 和 snd_pcm_status_get_audio_htstamp() 的几种组合。我也尝试过 writei 和 mmap。
谁能给我一个提示,告诉我如何获取播放样本的准确时间?
【问题讨论】:
标签:
linux
raspberry-pi3
alsa
【解决方案1】:
snd_pcm_*delay() 为您提供最佳估计。但是,许多驱动程序没有实现这一点,并且可能存在软件不知道的其他硬件。
【解决方案2】:
现在我要回答我自己的问题。事实证明,使用 snd_pcm_status() 实际上是要走的路。我第一次尝试时遇到了一个错误。以下代码计算自启动以来添加的下一个示例将播放的时间(以纳秒为单位):
snd_pcm_status_t *pcm_status;
snd_pcm_status_alloca(&pcm_status); //Allocate space on the stack
snd_pcm_status(handle, pcm_status);
int delay = snd_pcm_status_get_delay(pcm_status);
snd_htimestamp_t tstamp;
snd_pcm_status_get_audio_htstamp(pcm_status, &tstamp);
uint64_t Time = tstamp.tv_sec * (uint64_t)1000000000 + tstamp.tv_nsec;
Time += (delay * (uint64_t)1000000000) / 44100;