硬件卸载的音频的处理
硬件卸载的音频处理允许在计算机的主 CPU 之外执行主要音频处理任务。
音频处理可能需要大量计算。 因此,在许多情况下,允许专用处理器执行处理任务(例如混合和应用效果)可能很有帮助。
实现用于卸载音频的驱动程序时,请开发能够处理卸载的音频流的驱动程序,并向 Windows 音频系统公开该功能。
本节中的以下主题讨论驱动程序开发、应用程序影响,以及在为实现硬件音频引擎的音频适配器开发音频驱动程序以处理卸载的音频流时应注意的其他问题。
有关卸载的 APO 的信息,请参阅硬件卸载的 APO 效果
硬件卸载的音频处理体系结构概述
软件音频引擎
下图显示了 Windows 软件音频引擎。
音频流从 Windows 音频会话 API (WASAPI) 层并可能通过更高级别的 API(如 Media Foundation)到达软件音频引擎。 在软件音频引擎流效果 (SFX) 中,可以在单独的流混合之前按流应用,然后通过任何可用的终结点效果 (EFX) 传递并发送到呈现硬件和扬声器。
硬件音频引擎
硬件音频引擎在音频适配器中实现,基本上镜像软件音频引擎的功能。 尽管 Windows 支持硬件卸载的音频处理,但给定音频适配器的音频驱动程序负责使用下图所示的拓扑公开音频硬件的基础功能。
硬件音频引擎必须接受单个主机进程流以及多达 n 个卸载的流。 这些卸载的流直接从应用程序层路由,以在硬件中进行处理。 换句话说,卸载的流不会通过软件音频引擎传递。 此图显示了一个实现,旨在处理多达三个卸载的流。 主机进程流是软件音频引擎中处理的所有流的软件混音器的最终输出。 每个硬件音频引擎还必须包含硬件混音器。
为了保持与软件音频引擎和 WASAPI 接口的对等性,硬件音频引擎必须以环回流的形式向音频堆栈提供最终音频输出流。 这对于依赖于声学回声消除的应用程序和方案尤其重要,这需要了解最终输出流来消除回声并防止反馈。
为了实现环回流的路径,音频驱动程序负责公开环回引脚。 如果数据编码为 PCM 格式,此引脚将从最终音频引擎输出中返回音频数据。 否则,将返回混合后(但在编码前)结果。 这意味着,如果使用编码为非 PCM 格式的硬件 EFX 处理的音频数据,环回流会在硬件音频引擎中的 EFX 阶段之前直接在硬件混音器之后执行。 有关表示硬件音频引擎的 KS 筛选器拓扑的信息,请参阅硬件卸载的音频驱动程序实现。
集成的音频体系结构
下图概述了当硬件音频引擎与 Windows 软件音频引擎配合使用时生成的体系结构。
在音频驱动程序已指示其对卸载音频处理的支持的场景中,初始化的前 n 个(在本例中为三个)流将直接从 WASAPI 层路由到硬件音频引擎,绕过软件音频引擎。 硬件音频引擎支持的 n 个之后的任何新音频流都将通过软件音频引擎进行路由以进行处理。 然后,软件音频引擎生成的流作为主机进程流发送到硬件音频引擎。 主机进程流与前 n 个流混合,应用 EFX 处理,然后将生成的流发送到扬声器。
KS 筛选器拓扑
在 Windows 8 及更高版本的操作系统中,已为板载硬件音频引擎提供支持来处理音频流。 开发此类音频适配器时,关联的音频驱动程序必须以特定方式向用户模式音频系统公开此事实,以便音频系统能够发现、使用和正确公开此适配器及其驱动程序的功能。
为了使音频驱动程序能够公开这些新音频适配器的硬件功能,Windows 8 引入了驱动程序必须使用的 KS 筛选器拓扑:
如上图所示,KS 筛选器拓扑通过硬件表示数据路径,还显示这些路径上可用的函数。 如果音频适配器可以处理卸载的音频,KS 筛选器上有以下输入和输出(称为引脚):
一个主机进程引脚。 这表示从软件音频引擎输入 KS 筛选器中。
一个环回引脚。 这表示从硬件音频引擎输出到 Windows 音频会话 API (WASAPI) 层。
许多卸载音频引脚。 尽管该图只显示此类型的一个引脚,但 IHV 可以自由实现任意数量 (n) 的引脚。
用户模式音频系统中“导致”发现音频适配器及其驱动程序的实际服务是 AudioEndpointBuilder。 AudioEndpointBuilder 服务会监视设备接口到达和删除的 KSCATEGORY_AUDIO 类。 当音频设备驱动程序注册 KSCATEGORY_AUDIO 设备接口类的新实例时,将触发设备接口到达通知。 AudioEndpointBuilder 服务会检测设备接口到达通知,并使用算法检查系统中音频设备的拓扑,以便它可以采取适当的操作。
开发音频驱动程序以支持能够处理卸载音频的适配器时,驱动程序必须使用 KSNODETYPE_AUDIO_ENGINE 音频终结点来公开硬件音频引擎的功能。 有关音频终结点发现过程的详细信息,请参阅音频终结点生成器算法。
用户界面注意事项
你开发了音频驱动程序来控制能够处理卸载音频的音频适配器的基础硬件功能。 这意味着驱动程序非常了解如何控制适配器的功能。 因此,你必须开发一个 UI,它将以最终用户可以选择、启用和/或禁用的选项的形式向他们公开适配器的功能。
但是,如果已有一个用于控制你所开发音频处理对象 (APO) 的 UI,则可以扩展此 UI 以使用新的音频适配器。 在这种情况下,UI 的扩展将为 API 提供软件控制,并为适配器提供硬件控制。
应用程序影响
此新型音频适配器及其关联驱动程序所述的功能可以通过 WASAPI、媒体基础、媒体引擎或 HTML 5 <音频>标记供 UWP 应用使用。 请注意,无法使用 Wave 和 DSound,因为它们不适用于 UWP 应用。 另请注意,桌面应用程序无法使用支持硬件卸载音频的音频适配器的卸载功能。 这些应用程序仍然可以呈现音频,但只能通过使用软件音频引擎的主机引脚来实现。
如果 UWP 应用流式传输媒体内容并使用媒体基础、媒体引擎或 HTML 5 <音频>标记,则只要为流设置了适当的音频类别,应用就会自动选择加入硬件卸载。 为每个流执行硬件卸载选择加入。
使用 WASAPI 或流式传输通信的 UWP 应用必须显式选择加入硬件卸载。