我想生产从外部音频接口(Focusrite Scarlett 2i2)读取原始音频的软件,并在将其返回到接口进行播放之前用C ++处理。我目前运行Windows 8,并想知道如何以最小延迟执行此操作?
我花了一些时间研究(提升)ASIO,但文档似乎相当差。我也一直在考虑OpenCL,但我被告知它很可能会有更高的延迟。理想情况下,我希望能够直接访问Focusrite驱动程序。
我很抱歉这是一个如此开放的问题,但我在寻找音频编程的教育资料方面遇到了一些麻烦,而不仅仅是在第三方插件设计套件(例如RackAFX)中提供音频时。如果有人能推荐一些像这样的低级别的东西,我也会感激不尽。
答案 0 :(得分:4)
通过直接与Focuswrite ASIO驱动程序通信,您可以获得非常低的延迟(这与boost ASIO完全不同)。要使用此功能,您需要从Steinberg注册并下载ASIO SDK。在API下载中有一个名为hostsample的Visual C ++示例项目,这是一个很好的起点,并且有关于ASIO使用的缓冲过程的非常好的文档。
ASIO使用双缓冲。您的应用程序可以在驱动程序的限制范围内选择缓冲区大小。对于每个输入通道和每个输出通道,将创建该大小的2个缓冲区。当驱动程序正在播放并录制到一组缓冲区时,程序正在读取并写入另一组缓冲区。如果你的程序正在执行一个简单的环回,那么在它被记录之后就可以访问输入1缓冲周期,它将直接写入输出缓冲区,这将在下一个周期播放,因此将有2个缓冲周期的延迟。您需要尝试找到可以容忍的最小缓冲区大小而不会出现故障,这将为您提供最低的延迟。当然,信号处理代码需要进行足够的优化才能跟上。 64个样本(1.3毫秒@ 48kHz)并非闻所未闻。