C++中的实时音频处理

real time audio processing in C++

我想制作从外部音频接口 (Focusrite Scarlett 2i2) 读取原始音频并在返回到接口进行播放之前用 C++ 处理它的软件。我目前 运行 Windows 8 并且想知道如何以最小的延迟来做到这一点?

我花了一段时间研究 (boost) ASIO,但文档似乎很差。我也一直在考虑 OpenCL,但有人告诉我它很可能会有更高的延迟。理想情况下,我希望能够直接访问 Focusrite 驱动程序。

很抱歉,这是一个悬而未决的问题,但我在寻找有关音频编程的教育材料时遇到了一些麻烦,除了在第三方插件设计套件(如 RackAFX)提供时处理音频之外.如果有人可以推荐一些像这样的低级内容,我也将不胜感激。

您可以通过直接与 Focuswrite ASIO 驱动程序通信来获得非常低的延迟(这与 boost ASIO 完全不同)。要使用它,您需要从 Steinberg 注册并下载 ASIO SDK。在 API 下载中有一个名为 hostsample 的 Visual C++ 示例项目,这是一个很好的起点,并且有关于 ASIO 使用的缓冲过程的非常好的文档。

ASIO 使用双缓冲。您的应用程序能够在驱动程序的限制范围内选择缓冲区大小。对于每个输入通道和每个输出通道,创建 2 个该大小的缓冲区。当驱动程序在一组缓冲区中播放和录制时,您的程序正在读取和写入另一组缓冲区。如果您的程序正在执行一个简单的环回,那么它将在记录后访问输入 1 个缓冲期,将直接写入将在下一个周期播放的输出缓冲区,因此会有 2 个缓冲期的延迟。您需要尝试找到您可以容忍的最小缓冲区大小而不会出现故障,这将为您提供最低的延迟。当然,信号处理代码需要优化得足够好才能跟上。 64 个样本(1.3 ms @ 48kHz)并非闻所未闻。