c – ALSA期间的含义

我在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的背景下澄清了与期间大小选择(或博客中的片段)有关的事情.报价:

You shouldn’t misuse the fragments logic of sound devices. It’s like
this:

The latency is defined by the buffer size.
The wakeup interval is defined by the fragment size.

  
  缓冲器填充水平将在“完全缓冲”和“满”之间振荡
  缓冲区减去1x片段大小减去OS调度延迟’.设置
  较小的片段大小会增加CPU负载并减少电池电量
  自从强制CPU更频繁地唤醒以来的时间. OTOH它增加了
  因为你先填满了播放缓冲区,所以安全性会降低.选择
  因此,片段大小是你应该做的平衡
  您在功耗和辍学安全之间的需求.随着现代
  处理器和一个良好的操作系统调度程序,如Linux设置
  片段大小不是缓冲区大小的一半而不是
  很有意义.
  
  …
  (哦,ALSA使用术语’句号’代表我所说的’片段’
  以上.这是同义词)

基本上,通常将句点设置为2(如您引用的howto中所做的那样).然后,句点*周期是您的总缓冲区大小(以字节为单位).最后,latency是由许多样本的缓冲引起的延迟,并且可以通过将缓冲区大小除以样本被回放的速率来计算(即,根据公式等待时间=周期大小*周期/(代码注释中的rate * bytes_per_frame).

例如,howto中的参数:

>期间= 2
> periodsize = 8192个字节
> rate = 44100Hz
> 16位立体声数据(每帧4个字节)

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

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

上一篇:linux – ALSA:snd_pcm_writei调用的缓冲区欠载


下一篇:C语言中的数组问题