我可以给PCM缓冲区提供的最少量(可管理的)样本是多少?

时间:2015-09-16 13:21:37

标签: audio real-time pcm

某些API like this one可以从样本数组(由数字表示)创建PCM缓冲区。

说我想在(近)实时生成并播放一些音频。我可以生成一个包含100个样本的PCM缓冲区,并使用我的魔术API函数将它们从声卡中发送出去。当这100个样本正在播放时,会生成100多个样本,然后切换缓冲区。最后,我可以重复写入/播放/切换过程以创建一个恒定的音频流。

现在,我的问题。我可以使用写入/播放/切换方法的最小样本大小是多少,而音频流中没有可察觉的暂停?我理解这里的答案将取决于采样率,处理器速度和声卡的传输时间 - 所以请提供一个经验法则"如果它更合适就像回答一样!

(我对音频有点新鲜,所以请随时指出我可能有的任何误解!)

1 个答案:

答案 0 :(得分:1)

TL; DR:如果小心,可以在桌面操作系统上轻松实现1ms缓冲区;从性能和能源使用的角度来看,这可能并不可取。

缓冲区大小的下限(以及此输出延迟)受操作系统的最坏情况调度延迟的限制。

事件的顺序是:

  1. 音频硬件逐步从其缓冲区输出样本
  2. 在某些时候,它会达到一个低水位标记并产生一个中断,表明缓冲区需要补充更多的样本
  3. 操作系统为中断提供服务,并将线程标记为准备好运行
  4. 操作系统安排线程在CPU上运行
  5. 线程计算或以其他方式获取样本,并将它们写入输出缓冲区。
  6. 调度延迟是上述步骤2和4之间的时间,主要取决于主机操作的设计。如果使用硬件RTOS(例如VxWorks或eCos)以及先发制人优先级调度,则最坏情况可能是uS的分数。

    通用桌面操作系统通常不太流畅。 MacOSX支持实时用户空间调度,并且可以轻松地为1ms缓冲区提供服务。 Linux内核可以配置为先占实时线程和内核线程处理的下半部中断处理程序。你也应该能够在那里达到1ms的缓冲区大小。我无法评论最新版NT内核的功能。

    在步骤5中,当你的进程填充缓冲区时,如果它需要页面错误,也可以采取(通常很糟糕的)延迟命中。通常的做法是获取所需的所有堆和堆栈内存,并mlock()它,并将代码和数据编程到物理内存中。

    绝对忘记在解释或JITed语言运行时实现低延迟。你对语言运行时的作用控制得太少,并且没有阻止页面错误的现实前景(例如,用于内存分配)。我怀疑在这些情况下10ms会推动你的运气。

    值得注意的是,由于高中断率和上下文切换,渲染短缓冲区会对系统性能(和能耗)产生重大影响。它们以与实际工作不成比例的方式破坏L1缓存局部性。