ALSA期间的含义

Eng*_*ine 17 c linux audio alsa

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

 /* 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);
}
Run Code Online (Sandbox Code Playgroud)

什么意思是设置我使用PLAYBACK模式时的一段时间,并且:

/* 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Sle*_*Eye 13

我假设你已经阅读并理解了linux-journal的这一部分.您可能还会发现此博客在ALSA的上下文中阐明了有关期间大小选择(或博客中的片段)的内容.报价:

你不应该滥用声音设备的片段逻辑.就像这样:

延迟由缓冲区大小定义.
唤醒间隔由片段大小定义.

缓冲区填充水平将在"完全缓冲区"和"完全缓冲区减去1x片段大小减去OS调度延迟"之间振荡.设置较小的片段大小会增加CPU负载并缩短电池使用时间,因为您强制CPU更频繁地唤醒.OTOH它会增加安全性,因为你早先填满了播放缓冲区.因此,选择片段大小是您应该在功耗和辍学安全之间平衡的需求.使用现代处理器和Linux之类的良好操作系统调度程序,将片段大小设置为缓冲区大小的一半以外的任何内容都没有多大意义.

......(哦,ALSA使用术语'句号'来表示上面我称之为'片段'.它是同义词)

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

例如,howto的参数:

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

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

另请注意,您的硬件可能对支持的时间段大小有一些大小限制(请参阅此故障排除指南)


CL.*_*CL. 5

当应用程序尝试将样本写入缓冲区时,如果缓冲区已满,则进程进入睡眠状态。它通过中断被硬件唤醒;该中断在每个周期结束时引发。

每个缓冲区应该至少有两个周期;否则,当发生唤醒时缓冲区已经是空的,这会导致欠载。

增加周期数(即减少周期大小)可以增加针对由调度或处理延迟引起的欠载的安全裕度。

延迟与缓冲区大小成正比:当您完全填满缓冲区时,只有在播放完所有其他样本后,硬件才会播放最后写入的样本。