我想做一件非常简单的事情:从内存中播放PCM音频数据。
音频样本将来自声音合成算法、预加载的样本文件或其他任何东西。我的问题实际上是关于如何发挥缓冲区,而不是如何用数据填充它们。
因此,我正在寻找最好的方法来重新实现我的旧的、不推荐使用的AudioWrapper(它基于AudioUnits V1),但我在Apple文档中找不到满足以下要求的API:
- 与10.5到10.7兼容
- 在ios中可用
- 不依赖于第三方库
- 经得起未来考验(例如:不基于碳,64位…)
我正在考虑使用OpenAL,但它真的是最好的选择吗?我看到过关于它的负面意见,它可能过于复杂和过于夸张,并且可能会增加性能开销?
更糟糕的是,我可能有两个不同的AudioWrapper实现,但如果可能的话,我真的希望避免每个系统都有一个版本(ios,10.5,10.6,10.7…)。此外,它将在C++中。
编辑:我需要一个良好的延迟,系统必须在20ms以下对用户交互做出响应(缓冲区必须在44KHz下的128到512个样本之间)
AudioQueues非常常见。然而,它们的I/O缓冲区大小足够大,不适合交互式I/O(例如合成器)。
为了降低延迟,请尝试AudioUnits——MixerHost示例可能是一个很好的起点。
不确定OS X 10.5,但我直接使用Audio Units API在OS X 10.6、10.7和iOS 3.X到5.X上进行低延迟音频分析和合成。我推广API的包装文件只有几百行纯C,并带有一些ifdef。
音频队列的延迟对于我在iOS上的低延迟来说太高了,而iOS RemoteIO音频单元似乎允许以44100采样率的缓冲区短至256个样本(但有时在显示器关闭时仅降至1024个)。