【问题标题】:ALSA - Retrieving audio buffer timestampsALSA - 检索音频缓冲区时间戳
【发布时间】:2022-04-25 11:23:41
【问题描述】:

我有一个使用 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, &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。

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

提前致谢, 安迪

【问题讨论】:

  • 高分辨率时间戳需要硬件支持;见snd_pcm_hw_params_supports_audio_wallclock_ts/snd_pcm_hw_params_supports_audio_ts_type
  • 啊……谢谢! snd_pcm_hw_params_supports_audio_wallclock_t 在我的硬件上返回 0,从而解释了我的问题(奇怪的是 snd_pcm_hw_par‌​ams_supports_audio_t‌​s_type 似乎不存在于我的 libasound 库中)。

标签: audio raspberry-pi alsa libasound


【解决方案1】:

对 swparams 的更改必须应用到带有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 允许随时更改software parameters,即使在流运行时也是如此。

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2021-09-07
    • 2017-02-04
    • 1970-01-01
    • 2017-01-05
    • 2014-11-14
    相关资源
    最近更新 更多