我在Linux上使用ALSA和音频应用程序,我发现很棒的文档解释了如何使用它:1this one。尽管我有一些问题需要了解设置的这一部分:

 /* Set number of periods. Periods used to be called fragments. */
if (snd_pcm_hw_params_set_periods(pcm_handle, hwparams, periods, 0) < 0) {
  fprintf(stderr, "Error setting periods.\n");
  return(-1);
}

这是什么意思,请问我使用播放模式时设定了多个时间段
和:
/* Set buffer size (in frames). The resulting latency is given by */
/* latency = periodsize * periods / (rate * bytes_per_frame)     */
if (snd_pcm_hw_params_set_buffer_size(pcm_handle, hwparams, (periodsize * periods)>>2) < 0) {
  fprintf(stderr, "Error setting buffersize.\n");
  return(-1);
}

还有关于延迟的相同问题,我应该如何理解?

最佳答案

我假设您已经阅读并理解this section of linux-journal。您可能还会发现this blog在ALSA的上下文中阐明了有关时段大小选择(或博客中的片段)的信息。去引用:



缓冲区填充水平将在“满缓冲区”和“满缓冲区”之间振荡
缓冲区减去1x片段大小减去OS调度延迟”。设置
较小的片段大小会增加CPU负载并减少电池
时间,因为您迫使CPU唤醒频率更高。 OTOH增加
退出安全性,因为您较早填充了播放缓冲区。选择
因此,片段大小是您应该平衡的
您在功耗和跌落安全之间的需求。与现代
处理器和良好的操作系统调度程序(如Linux)来设置
片段大小不等于缓冲区大小的一半不会
很有道理。

...
(哦,ALSA用术语“期间”来称呼“碎片”
以上。这是同义词)

因此,从本质上讲,通常将period设置为2(就像在您引用的howto中所做的那样)。然后periodsize * period是您的总缓冲区大小(以字节为单位)。最后,latency是由许多样本的缓冲引起的延迟,可以通过将缓冲区大小除以回放样本的速率来计算(即,根据代码注释中的latency = periodsize * periods / (rate * bytes_per_frame)公式)。

例如,howto中的参数:

  • period = 2
  • periodsize = 8192字节
  • 速率= 44100Hz
  • 16位立体声数据(每帧4个字节)

  • 对应于period * periodsize = 2 * 8192 = 16384字节的总缓冲区大小,并且延迟为16384/(44100 * 4)〜0.093`秒。

    另请注意,您的硬件可能会对支持的周期大小有一些大小限制(请参阅this trouble shooting guide)

    关于c - ALSA中句号的含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24040672/

    10-12 16:04