使用Core Audio的代码可以在iOS和MacOS上兼容吗?

Core Audio是iOS和MacOS的audio框架。 从苹果自己的文档中 ,我可以看到在实现方面存在差异。 最值得注意的是iOS样本格式(针对iOS的固定点和针对macOS的32位浮点数),iOS不支持Core Audio的所有方面。

当编写代码来实现两个平台都支持的东西时,是否可以编写一次代码并真正移植它? 如果答案是“是的,但仅限于某些方面”,请详细解释。

我们来看一个现场audio合成的例子。 我想打开audio输出stream,并使用callback方法将样本放置在输出缓冲区中。 我知道这可以在iOS和MacOS上完成,但是当我查找库时,它们似乎不支持这两者。 这些图书馆是否真的可以支持这两个平台,或者有一个根本原因阻止了这个?

例如:

  • RTaudio的API说明表明这个库支持macOS,但不支持iOS。
  • PortAudio库文档支持macOS,但没有提到iOS。

规范示例格式现在是iOS上的立体浮点数32。

MacOS支持自定义v3和v2audio单元,而iOS支持自定义v3audio单元,但只提供系统提供的v2audio单元。

AVAudioEngine和朋友在Swift / ObjC中包装了大部分核心audioC API,我相信如果有平台差异的话,很less有。 我build议首先尝试AVAudioEngine,然后使用C API,如果它不符合您的需要。

很多C API都是跨平台的,但是有一些地方只能在macOS上支持,或者只在iOS上支持。 你可以通过标题来查看差异。 例如,以下是输出audio单元子types的定义(删除了文档)。

#if !TARGET_OS_IPHONE CF_ENUM(UInt32) { kAudioUnitSubType_HALOutput = 'ahal', kAudioUnitSubType_DefaultOutput = 'def ', kAudioUnitSubType_SystemOutput = 'sys ', }; #else CF_ENUM(UInt32) { kAudioUnitSubType_RemoteIO = 'rioc', }; #endif 

如果你想编写一个跨平台的包装器,你必须在平台细节上使用预处理器指令。 以下是一个跨平台的函数,它使用平台特定的子types为输出audio单元创build一个AudioComponentDescription。

 AudioComponentDescription outputDescription() { AudioComponentDescription description; description.componentType = kAudioUnitType_Output; description.componentManufacturer = kAudioUnitManufacturer_Apple; description.componentFlags = 0; description.componentFlagsMask = 0; #if TARGET_OS_IPHONE description.componentSubType = kAudioUnitSubType_RemoteIO; #else description.componentSubType = kAudioUnitSubType_DefaultOutput; #endif return description; } 

还有一些其他audio单元仅在iOS或MacOS上支持,pipe理“系统”级audio交互的API完全不同。 MacOS使用C API,而iOS使用AVAudioSession。

我敢肯定我错过了一些东西:)