音频的通用 Windows 驱动程序

在 Windows 10 中,可以编写可跨许多类型硬件工作的通用音频驱动程序。 本主题讨论此方法的优点以及各平台之间的差异。 除了音频的通用 Windows 驱动程序外,Windows 还继续支持以前的音频驱动程序技术,如 WDM。

音频的通用 Windows 驱动程序入门

IHV 可以开发适用于所有设备(台式机、笔记本电脑、平板电脑、手机)的通用 Windows 驱动程序。 这可以减少初始开发的开发时间和成本以及日后的代码维护。

这些工具可用于开发通用 Windows 驱动程序:

  • Visual Studio 2015:将“目标平台”设置为“通用”。 有关设置驱动程序开发环境的详细信息,请参阅 Windows 硬件开发人员文档使用 WDK 生成驱动程序。

  • APIValidator 工具:可以使用 ApiValidator.exe 工具验证驱动程序调用的 API 是否对通用 Windows 驱动程序有效。 此工具是适用于 Windows 10 的 Windows 驱动程序工具包 (WDK) 的一部分,如果你使用的是 Visual Studio 2015,它会自动运行。 有关详细信息,请参阅 APIValidator

  • DDI 参考文档:DDI 参考文档已更新,以指示通用 Windows 驱动程序支持哪些 DDI。 有关详细信息,请参阅音频设备参考

创建通用音频驱动程序

有关分步指南,请参阅 Windows 硬件开发人员文档使用 WDK 生成驱动程序。 下面是这些步骤的摘要:

  1. 加载通用音频 sysvad 示例以用作通用音频驱动程序的起点。 或者,从空 WDM 驱动程序模板开始,并根据音频驱动程序的需要从通用 sysvad 示例中添加代码。

  2. 在项目属性中,将“目标平台”设置为“通用”。

  3. 创建安装包:如果你的目标是运行 Windows 10 桌面版(家庭版、专业版、企业版和教育版)的设备,请使用通用 INF 文件。 如果目标是运行 Windows 10 移动版的设备,请使用 PkgGen 生成 .spkg 文件。

  4. 生成、安装、部署和调试适用于 Windows 10 桌面版或 Windows 10 移动版的驱动程序。

代码示例

Sysvad 和 SwapAPO 已转换为通用 Windows 驱动程序示例。 有关详细信息,请参阅示例音频驱动程序

适用于音频的通用 Windows 驱动程序的编程接口

从 Windows 10 开始,驱动程序编程接口是基于 OneCoreUAP 的 Windows 版本的一部分。 通过使用该通用集,可以编写通用 Windows 驱动程序。 这些驱动程序将在 Windows 10 桌面版和 Windows 10 移动版以及其他 Windows 10 版本上运行。

使用通用音频驱动程序时,可以使用以下 DDI。

将现有音频驱动程序转换为通用 Windows 驱动程序

按照此过程将现有音频驱动程序转换为通用 Windows 驱动程序。

  1. 确定现有驱动程序调用是否会在 OneCoreUAP Windows 上运行。 检查参考页的要求部分。 有关详细信息,请参阅音频设备参考

  2. 将驱动程序重新编译为通用 Windows 驱动程序。 在项目属性中,将“目标平台”设置为“通用”。

  3. 使用 ApiValidator.exe 工具验证驱动程序调用的 DDI 是否对通用 Windows 驱动程序有效。 此工具是适用于 Windows 10 的 Windows 驱动程序工具包 (WDK) 的一部分,如果你使用的是 Visual Studio 2015,它会自动运行。 有关详细信息,请参阅 APIValidator

  4. 如果驱动程序调用不属于 OneCoreUAP 的接口,编译器将报告错误。

  5. 将这些调用替换为备用调用,或创建代码解决方法,或编写新的驱动程序。

创建组件化音频驱动程序安装

概述

若要打造更流畅、更可靠的安装体验以及更好地支持组件服务,请将驱动程序安装过程划分为以下组成部分。

  • DSP(如果存在)和编解码器
  • APO
  • OEM 自定义项

(可选)单独的 INF 文件可用于 DSP 和编解码器。

此图汇总了组件化音频安装。

包含 DSP 驱动程序、编解码器和 AAPI 的组件化音频堆栈示意图。

单独的扩展 INF 文件用于为特定系统自定义每个基本驱动程序组件。 自定义包括优化参数和其他特定于系统的设置。 有关详细信息,请参阅使用扩展 INF 文件

扩展 INF 文件必须是通用 INF 文件。 有关详细信息,请参阅使用通用 INF 文件

有关使用 INF 文件添加软件的信息,请参阅使用组件 INF 文件DCH 设计原则和最佳做法

提交组件化 INF 文件

APO INF 包必须与基准驱动程序包分开提交到合作伙伴中心。 有关如何创建包的详细信息,请参阅 Windows HLK 入门

SYSVAD 组件化 INF 文件

若要查看组件化 INF 文件的示例,请查看 GitHub 上的 sysvad/TabletAudioSample

文件名 说明
ComponentizedAudioSample.inf 基本组件化示例音频 INF 文件。
ComponentizedAudioSampleExtension.inf 具有其他 OEM 自定义项的 sysvad 基准的扩展驱动程序。
ComponentizedApoSample.inf APO 示例扩展 INF 文件。

传统 INF 文件将继续在 SYSVAD 示例中提供。

文件名 说明
tabletaudiosample.inf 一个桌面整体式 INF 文件,其中包含安装驱动程序所需的所有信息。

特定于 APO 供应商的优化参数和功能配置

所有 APO 供应商系统特定设置、参数和优化值都必须通过扩展 INF 包安装。 在许多情况下,可以使用 INF AddReg 指令以简单方式执行此操作。 在更复杂的情况下,可以使用优化文件。 

基准驱动程序包不得依赖这些自定义项才能正常运行(当然,功能可能会减少)。 

UWP 音频设置 APP

若要实现最终用户 UI,请使用 Windows 通用音频驱动程序的硬件支持应用 (HSA)。 有关详细信息,请参阅硬件支持应用 (HSA):驱动程序开发人员的步骤

以编程方式启动 UWP 硬件支持应用

若要根据驱动程序事件(例如,连接新的音频设备时)以编程方式启动 UWP 硬件支持应用,请使用 Windows Shell API。 Windows 10 Shell API 支持基于资源激活或直接通过 IApplicationActivationManager 启动 UWP UI 的方法。 可以在自动启动 Windows 10 UWP 应用中查找有关 UWP 应用程序的自动启动的更多详细信息。 

APO 和设备驱动程序供应商使用 AudioModules API

音频模块 API/DDI 旨在标准化在 UWP 应用程序或用户模式服务之间传递到内核驱动程序模块或 DSP 处理块的命令的通信传输(但不是协议)。 音频模块需要实现正确的 DDI 的驱动程序来支持模块枚举和通信。 命令作为二进制文件传递,解释/定义由创建者决定。 

音频模块目前并非旨在促进 UWP 应用与音频引擎中运行的 SW APO 之间的直接通信。

有关音频模块的详细信息,请参阅实现音频模块通信配置和查询音频设备模块

APO HWID 字符串构造

APO 硬件 ID 同时包含标准信息和供应商定义的字符串。

它们的构造方式如下:

SWC\VEN_v(4)&AID_a(4)&SUBSYS_ n(4)s(4) &REV_r(4)
SWC\VEN_v(4)&AID_a(4)&SUBSYS_ n(4)s(4)
SWC\VEN_v(4)&AID_a(4)

其中:

  • v(4) 是 APO 设备供应商的 4 个字符标识符。 这将由 Microsoft 管理。 
  • a(4) 是 APO 的 4 个字符标识符(由 APO 供应商定义)。 
  • n(4) 是父设备的子系统供应商的由 PCI SIG 分配的标识符(包含 4 个字符)。 这通常是 OEM 标识符。
  • s(4) 是父设备的供应商定义的子系统标识符(包含 4 个字符)。 这通常是 OEM 产品标识符。

驱动程序更新的即插即用 INF 版本和日期评估

Windows 即插即用系统会评估日期和驱动程序版本,以确定在存在多个驱动程序时要安装的驱动器。 有关详细信息,请参阅 Windows 如何为驱动程序排名

若要允许使用最新的驱动程序,请确保并更新每个新版本驱动程序的日期和时间。

APO 驱动程序注册表项

对于第三方定义的音频驱动程序/APO 注册表项,请使用 HKR。

使用 Windows 服务促进 UWP <-> APO 通信

管理用户模式组件(如 APO)不严格需要 Windows 服务。 但是,如果你的设计包含旨在促进 UWP <-> APO 通信的 RPC 服务器,我们建议在 Windows 服务中实现该功能,然后控制在音频引擎中运行的 APO。 

生成适用于 Windows 10 桌面版的 Sysvad 通用音频示例

完成以下步骤以生成适用于 Windows 10 桌面版的 sysvad 示例。

  1. 找到桌面 inf 文件 (tabletaudiosample.inf),并将制造商名称设置为“Contoso”等值

  2. 在“解决方案资源管理器”中,选择并按住(或右键单击)解决方案”sysvad“,然后选择”配置管理器”。 如果要部署到 64 位版本的 Windows,请将目标平台设置为 x64。 确保所有项目的配置和平台设置都相同。

  3. 生成 sysvad 解决方案中的所有项目。

  4. 从生成中找到生成的输出目录。 例如,它可以位于如下所示的目录中:

    C:\Program Files (x86)\Windows Kits\10\src\audio\sysvad\x64\Debug\package
    
  5. 将以下文件复制到要安装 sysvad 驱动程序的系统:

文件 说明
TabletAudioSample.sys 驱动程序文件。
tabletaudiosample.inf 一个信息 (INF) 文件,其中包含安装驱动程序所需的信息。
sysvad.cat 目录文件。
SwapAPO.dll 用于管理 API 的 UI 的示例驱动程序扩展。
KeywordDetectorAdapter.dll 示例关键字检测器。

安装和测试驱动程序

按照以下步骤在目标系统上使用 PnpUtil 安装驱动程序。

  1. 打开管理员命令提示符,并在将驱动程序文件复制到的目录中键入以下内容。

    pnputil -i -a tabletaudiosample.inf

  2. sysvad 驱动程序安装应该完成。 如果存在任何错误,可以检查此文件以获取其他信息:%windir%\inf\setupapi.dev.log

  3. 在设备管理器的“视图”菜单上,按类型选择“设备”。 在设备树中,找到 Microsoft 虚拟音频设备 (WDM) - Sysvad 示例。 这通常位于声音、视频和游戏控制器节点下。

  4. 在目标计算机上,打开“控制面板”并导航到“硬件和声音”>“管理音频设备”。 在“声音”对话框中,选择标记为“Microsoft 虚拟音频设备 (WDM) - Sysvad 示例”的扬声器图标,然后选择“设置默认值”,但不选择“确定”。 这将使“声音”对话框保持打开状态。

  5. 在目标计算机上找到 MP3 或其他音频文件,然后双击播放它。 然后,在“声音”对话框中,验证音量级别指示器中是否存在与 Microsoft 虚拟音频设备 (WDM) - Sysvad 示例驱动程序关联的活动。