我有一个使用 ALSA API 播放音频的简单 C 程序,我想知道音频缓冲区的精确时间。
我正在尝试使用 ALSA 的snd_pcm_htimestamp功能从音频驱动程序中检索时间戳,该功能返回两个值 - 时间戳和帧计数。
但是,从 ALSA 返回的时间戳未设置(零值)。第二个返回的变量,“获取时间戳时的可用帧数”,看起来设置正确。有没有人知道为什么时间戳似乎未设置?
我正在配置要在我的设置中激活的时间戳,如下所示:
err = snd_pcm_sw_params_set_tstamp_mode(pcmHandle, swparams, SND_PCM_TSTAMP_ENABLE);
if (err < 0) {
printf("Unable to set timestamp mode: %s\n", snd_strerror(err));
return err;
}
我验证它是否已设置:
snd_pcm_tstamp_t timestampMode;
err = snd_pcm_sw_params_get_tstamp_mode(swparams, ×tampMode);
if (timestampMode != SND_PCM_TSTAMP_ENABLE)
{
// error ...
}
然后在程序的主 while 循环中,在我使用 向 ALSA 提供样本后snd_pcm_writei
,我尝试获取该缓冲区的时间戳,如下所示:
snd_pcm_writei(pcmHandle, samples, frameCount);
snd_htimestamp_t ts;
snd_pcm_uframes_t avail;
err = snd_pcm_htimestamp(pcmHandle, &avail, &ts);
if (err < 0)
{
printf("Unable to get timestamp: %s\n", snd_strerror(err));
return err;
}
printf("avail: %d\n", avail);
printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec);
但是,虽然avail
似乎已设置,但ts
始终为 0.000000000。
我在运行带有 ADA1475 音频接口的 Raspbian 的 Raspberry Pi 上。
在此先感谢,安迪