C++ 中的实时音频处理

Aar*_*ear 0 c++ audio latency

我想制作一个从外部音频接口 (Focusrite Scarlett 2i2) 读取原始音频并用 C++ 对其进行处理的软件,然后将其返回到接口进行播放。我目前运行的是 Windows 8,想知道如何以最小的延迟执行此操作?

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

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

jak*_*ket 5

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

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