我如何使用 Apple 的 Core Audio C API 在 OS X 上创建一个简单的 real-time I/O 流?

How can I use Apple's Core Audio C API to create a simple, real-time I/O stream on OS X?

在花了相当长的时间遍历广泛的 Core Audio 文档迷宫之后,我仍然不确定我应该使用 C API 的哪一部分来创建基本音频样本 I/O 流在 OS X.

当我说 "I/O stream" 时,我的意思是为特定音频设备生成的 low-latency 流(具有采样率、通道数、位深度等参数)和 receives/requests 设备播放的交错音频样本缓冲区。

如果有人能指出我实现此目标所需的 header 和相关功能(甚至可能是一个示例),我将不胜感激:) 谢谢!

PS:通常我会使用 PortAudio 来实现这一点,但是在这种情况下,我有兴趣直接访问 Core Audio 框架,以帮助朋友创建一个纯 Rust 便携式音频平台。此外,我已将此问题发布到 Apple 开发者论坛,但尚未收到回复,所以我想我会在这里尝试。如果有更合适的exchange/forum询问,请告诉我。

完成此操作的最简单方法是使用 AudioComponentInstanceNew 实例化输出音频单元。创建实例后,安装将提供音频数据(实时)的渲染回调。 Apple 有两个可能有用的技术说明:TN2097 and TN2091。执行此操作的代码涉及一些样板,最终会变得有点长。以下是如何为默认输出设备创建输出音频单元的示例:

AudioComponent comp;
AudioComponentDescription desc;
AudioComponentInstance auHAL;

//There are several different types of Audio Units.
//Some audio units serve as Outputs, Mixers, or DSP
//units. See AUComponent.h for listing
desc.componentType = kAudioUnitType_Output;

//Every Component has a subType, which will give a clearer picture
//of what this components function will be.
desc.componentSubType = kAudioUnitSubType_HALOutput;

 //all Audio Units in AUComponent.h must use
 //"kAudioUnitManufacturer_Apple" as the Manufacturer
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;

//Finds a component that meets the desc spec's
comp = AudioComponentFindNext(NULL, &desc);
if (comp == NULL) exit (-1);

 //gains access to the services provided by the component
AudioComponentInstanceNew(comp, &auHAL);

可以使用第三方库来简化该过程。比较流行的是Novocaine,虽然我个人没用过

与iOS不同,在Mac上没有默认的IO或RemoteIO单元,输入和输出音频单元可能不同,因此必须单独确定和配置, 2 种不同的回调以及介于两者之间的类似循环缓冲区的东西。您可能需要列出或搜索所有可用的音频组件以查找能够输入的单元。

所需的 OS X 框架 headers 可能包括:

  • AudioToolbox/AudioToolbox.h
  • AudioUnit/AudioUnit.h
  • AudioUnit/AUComponent.h
  • AudioUnit/AudioComponent.h