用户模式音频组件

在 Windows Vista 中,核心音频 API 充当用户模式音频子系统的基础。 核心音频 API 作为用户模式系统组件的精简层实现,以将用户模式客户端与内核模式音频驱动程序和音频硬件分开。 高级音频 API(如 DirectSound)和 Windows 多媒体功能通过核心音频 API 访问音频设备。 此外,某些音频应用程序直接与核心音频 API 通信。

核心音频 API 支持用户友好的音频终结点设备概念。 音频终结点设备是一种软件抽象,表示用户直接操作的物理设备。 音频终结点设备的例子包括扬声器、耳机和麦克风。 有关详细信息,请参阅音频终结点设备

下图显示核心音频 API 及其与 Windows Vista 中其他用户模式音频组件的关系。

diagram of user-mode audio-rendering components

为简单起见,上图仅显示终结点设备的音频呈现数据路径,该图不显示音频捕获数据路径。 核心音频 API 包括在 Audioses.dll 和 Mmdevapi.dll 用户模式系统模块中实现的 MMDevice APIWASAPIDeviceTopology APIEndpointVolume API

如上图所示,核心音频 API 为以下更高级别的 API 提供基础:

  • 媒体基础
  • Windows 多媒体 waveXxxmixerXxx 函数
  • DirectSound
  • DirectMusic

DirectSound、Windows 多媒体音频函数和媒体基础(通过其流式处理音频呈现器或 SAR 组件)直接与核心音频 API 通信。 DirectMusic 间接通过 DirectSound 与核心音频 API 通信。

WASAPI 客户端通过终结点缓冲区将数据传递到终结点设备。 系统软件和硬件组件以基本上对客户端透明的方式管理数据从终结点缓冲区到终结点设备的移动。 此外,对于插入具有插孔状态检测功能的音频适配器的终结点设备,客户端只能为实际存在的终结点设备创建终结点缓冲区。 有关插孔状态检测的详细信息,请参阅音频终结点设备

上图显示两种类型的终结点缓冲区。 如果 WASAPI 的客户端在共享模式下打开流,则客户端会将音频数据写入终结点缓冲区,Windows 音频引擎从缓冲区读取数据。 在此模式下,客户端与其他进程中运行的其他应用程序共享音频硬件。 音频引擎会混合来自这些应用程序的流,并通过硬件播放生成的混音。 音频引擎是一个在软件中执行其所有流处理操作的用户模式系统组件 (Audiodg.dll)。 相比之下,如果客户端以独占模式打开流,则客户端对音频硬件具有独占访问权限。 通常,只有少量“pro audio”或 RTC 应用程序需要独占模式。 虽然关系图显示共享模式和独占模式流,但两个流(及其对应的终结点缓冲区)中只有一个存在,具体取决于客户端是以共享模式还是独占模式打开流。

在独占模式下,客户端可以选择以终结点设备支持的任何音频格式打开流。 在共享模式下,客户端必须以音频引擎当前正在使用的混合格式(或类似于混合格式的格式)打开流。 音频引擎的输入流和来自引擎的输出混合都采用此格式。

在 Windows 7 中,为共享模式下的流添加了名为低延迟模式的新功能。 在此模式下,音频引擎以拉取模式运行,其中延迟显著减少。 这对于需要低音频流延迟的通信应用程序而言非常有用,以便更快地进行流式处理。

管理低延迟音频流的应用程序可以使用 Windows Vista 中的多媒体类计划程序服务 (MMCSS) 来提高访问终结点缓冲区的应用程序线程的优先级。 MMCSS 使音频应用程序能够以高优先级运行,而不会拒绝低优先级应用程序使用 CPU 资源。 MMCSS 根据其任务名称将优先级分配给线程。 例如,Windows Vista 支持管理音频流的线程的任务名称“Audio”和“Pro Audio”。 默认情况下,“Pro Audio”线程的优先级高于“音频”线程的优先级。 有关 MMCSS 的详细信息,请参阅 Windows SDK 文档。

核心音频 API 支持 PCM 和非 PCM 流格式。 但是,音频引擎只能混合 PCM 流。 因此,只有独占模式的流才能使用非 PCM 格式。 有关详细信息,请参阅设备格式

音频引擎在其自己的受保护进程中运行,该进程独立于应用程序在其中运行的进程。 为了支持共享模式流,Windows 音频服务(上图中标有“音频服务”的框)分配可供应用程序和音频引擎访问的跨进程终结点缓冲区。 对于独占模式,终结点缓冲区驻留在应用程序和音频硬件可访问的内存中。

Windows 音频服务是实现 Windows 音频策略的模块。 音频策略是一组系统应用于多个共享和争夺同一音频硬件使用权的应用程序的音频流之间的交互的内部规则。 Windows 音频服务通过设置音频引擎的控制参数来实现音频策略。 音频服务的职责包括:

  • 跟踪用户添加到系统或从系统中删除的音频设备。
  • 监视分配给系统中音频设备的角色。
  • 从生成类似音频内容类的任务组(控制台、多媒体和通信)管理音频流。
  • 控制每种不同类型的音频内容的组合输出流(“子混合”)的音量。
  • 通知音频引擎音频流的数据路径中的处理元素。

在某些版本的 Windows 中,默认禁用 Windows 音频服务并且必须显式打开,系统才能播放音频。

在上图显示的示例中,终结点设备是插入音频适配器的一组扬声器。 客户端应用程序将音频数据写入终结点缓冲区,音频引擎处理将数据从缓冲区传输到终结点设备的详细信息。

上图中标有“音频驱动程序”的框可能是系统提供的驱动程序组件和供应商提供的驱动程序组件的组合。 对于 PCI 或 PCI Express 总线上的音频适配器,系统提供端口类系统驱动程序 (Portcls.sys),该驱动程序为适配器中的各种音频功能实现一组端口驱动程序,硬件供应商提供一个适配器驱动程序,该驱动程序实现一组微型端口驱动程序来为端口驱动程序处理设备特定操作。 对于 PCI 或 PCI Express 总线上的高清音频控制器和编解码器,系统提供适配器驱动程序 (Hdaudio.sys),无需供应商提供的驱动程序。 对于 USB 总线上的音频适配器,系统提供 AVStream 类系统驱动程序 (Ks.sys) 以及 USB 音频驱动程序 (Usbaudio.sys):同样,不需要供应商提供的驱动程序。

为简单起见,上图仅显示呈现流。 但是,核心音频 API 也支持捕获流。 在共享模式下,多个客户端可以从音频硬件设备共享捕获的流。 在独占模式下,一个客户端对设备捕获的流具有独占访问权限。

编程指南