ALSA - 检索音频缓冲时间戳

时间:2017-08-23 13:32:28

标签: audio raspberry-pi alsa libasound

我有一个简单的C程序,使用ALSA API播放音频,我想知道音频缓冲区的精确时间。

我正在尝试使用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, &timestampMode);
if (timestampMode != SND_PCM_TSTAMP_ENABLE)
{
    // error ...
}

然后在程序的主要while循环中,在使用snd_pcm_writei向ALSA提供样本后,我尝试获取该缓冲区的时间戳,如下所示:

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音频接口的Raspberry Pi运行Raspberry。

提前致谢, 安迪

0 个答案:

没有答案