Audio Unit(三):Audio Unit Development Fundamentals

当您开始创建音频单元时,Core audio的音频单元框架的强大功能和灵活性使您能够随时随地播放声音。然而,这种力量和灵活性也意味着,要想从正确的方向开始,还有很多东西需要学习。在本章中,您将鸟瞰这一前沿技术,为您迈向成为音频单元开发人员的第一步服务。
从这里开始,您可以快速了解音频单元的开发周期。然后,您将重点介绍什么是音频单元,并了解核心音频SDK在音频单元开发中的重要作用。您将了解音频单元在OSX中如何作为插件工作,以及如何与使用它们的应用程序协同工作。最后,介绍音频单元规范,以及它如何定义音频单元开发人员和应用程序开发人员都要编写的插件API。
阅读本章后,您将准备深入了解音频单元中介绍的架构和开发细节。
如果您想立即着手构建音频单元,现在可以跳过本章,直接转到教程:使用通用视图构建简单效果单元。在构建音频单元时,您可以参考本章以及本文档中的其他章节,了解与您所做工作相关的概念信息。

音频单元开发周期

音频单元开发通常遵循以下步骤:

  1. 设计音频单元:指定音频单元的操作、编程和用户界面以及捆绑配置信息。
  2. 创建并配置适当的Xcode项目。
  3. 实现音频单元,包括参数、出厂预设和属性,所有内容将在下一章中介绍;如果需要,实施拷贝保护;实现合成、DSP或数据格式转换代码。
  4. 如果需要,实现称为自定义视图的图形用户界面。如果需要,实施参数自动化支持。
  5. 验证并测试音频单元。
  6. 通过将音频单元捆绑包打包到安装程序中或提供安装说明来部署音频单元捆绑包。

与任何软件开发一样,这些步骤通常都需要迭代。
本文档后面的教程“教程:使用常规视图构建简单效果单元”将引导您完成其中大部分步骤。

什么是音频单元?

音频单元(在头文件和其他地方通常缩写为AU)是一个OS X插件,用于增强数字音频应用程序,如Logic Pro和GarageBand。您还可以使用音频单元将音频功能构建到自己的应用程序中。以编程方式,音频单元打包为捆绑包,并配置为OSX组件管理器定义的组件。
在更深的层次上,根据你的观点,音频单元是两种截然不同的东西之一。
从内部看,音频单元开发人员可以看到,音频单元是标准插件API中的可执行实现代码。API是标准的,因此任何设计用于音频单元的应用程序都知道如何使用您的API。API由音频单元规范定义。
音频单元开发人员可以通过音频单元参数机制为用户或应用程序添加实时控制音频单元的能力。参数是自描述的;它们的值和功能对使用音频单元的应用程序可见。
从外部看,从使用音频单元的应用程序来看,音频单元只是其插件API。此插件API允许应用程序查询音频单元的特定功能,这些功能由音频单元开发人员定义为参数和属性。
由于这种封装,如何实现音频单元取决于您自己。最快的方法,苹果所认可的,以及在本文中描述的,是对可自由下载的核心音频SDK的适当C++类的子类进行分类。

音频单元编程结构和生命周期

下图表示使用SDK构建的正在运行的音频单元。此图在上下文中显示音频单元及其视图和使用音频单元的主机应用程序:
在这里插入图片描述
此图显示音频单元束的两个不同内部部分:左侧为音频单元本身,右侧为音频单元视图。音频单元执行音频工作。该视图为音频单元提供图形用户界面,如果您提供,还支持参数自动化。(请参阅Supporting Parameter Automation。)当您创建一个音频单元时,通常会将这两个部分打包在同一个捆绑包中,就像您稍后学习的那样,但它们在逻辑上是独立的代码。
音频单元、其视图和主机应用程序通过主机应用程序设置的通知中心相互通信。这允许所有三个实体保持同步。通知中心的功能是核心音频单元事件API的一部分。
当用户第一次启动主机应用程序时,音频单元及其视图都不会实例化。在此状态下,除主机应用程序外,图1-1中所示的所有部件均不存在。
音频单元及其视图以两种方式之一存在并发挥作用:

  • 通常,用户向主机应用程序指示他们希望使用音频单元。例如,用户可以要求主机对音频通道应用混响效果。
  • 对于为自己的应用程序添加功能而提供的音频单元,应用程序可能会在应用程序启动时直接打开音频单元。
    当主机打开音频单元时,它会将音频单元挂接到图中淡黄色(音频数据)箭头所示的主机音频数据链上。这个连接有两个部分:向音频单元提供新的音频数据,以及从音频单元检索处理过的音频数据。
  • 为了向音频单元提供新的音频数据,主机定义了一个回调函数(由音频单元调用),该函数一次提供一个片段的音频数据。片是音频数据的若干帧。帧是所有通道中音频数据的一个样本。
  • 要从音频单元检索处理过的音频数据,主机将调用音频单元的渲染方法。
    以下是音频数据流如何在主机应用程序和音频单元之间进行:
  1. 主机调用音频单元的render方法,有效地向音频单元请求处理过的音频数据片段
  2. 音频单元通过调用主机的回调函数来响应,以获取要处理的音频数据样本片段
  3. 音频单元处理音频数据样本,并将结果放入输出缓冲区,以便主机检索
  4. 主机检索处理后的数据,然后再次调用音频单元的渲染方法
    在图1-1中音频单元的描述中,外部立方体表示插件API。Apple提供了音频单元规范,该规范定义了各种音频单元类型的插件API。当您按照此规范开发音频单元时,它将与任何也遵循此规范的主机应用程序一起工作。
    在内部,音频单元包含编程支架,用于将插件API连接到自定义代码。当使用核心音频SDK来构建音频单元时,这个脚手架以组件代码的形式粘贴到组件管理器中,并提供C++类层次结构。图1-1(相当形象地)将您的自定义代码表示为音频单元中的内部多维数据集,并将SDK的类和粘合代码表示为将内部多维数据集连接到外部多维数据集的struts。
    您可以在不使用Core audio SDK的情况下构建音频单元,但这样做需要做更多的工作。Apple建议您使用Core Audio SDK进行除最专业的音频单元开发之外的所有开发。
    要了解音频单元的内部架构,请阅读音频单元中的音频单元架构。
音频单元文件结构

OS X文件系统中的音频单元如下所示:
在这里插入图片描述
当您使用Xcode和提供的音频单元模板构建音频单元时,您的Xcode项目负责适当地打包所有这些部分。
作为一个组件,音频单元具有以下文件系统特征:

  • 它是一个具有.component文件扩展名的捆绑包
  • 它是一个包裹;用户在Finder中查看捆绑包时,会将其视为不透明的
    捆绑包顶级内容文件夹中的信息属性列表(Info.plist)文件为系统和希望使用音频单元的主机应用程序提供关键信息。例如,此文件提供:
  • 反向域名(或统一类型标识符)形式的唯一捆绑标识字符串。例如,对于Core audio SDK中提供的FilterDemo音频单元,该标识符为com.apple.demo.audiounit.FilterDemo。
  • 捆绑包中的文件名,即音频单元本身。此文件位于捆绑包中的MacOS文件夹中。
    音频单元包可以包含一个称为视图的自定义用户界面。视图的标准位置在audio unit bundle的Resources文件夹中。图1-2所示的音频单元包括这样一个视图,它本身打包为一个不透明的包。查看audio unit view bundle内部显示了view bundle文件结构:
    在这里插入图片描述
    当主机应用程序打开音频单元时,它可以询问音频单元是否具有自定义视图。如果有,音频单元可以通过提供视图束的路径进行响应。您可以将视图包放在任何
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值