使用核心音频的代码是否可以跨iOS&;兼容;马科斯?

使用核心音频的代码是否可以跨iOS&;兼容;马科斯?,ios,macos,core-audio,Ios,Macos,Core Audio,核心音频是iOS和macOS的音频框架。从中,我可以看出在实现上存在差异。最值得注意的似乎是示例格式(iOS为定点,macOS为32位浮点),iOS不支持核心音频的所有方面 当编写代码以实现两个平台都支持的功能时,是否可以编写一次代码并将其真正移植?如果答案是“是的,但仅在某些方面”,请进一步解释 让我们以实时音频合成为例。我想打开一个音频输出流,并使用回调方法将样本放入输出缓冲区。我知道这可以在iOS和macOS上实现,但当我查找库时,它们似乎并不同时支持这两个。这些库是否真的支持这两种平台,

核心音频是iOS和macOS的音频框架。从中,我可以看出在实现上存在差异。最值得注意的似乎是示例格式(iOS为定点,macOS为32位浮点),iOS不支持核心音频的所有方面

当编写代码以实现两个平台都支持的功能时,是否可以编写一次代码并将其真正移植?如果答案是“是的,但仅在某些方面”,请进一步解释

让我们以实时音频合成为例。我想打开一个音频输出流,并使用回调方法将样本放入输出缓冲区。我知道这可以在iOS和macOS上实现,但当我查找库时,它们似乎并不同时支持这两个。这些库是否真的支持这两种平台,或者有什么根本原因阻止了这一点

例如:

  • for建议此库支持macOS,但不支持iOS
  • 库文档支持macOS,但没有提到iOS

    • iOS上的标准样本格式现在也是立体声浮点32

      MacOS支持自定义v3和v2音频单元,而iOS支持自定义v3音频单元,但仅支持系统提供的v2音频单元

      AVAudioEngine和朋友们用Swift/ObjC封装了大部分的核心音频C API,我相信平台之间没有什么区别。我建议先尝试AVAudioEngine,如果它不能满足您的需求,那么就使用C API

      大部分C API都是跨平台的,但也有一些领域仅在macOS或iOS上受支持。您可以通过标题查看差异。例如,以下是输出音频单元子类型的定义(文档已删除)

      如果要编写跨平台包装器,必须围绕平台细节使用预处理器指令。这是一个跨平台函数,它使用特定于平台的子类型为输出音频单元创建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;
      }
      
      其他一些音频单元仅在iOS或macOS上受支持,而管理“系统”级音频交互的API则完全不同。MacOS使用C API,而iOS使用音频


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

      谢谢,戴夫。你也证实了我的怀疑。新文档是最新的参考,但没有任何示例/示例/解释,而我引用的旧文档有解释,但已经过时。就我个人而言,我喜欢从
      AVAudioEngine
      开始,然后因为bug而损失一周左右的时间,最后用
      HALOutput
      /
      RemoteIO
      音频单元重写。我什么时候学习?
      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;
      }