ALSA - 检索音频缓冲区时间戳



>我有一个简单的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: %sn", 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: %sn", snd_strerror(err));
return err;
}
printf("avail: %dn", avail);
printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec);

但是,虽然似乎设置了avail,但ts始终为 0.000000000。

我在运行Raspbian的Raspberry Pi上,具有ADA1475音频接口。

提前感谢, 安 迪

对 swparam 的更改必须应用于具有snd_pcm_sw_params()的 PCM 接口。

/* Allocate a temporary swparams struct */
snd_pcm_sw_params_t *swparams;
snd_pcm_sw_params_alloca(&swparams);
/* Retrieve current SW parameters. */
snd_pcm_sw_params_current(pcmHandle, swparams);
/* Change software parameters. */
snd_pcm_sw_params_get_tstamp_mode(swparams, SND_PCM_TSTAMP_ENABLE);
snd_pcm_sw_params_set_tstamp_type(pcmHandle, swparams, SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY);
/* Apply updated software parameters to PCM interface. */
snd_pcm_sw_params(pcmHandle, swparams);  // <-- Change takes effect here.

ALSA 允许随时更改软件参数,即使在流运行时也是如此。

相关内容

  • 没有找到相关文章

最新更新