我在Linux上使用ALSA和音频应用程序,我发现很棒的文档解释了如何使用它:1和this 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)