Hardware-Offloaded 音频处理

硬件卸载的音频处理允许在计算机的主 CPU 之外执行主要音频处理任务。

音频处理可能是一个计算密集型任务。 因此,在许多情况下,允许专用处理器处理处理任务(例如混合和应用效果)可能很有帮助。

实现用于卸载音频的驱动程序时,请开发能够处理卸载的音频流的驱动程序,并向 Windows 音频系统公开该功能。

本节中的以下主题讨论驱动程序开发、应用程序影响及在为实现硬件音频引擎的音频适配器开发音频驱动程序以处理卸载音频流时应注意的其他问题。

硬件卸载音频驱动程序实现

用于卸载音频处理的帮助程序接口

已卸载音频的故障报告

有关卸载 APO 信息,请参阅 硬件卸载的 APO 效果

Hardware-Offloaded 音频处理体系结构概述

软件音频引擎

下图显示了 Windows 软件音频引擎。

显示音频驱动程序体系结构的关系图,其中应用程序调用 SFX、MFX 和 EFX 效果,连接到驱动程序和音频硬件。

音频流从 Windows 音频会话 API (WASAPI) 层到达软件音频引擎,并且可能通过更高级别的 API(如 Media Foundation)。 在软件音频引擎的流效果(SFX)中,可以在单独的音频流被混合之前逐个应用这些效果,然后通过任何可用的终结点效果(EFX)进行处理,并传输到渲染硬件和扬声器。

硬件音频引擎

硬件音频引擎在音频适配器中实现,主要反映软件音频引擎的功能。 尽管 Windows 支持硬件卸载的音频处理,但给定音频适配器的音频驱动程序负责使用下图所示的拓扑公开音频硬件的基础功能。

硬件音频引擎必须接受单个主机进程流以及多达 n 个卸载的流。 这些被卸载的流直接从应用层路由到硬件进行处理。 换句话说,卸载的音频流不会通过软件音频引擎传递。 此图展示了一种实现方法,用于处理多达三个卸载的数据流。 主机进程流是软件音频引擎中经过处理的所有流通过软件混音器产生的最终输出。 每个硬件音频引擎还必须包含硬件混音器。

为了保持与软件音频引擎和 WASAPI 接口的一致性,硬件音频引擎必须以环回流的形式返回最终音频输出流到音频堆栈。 这对于依赖于声学回声取消的应用程序和方案尤其重要,这需要了解最终输出流来取消回声并防止反馈。

为了实现环回流的路径,音频驱动程序负责公开环回引脚。 如果数据编码为 PCM 格式,此引脚将从最终音频引擎输出中返回音频数据。 否则,将返回混合后(但预先编码)结果。 这意味着,在处理通过硬件 EFX 编码为非 PCM 格式的音频数据时,环回流会在硬件音频引擎的 EFX 阶段之前,直接从硬件混音器之后获取。 有关表示硬件音频引擎的 KS 筛选器拓扑的信息,请参阅 硬件卸载的音频驱动程序实现

集成的音频体系结构

下图概述了当硬件音频引擎与 Windows 软件音频引擎配合使用时生成的体系结构。

集成软硬件音频引擎的示意图,应用程序调用 SFX、MFX 和 EFX 效果,连接到驱动程序、音频硬件,并通过环回流返回到 WASAPI 层。

在音频驱动程序已指示其对卸载音频处理的支持的情况下,初始化的第一个 n(在本例中为三个)流将直接从 WASAPI 层路由到硬件音频引擎,绕过软件音频引擎。 硬件音频引擎支持的 n 之后的任何新音频流都将通过软件音频引擎进行路由以进行处理。 然后,软件音频引擎生成的流作为主机进程流发送到硬件音频引擎。 主机进程流与第一个 n 个流混合,应用 EFX 处理,然后将生成的流发送到扬声器。

KS 筛选器拓扑

在 Windows 8 及更高版本的作系统中,已为板载硬件音频引擎提供支持来处理音频流。 开发此类音频适配器时,关联的音频驱动程序必须以特定方式向用户模式音频系统公开此事实,以便音频系统能够发现、使用和正确公开此适配器及其驱动程序的功能。

为了使音频驱动程序能够公开这些新音频适配器的硬件功能,Windows 8 引入了驱动程序必须使用的 KS 筛选器拓扑:

KS 滤波器拓扑示意图,其中包含主机进程输入引脚、卸载的音频输入引脚和环回输出引脚。音频处理应用于卸载的音频和主机进程引脚,从最终处理阶段的环回路径,以及通过数字-模拟转换器从 KS 滤波器拓扑输出的两个流。

如上图所示,KS 筛选器拓扑通过硬件表示数据路径,还显示这些路径上可用的函数。 如果音频适配器可以处理卸载的音频,KS 筛选器上有以下输入和输出(称为引脚):

  • 一个主机进程引脚。 这表示软件音频引擎中 KS 筛选器的输入。

  • 一个环回引脚。 这表示从硬件音频引擎到 Windows 音频会话 API (WASAPI) 层的输出。

  • 许多卸载的音频引脚。 尽管该图只显示此类型的一个引脚,但 IHV 可以自由实现任意数量的引脚(n)。

用户模式音频系统中“导致”发现音频适配器及其驱动程序的实际服务是 AudioEndpointBuilder。 AudioEndpointBuilder 服务监视 KSCATEGORY_AUDIO 类别的设备接口到达和删除。 当音频设备驱动程序注册 KSCATEGORY_AUDIO 设备接口类的新实例时,将触发设备接口到达通知。 AudioEndpointBuilder 服务检测到设备接口到达通知,并使用算法检查系统中音频设备的拓扑结构,以此采取适当措施。

开发音频驱动程序以支持能够处理卸载音频的适配器时,驱动程序必须使用 KSNODETYPE_AUDIO_ENGINE 音频终结点来公开硬件音频引擎的功能。 有关音频终结点发现过程的详细信息,请参阅 音频终结点生成器算法

用户界面注意事项

你开发了音频驱动程序来控制能够处理卸载音频的音频适配器的基础硬件功能。 这意味着驱动程序最好地了解如何控制适配器的功能。 因此,必须开发一个 UI,它将以可以选择、启用和/或禁用的选项的形式向最终用户公开适配器的功能。

但是,如果已有一个用于控制你开发的音频处理对象(ADO)的 UI,则可以扩展此 UI 以使用新的音频适配器。 在这种情况下,UI 的扩展将为 API 提供软件控件,并为适配器提供硬件控制。

应用程序影响

此新型音频适配器及其关联驱动程序中描述的功能可以通过 WASAPI、媒体基础、媒体引擎或 HTML 5 <音频> 标记供 UWP 应用使用。 请注意,无法使用 Wave 和 DSound,因为它们不适用于 UWP 应用。 另请注意,桌面应用程序无法使用支持硬件卸载音频的音频适配器的卸载功能。 这些应用程序仍然可以呈现音频,但只能通过主机引脚来使用软件音频引擎。

如果 UWP 应用流式传输媒体内容并使用媒体基础、媒体引擎或 HTML 5 <音频> 标记,则只要为流设置了适当的音频类别,应用就会自动选择加入硬件卸载。 为每个流选择加入硬件卸载功能。

使用 WASAPI 或流式传输通信的 UWP 应用必须明确选择硬件卸载。

硬件卸载音频驱动程序实现

Windows 音频处理对象