|
Core Audio 是 iOS 和 OS X 的数字音频基础设施。它包括一组软件框架,旨在处理应用程序中的音频需求。 阅读本章以了解使用 Core Audio 可以做什么。
iOS 和 OS X 中的 Core Audio
Core Audio 紧密集成到 iOS 和 OS X 中,以实现高性能和低延迟。
在 OS X 中,大多数 Core Audio 服务都位于硬件抽象层 (HAL) 之上,如图 1-1 所示。 音频信号通过 HAL 从硬件传入和传出到硬件。 当你需要实时音频时,你可以使用 Core Audio 框架中的音频硬件服务访问 HAL。 Core MIDI(乐器数字接口)框架为处理 MIDI 数据和设备提供了类似的接口。
你可以在 Audio Toolbox 和 Audio Unit 框架中找到 Core Audio 应用级服务。
使用音频队列服务(Audio Queue Services)录制、播放、暂停、循环和同步音频。
使用音频文件、转换器和编解码器服务(Audio File, Converter, and Codec Services)从磁盘读取和写入并执行音频数据格式转换。 在 OS X 中,你还可以创建自定义编解码器。
使用音频单元服务和音频处理图服务(在图中表示为“Audio units”)在你的应用程序中托管音频单元(音频插件)。 在 OS X 中,你还可以创建自定义音频单元以在你的应用程序中使用或提供给其他应用程序使用。
使用 Music Sequencing Services 播放基于 MIDI 的控制和音乐数据。
使用 Core Audio Clock Services 进行音频和 MIDI 同步以及时间格式管理。
使用系统声音服务(图中表示为“System sounds”)播放系统声音和用户界面音效。
iOS 中的 Core Audio 针对电池供电的移动平台中可用的计算资源进行了优化。 对于必须由操作系统(特别是 HAL 和 I/O 套件)严格管理的服务,没有 API。 但是,iOS 中还有一些 OS X 中没有的附加服务。例如,音频会话服务允许你在充当移动电话和 iPod 的设备的上下文中管理应用程序的音频行为。 图 1-2 提供了 iOS 中音频架构的高级视图。
一点关于数字音频和线性 PCM
大多数 Core Audio 服务使用和处理线性脉冲编码调制(线性 PCM)格式的音频,这是最常见的未压缩的数字音频数据格式。 数字音频记录通过定期测量模拟(现实世界)音频信号的幅度(采样率)并将每个样本转换为数值来创建 PCM 数据。 标准光盘 (CD) 音频使用 44.1 kHz 的采样率,使用 16 位整数描述每个样本 — 构成分辨率或位深度。
样本是单个通道的单个数值。
一帧是时间一致的样本的集合。 例如,立体声文件每帧有两个样本,一个用于左声道,一个用于右声道。
数据包是一个或多个连续帧的集合。 在线性 PCM 音频中,一个数据包始终是一个帧。 在压缩格式中,它通常更多。 数据包定义了给定音频数据格式的最小有意义的帧集。
在线性 PCM 音频中,样本值随它所代表的原始信号的幅度线性变化。 例如,标准 CD 音频中的 16 位整数样本允许在静音和最大级别之间有 65,536 个可能的值。 从一个数字值到下一个数字值的幅度差异始终相同。
在 CoreAudioTypes.h 头文件中声明的 Core Audio 数据结构可以描述任何采样率和位深度的线性 PCM。 音频数据格式 对此主题进行了更详细的介绍。
在 OS X 中,Core Audio 要求音频数据采用本地字节序、32 位浮点、线性 PCM 格式。 你可以使用音频转换器服务(Audio Converter Services)在不同的线性 PCM 变体之间转换音频数据。 你还可以使用这些转换器在线性 PCM 和压缩音频格式(如 MP3 和 Apple Lossless)之间进行转换。 OS X 中的 Core Audio 提供编解码器来转换最常见的数字音频格式(尽管它不提供用于转换为 MP3 的编码器)。
iOS 使用整数和定点音频数据,结果是处理音频时更快的计算和更少的电池消耗。 iOS 提供了一个 Converter 音频单元,并包含来自 Audio Converter Services 的接口。 有关 iOS 和 OS X 的所谓规范音频数据格式的详细信息,请参阅 规范音频数据格式。
在 iOS 和 OS X 中,Core Audio 支持用于存储和播放音频数据的最常见文件格式,如 iPhone 音频文件格式 和 OS X 中支持的音频文件和数据格式 中所述。
音频单元(Audio units)
音频单元是处理音频数据的软件插件。 在 OS X 中,一个音频单元可以同时被无限数量的通道和应用程序使用。
iOS 提供了一组针对移动平台上的效率和性能进行了优化的音频单元。 你可以开发用于 iOS 应用程序的音频单元。 因为你必须将自定义音频单元代码静态链接到你的应用程序中,所以你开发的音频单元不能被 iOS 中的其他应用程序使用。
iOS 中提供的音频单元没有用户界面。 它们的主要用途是在你的应用程序中提供低延迟音频。 有关 iPhone 音频单元的更多信息,请参阅 核心音频插件:音频单元和编解码器。
在你开发的 Mac 应用程序中,你可以使用系统提供的或第三方提供的音频单元。 你还可以自行开发音频单元作为产品。 用户可以在 GarageBand 和 Logic Studio 等应用程序以及许多其他音频单元托管应用程序中使用你的音频单元。
一些 Mac 音频单元在幕后工作,为你简化常见任务,例如拆分信号或与硬件连接。 其他人则以自己的用户界面出现在屏幕上,以提供信号处理和操纵。 例如,效果器可以模仿现实世界中的对应物,例如吉他手的失真盒。 其他音频单元生成信号,无论是以编程方式还是响应 MIDI 输入。
音频单元的一些示例是:
信号处理器(例如,高通滤波器、混响、压缩器或失真单元)。 它们中的每一个通常都是一个效果单元,并以类似于硬件效果盒或外置信号处理器的方式执行数字信号处理 (DSP)。
乐器或软件合成器。 这些被称为乐器单元(或有时称为音乐设备),通常会生成音符以响应 MIDI 输入。
一个信号源。 与乐器单元不同,发生器单元不是由 MIDI 输入激活,而是通过代码激活。 例如,生成器单元可能计算并生成正弦波,或者它可能从文件或网络流中获取数据。
硬件输入或输出的接口。 有关 I/O 单元的更多信息,请参阅 硬件抽象层 和 与硬件的接口。
格式转换器。 转换器单元可以在两个线性 PCM 变体之间转换数据,合并或拆分音频流,或者执行时间和音高变化。 有关详细信息,请参阅 核心音频插件:音频单元和编解码器。
混音器或声像单元。 混音器单元可以组合音轨, 声像单元可以应用立体声或 3D 声像效果。
离线工作的效果器。 离线效果单元执行的工作要么过于占用处理器资源,要么根本不可能实时完成。 例如,对文件执行时间反转的效果必须离线应用。
在 OS X 中,你可以按照你或你的最终用户需要的任何排列方式混合和匹配音频单元。 图 1-3 显示了一个简单的音频单元链。 有一个仪器单元可以根据从外接 MIDI 键盘接收到的控制数据生成音频信号,生成的音频然后通过效果单元以应用带通滤波和失真。 音频单元链称为音频处理图。
如果你开发的音频 DSP 代码希望用于多个应用程序,你应该将你的代码打包为一个音频单元。
如果你开发 Mac 音频应用程序,支持音频单元可让你和你的用户利用现有音频单元库(第三方和 Apple 提供)来扩展应用程序的功能。
要在 OS X 中试验音频单元,请参阅 AU Lab 应用程序,该应用程序位于 /Developer/Applications/Audio 的 Xcode Tools 安装中。 AU Lab 允许你混合和匹配音频单元,以通过输出设备从音频源构建信号链。
有关 OS X v10.5 和 iOS 2.0 附带的音频单元的列表,请参阅 OS X 中的系统提供的音频单元。
硬件抽象层
Core Audio 使用硬件抽象层 (HAL) 为应用程序与硬件交互提供一致且可预测的接口。 HAL 还可以为你的应用程序提供计时信息,以简化同步或调整延迟。
在大多数情况下,你的代码不会直接与 HAL 交互。 Apple 提供了一个特殊的音频单元——在 OS X 中称为 AUHAL 单元,在 iOS 中称为 AURemoteIO 单元——它允许你将音频从另一个音频单元传递到硬件。 类似地,来自硬件的输入通过 AUHAL 单元(或 iOS 中的 AURemoteIO 单元)路由,并可供后续音频单元使用,如图 1-4 所示。
图 1-4 通过 HAL 和 AUHAL 单元的硬件输入
AUHAL 单元(或 AURemoteIO 单元)还负责在音频单元和硬件之间转换音频数据所需的任何数据转换或通道映射。
OS X 中的 MIDI 支持
Core MIDI 是 Core Audio 中支持 MIDI 协议的部分。 (MIDI 在 iOS 中不可用。)Core MIDI 允许应用程序与键盘和吉他等 MIDI 设备进行通信。 来自 MIDI 设备的输入可以存储为 MIDI 数据或用于控制乐器单元。 应用程序还可以将 MIDI 数据发送到 MIDI 设备。
Core MIDI 抽象化表示 MIDI 设备并模拟标准 MIDI 电缆连接(MIDI In、MIDI Out 和 MIDI Thru),同时提供低延迟输入和输出。 Core Audio 还支持音乐播放器编程接口,你可以使用它来播放基于 MIDI 的控制或音乐数据。
有关 MIDI 协议功能的更多详细信息,请参阅 MIDI 制造商协会网站 Home。
音频 MIDI 设置应用程序
音频 MIDI 设置应用程序允许用户:
指定默认的音频输入和输出设备。
配置输入和输出设备的属性,例如采样率和位深度。
将音频通道映射到可用扬声器(用于立体声、5.1 环绕声等)。
创建聚合设备。 (有关聚合设备的信息,请参阅 使用聚合设备。)
配置 MIDI 网络和 MIDI 设备。
你可以在 /Applications/Utilities 文件夹中找到音频 MIDI 设置。
Mac Core 录音室
传统的非基于计算机的录音室可以作为接近 Core Audio 的概念框架。 这样的工作室可能有一些“真实”的乐器和效果器为混音台提供信号,如图 1-5 所示。 混音器可以将其输出路由到录音室监视器和录音设备(此处以相当复古的方式显示为磁带录音机)。
图 1-5 一个简单的非计算机录音棚
传统工作室中的许多部分都可以用基于软件的等价物代替——所有这些你在本章中已经遇到过。 在桌面计算平台上,数字音频应用程序可以录制、合成、编辑、混合、处理和回放音频。 他们还可以录制、编辑、处理和播放 MIDI 数据,与硬件和软件 MIDI 乐器连接。 Mac 应用程序依靠 Core Audio 服务来处理所有这些任务,如图 1-6 所示。
如你所见,音频单元可以构成音频信号链的大部分。 其他 Core Audio 接口提供应用程序级支持,允许应用程序获取各种格式的音频或 MIDI 数据并将其输出到文件或输出设备。 Core Audio Services 更详细地讨论了 Core Audio 的组成接口。
Core Audio 让你做的不仅仅是在台式电脑上模仿录音室。 从播放音效到创建压缩音频文件,再到为游戏玩家提供身临其境的声音体验,你都可以使用它。
在 iPhone 或 iPod touch 等移动设备上,音频环境和计算资源经过优化以延长电池寿命。 毕竟,iPhone 最基本的身份就是电话。 从开发或用户的角度来看,将 iPhone 置于虚拟录音室的核心是没有意义的。 另一方面,iPhone 的特殊功能——包括超便携性、内置 Bonjour 网络、多点触控界面以及加速度计和位置 API——让你可以想象和创建在桌面上无法实现的音频应用程序。
使用 Core Audio SDK 进行 Mac 开发
为了帮助音频开发人员,Apple 为 OS X 中的 Core Audio 提供了一个软件开发工具包 (SDK)。SDK 包含许多代码示例,涵盖音频、 MIDI 服务、诊断工具和测试应用程序。 示例包括:
与系统的全局音频状态交互的测试应用程序,包括附加的硬件设备 (HALLLab)。
参考音频单元托管应用程序 (AU Lab)。 AU Lab 应用程序对于测试你创建的音频单元至关重要,如 音频单元 中所述。
加载和播放音频文件 (PlayFile) 和 MIDI 文件 (PlaySequence) 的示例代码。
本文档指向 Core Audio SDK 中的其他示例,说明如何完成常见任务。
SDK 还包含一个用于为 OS X 构建音频单元的 C++ 框架。该框架通过将你与 Component Manager 插件接口的细节隔离开来简化你需要完成的工作量。 SDK 还包含常见音频单元类型的模板; 在大多数情况下,你只需要覆盖那些适用于你的自定义音频单元的方法。 一些示例音频单元项目显示了这些正在使用的模板和框架。 有关使用框架和模板的更多详细信息,请参阅 音频单元编程指南。 |
|