文章目录
Windows Core Audio APIs(一)介绍
Core Audio APIs是Windows Vista(Windows NT 6.0)推出的一个通用音频架构(Universal Audio Architecture简称UAA)的API。这是一套全新的基于用户模式的音频组件。他具备以下优势:
- 低延迟、具备故障恢复的音频流
- 提高可靠性(许多音频函数已从内核模式移到了用户模式)
- 提高安全性(受保护的音频内容的处理在安全、低权限的进程中进行)
- 将特定的系统范围角色(控制台、多媒体和通信)分配给单独的音频设备。
- 对用户直接操作的音频终结点设备(例如扬声器、耳机和麦克风)进行了软件抽象
Core Audio 架构介绍
大多数的Windows采集播放的API都是基于Core Audio APIs。很多流行的Windows音视频客户端都是基于Core Audio APIs,例如 obs-studio。
Core Audio 架构图
UUA 架构如下图所示
音频高级API
一些常见的音频高级API,都是基于Core Audio APIs。
使用这些高级API的好处是API会自动在应用程序使用的流格式和音频设备使用的格式之间进行转换。这些API包括:
- Direct Audio(Direct Music 和Direct Sound),Direct Music间接通过Direct Sound访问Core Audio APIs。
- Windows MultiMedia (WaveXxx Functions 和MixerXxx Funtions)
- Media Foundation
Core Audio APIs
Core Audio Api 要求应用程序流使用与设备使用的格式相同的格式,或与设备使用的格式密切相关。因此,使用Core Audio Api 播放或采集音频流的应用程序可能需要在流格式之间进行部分或全部转换。
Core Audio Api 由以下几类APIs组成:
- Multimedia Device(MMDevice)API。客户端使用此 API 枚举系统中的音频终结点设备
- Windows Audio Session API(WASAPI)。客户端使用此 API 创建和管理从音频终结点设备来的(以及要送到音频终结点设备的)音频流。
- DeviceTopology API。客户端使用此 API 直接访问拓扑功能 (例如,音量控制和多路复用 (multiplexers) ),这些功能位于音频适配器内硬件设备内的数据通道中。
- EndpointVolume API。客户端使用此 API 直接访问音频终结点设备上的音量控制。 此 API 主要由管理独占模式音频流的应用程序使用。
共享模式和独占模式
UAA 提供了两种模式来访问音频终结点设备,共享模式和独占模式,
共享模式(Share Mode)
- 该模式下多个应用程序共享音频设备。
- 该模式下只能混合PCM流格式
- 音频引擎可以在应用程序使用的标准PCM样本大小与引擎用于内部处理的浮点示例之间进行转换
- 应用程序流的格式通常必须与设备使用的流格式具有相同数量的通道和相同的采样率。
- 播放时客户端程序将数据写入音频终结点设备缓冲区(共享模式下由windows 音频服务分配可同时由应用程序和音频引擎跨进程访问的缓冲区),音频引擎从该缓冲区读取数据。音频引擎混合了从多个应用程序而来的音频流,并通过硬件播放混合后的音频流。
- 采集时,音频引擎将数据写入音频终结点缓冲区,客户端程序从缓冲区读取数据。音频引擎将输入设备的音频流
独占模式(Exclusive Mode)
- 该模式下单个应用程序独占音频设备
- 该模式可以传输非PCM格式的流
- 在独占模式下仅支持具有固定数据速率的非 PCM 格式
- 应用程序必须使用音频硬件显式支持的流格式
- 播放时该模式不经过音频引擎,直接将数据写入终结点设备缓冲区(独占模式下缓冲区驻留在应用程序和音频硬件都可以访问的内存中)。
- 采集时,该模式不经过音频引擎,引用程序直接从音频终结点设备缓冲区读取数据
- 一般对延迟有极端要求的应用程序采用该模式,例如RTC通信程序。
音频服务(Audio Service)
共享模式时,音频服务分配可同时访问应用程序和音频引擎的跨进程终结点缓冲区。音频服务是实现 Windows 音频策略的模块。 “音频策略” 是一组内部规则,适用于来自共享和竞争同一音频硬件的多个应用程序之间的音频流之间的交互。 Windows 音频服务通过设置音频引擎的控制参数来实现音频策略。 音频服务的职责包括:
- 跟踪用户在系统中添加或删除的音频设备。
- 监视在系统中分配给音频设备的角色。
- 管理来自产生相似类型音频内容的各组角色的音频流(控制台、多媒体和通信)
- 为每种不同类型的音频内容的混合流 (或者子流) 提供音量等级的控制。
- 为音频流通知音频引擎处理在数据通道里中的元素。
终结点缓冲区
- 客户端通过终结点缓冲区将数据传递到终结点设备。
- 系统软件和硬件组件很大程度上是以对客户端透明的方式来管理从终结点缓冲区到终结点设备的数据移动
- 对于插入到带有插孔状态检测的音频适配器的终结点设备,客户端只能为实际存在的终结点设备创建终结点缓冲区
音频引擎(Audio Engine)
音频引擎是一种用户模式的组件(Audiodg.dll),它在软件中执行所有流的处理。
- 音频引擎内置了很多APO(Audio Process Object 音频处理对象)。
- 音频引擎负责混合多个应用程序的音频流。
音频驱动(Audio Driver)
音频驱动可能是系统提供的和供应商提供的驱动程序组件的组合。
UAA 规定的音频驱动分成3种类型:
- USB Audio
- IEEE 1394 AV/C
- HD Audio
音频适配器(Audio Adapter)
- 播放时,把音频数字信息转换为模拟信号,并负责输出音频的音量控制以及静音。
- 采集时,把音频模拟信号转换为数字信号,并负责输入音频的音量控制以及静音。
终结点设备(Endpoint Device)
是对音频设备的抽象,由音频终结点生成器(audioendpointbuilder.exe),发现新的音频设备,并创建对应的软件音频终结点。音频终结点设备包括:扬声器、耳机和麦克风等。
https://docs.microsoft.com/en-us/windows/win32/coreaudio/user-mode-audio-components