User-Mode 音频组件

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

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

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

用户模式音频呈现组件的 关系图

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

如上图所示,核心音频 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 音频服务通过设置音频引擎的控制参数来实现音频策略。 音频服务的职责包括:

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

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

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

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

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

编程指南