USB 音频 2.0 驱动程序

从 Windows 10 版本 1703 开始,Windows 随附 USB 音频 2.0 驱动程序。 它旨在支持 USB 音频 2.0 设备类。 驱动程序是 WaveRT 音频端口类微型端口。

驱动程序名为:usbaudio2.sys,关联的 inf 文件为 usbaudio2.inf

驱动程序将在设备管理器中标识为“USB 音频类 2 设备”。 此名称将被 USB 产品字符串覆盖(如果可用)。

将兼容设备连接到系统时,将自动启用驱动程序。 但是,如果系统或 Windows 更新上存在第三方驱动程序,则会安装该驱动程序并覆盖类驱动程序。

体系结构

如下所示,usbaudio2.sys 驱动程序适用于更广泛的 Windows USB 音频体系结构。

Stack diagram illustrating the Windows USB Audio architecture with ks.sys at the top and USB Audio devices at the bottom.

以下 USB 规范定义了 USB 音频,在本文予以了参考。

  • USB-2 是指通用串行总线规范修订版 2.0
  • ADC-2 是指音频设备 USB 设备类定义版本 2.0。
  • FMT-2 是指音频数据格式规范版本 2.0。

USB-IF 是一个专门负责维护官方 USB 规范、测试规范和工具的小组。

音频格式

驱动程序支持下面列出的格式。 将忽略一个备用设置,该设置指定在 FMT-2 中定义的另一种格式或未知格式。

类型 I 格式 (FMT-2 2.3.1):

  • 每个样本含 8..32 位的 PCM 格式 (FMT-2 2.3.1.7.1)
  • PCM8 格式 (FMT-2 2.3.1.7.2)
  • IEEE_FLOAT 格式 (FMT-2 2.3.1.7.3)

类型 III 格式(FMT-2 2.3.3 和 A.2.3):

  • IEC61937_AC-3
  • IEC61937_MPEG-2_AAC_ADTS
  • IEC61937_DTS-I
  • IEC61937_DTS-II
  • IEC61937_DTS-III
  • TYPE_III_WMA

功能说明

本部分介绍 USB 音频 2.0 驱动程序的功能。

音频函数拓扑

驱动程序支持 ADC-2 3.13 中定义的所有实体类型。

每个终端实体在兼容的 USB 音频 2.0 硬件中都必须具有有效的时钟连接。 时钟路径可以选择包括时钟乘数和时钟选择器单位,并且必须以时钟源实体结尾。

驱动程序仅支持一个时钟源。 如果设备实现多个时钟源实体和一个时钟选择器,则驱动程序将使用默认选择的时钟源,并且不会修改时钟选择器的位置。

不支持具有多个输入引脚的处理单元 (ADC-2 3.13.9)。

不支持具有多个输入引脚的扩展单元 (ADC-2 3.13.10)。

不允许使用拓扑中的循环路径。

音频流式处理

驱动程序支持以下终结点同步类型 (USB-2 5.12.4.1):

  • 异步 IN 和 OUT
  • 同步 IN 和 OUT
  • 自适应 IN 和 OUT

对于异步 OUT 情况,驱动程序仅支持显式反馈。 必须在 AS 接口的相应备用设置中实现反馈终结点。 驱动程序不支持隐式反馈。

目前,对使用多个终结点的共享时钟的设备的支持有限。

对于自适应 IN,驱动程序不支持源转发终结点。 如果备用设置中存在此类终结点,将忽略该终结点。 驱动程序处理自适应 IN 流的方式与异步 IN 流相同。

设备创建的等时数据包的大小必须符合 FMT-2.0 部分 2.3.1.1 中指定的限制。 这意味着实际数据包大小与名义大小的偏差不得超过 +/- 一个音频槽(音频槽 = 声道计数样本)。

描述符

音频函数必须仅实现一个 AudioControl 接口描述符 (ADC-2 4.7) 和一个或多个 AudioStreaming 接口描述符 (ADC-2 4.9)。 不支持具有音频控制接口但不支持流式处理接口的函数。

驱动程序支持 ADC-2(部分 4)中定义的所有描述符类型。 以下小节提供有关某些特定描述符类型的注释。

特定于类的 AS 接口描述符

有关此规范的详细信息,请参阅 ADC-2 4.9.2。

AS 接口描述符必须以无终结点(无带宽消耗)的备用设置零开头,并且必须在兼容 USB Audio 2.0 硬件中按升序指定其他备用设置。

驱动程序不支持其格式的备用设置将被忽略。

每个非零备用设置都必须指定一个等时数据终结点,并可以选择指定反馈终结点。 不支持无任何终结点的非零备用设置。

bTerminalLink 字段必须引用拓扑中的终端实体,并且其值在 AS 接口的所有备用设置中必须相同。

AS 接口描述符中的 bFormatType 字段必须与格式类型描述符 (FMT-2 2.3.1.6) 中指定的 bFormatType 相同。

对于类型 I 格式,在 AS 接口描述符的 bmFormats 字段中只能将一位设置为一。 否则,驱动程序将忽略格式。

为了节省总线带宽,一个 AS 接口可以实现多个具有相同格式的备用设置(就 bNrChannels 和 AS 格式类型描述符而言),但在等时数据终结点描述符中具有不同的 wMaxPacketSize 值。 对于给定的采样率,驱动程序会选择具有可满足数据速率要求的最小 wMaxPacketSize 的备用设置。

类型 I 格式类型描述符

有关此规范的详细信息,请参阅 FMT-2 2.3.1.6。

存在以下限制:

Format 子槽大小 位分辨率
类型 I PCM 格式: 1 <= bSubslotSize <= 4 8 <= bBitResolution <= 32
类型 I PCM8 格式: bSubslotSize == 1 bBitResolution == 8
类型 I IEEE_FLOAT 格式: bSubslotSize == 4 bBitResolution == 32
类型 III IEC61937 格式: bSubslotSize == 2 bBitResolution == 16

特定于类的 AS 等时音频数据终结点描述符

有关此规范的详细信息,请参阅 ADC-2 4.10.1.2。

bmAttributes 字段中的 MaxPacketsOnly 标志不受支持,将被忽略。

bmControls、bLockDelayUnits 和 wLockDelay 字段将被忽略。

类请求和中断数据消息

驱动程序支持 ADC-2(部分 5.2)中定义的控件请求的子集,并支持某些控件的中断数据消息 (ADC-2 6.1)。 下表显示了在驱动程序中实现的子集。

实体 控制 GET CUR SET CUR GET RANGE INTERRUPT
时钟源 采样频率控件 x X x
时钟选择器 时钟选择器控件 x
时钟乘数 分子控件 x
分母控件 x
终端 连接器控件 x x
混音器单元 混音器控件 x X x
选择器单元 选择器控件 x x
功能单元 静音控件 x X x
音量控件 x X X x
自动增益控件 x x
效果单元
处理单元
扩展单元

以下几个小节提供了有关控件和请求的其他信息。

时钟源实体

有关此规范的详细信息,请参阅 ADC-2 5.2.5.1。

时钟源实体至少必须在兼容的 USB 音频 2.0 硬件中实现采样频率控件 GET RANGE 和 GET CUR 请求 (ADC-2 5.2.5.1.1)。

采样频率控件 GET RANGE 请求会返回子范围列表 (ADC-2 5.2.1)。 每个子范围都描述离散频率或频率范围。 必须通过将 MIN 和 MAX 字段设置为相应的频率,将 RES 设置为零来表示离散采样频率。 各个子范围不得重叠。 如果某个子范围与上一个子范围重叠,驱动程序会将其忽略。

实现单个固定频率的时钟源实体不需要实现采样频率控件 SET CUR。 它会实现 GET CUR,从而返回固定频率,并实现 GET RANGE,从而报告一个离散频率。

时钟选择器实体

有关此规范的详细信息,请参阅 ADC-2 5.2.5.2

USB 音频 2.0 驱动程序不支持时钟选择。 该驱动程序使用默认选择的时钟源实体,并且从不发出时钟选择器控件 SET CUR 请求。 时钟选择器控件 GET CUR 请求 (ADC-2 5.2.5.2.1) 必须在兼容的 USB 音频 2.0 硬件中实现。

功能单元

有关此规范的详细信息,请参阅 ADC-2 5.2.5.7。

驱动程序仅支持一个音量范围。 如果音量控件 GET RANGE 请求返回多个范围,则将忽略后续范围。

MIN 和 MAX 字段表示的音量间隔应该是 RES 字段中指定的步长大小的整数倍数。

如果功能单元实现单个声道控件和静音或音量的主控件,驱动程序将使用单声道控件并忽略主控件。

有关 OEM 和 IHV 的更多信息

OEM 和 IHV 应根据提供的内置驱动程序测试其现有设备和新设备。

没有与内置 USB 音频 2.0 驱动程序关联的任何特定合作伙伴自定义。

此 INF 文件条目(在 Windows 版本 1703 更新中提供)用于标识内置驱动程序是否为通用设备驱动程序。

GenericDriverInstalled,,,,1

内置驱动程序将使用 usbaudio2.inf 注册以下兼容 ID。

USB\Class_01&SubClass_00&Prot_20
USB\Class_01&SubClass_01&Prot_20
USB\Class_01&SubClass_02&Prot_20
USB\Class_01&SubClass_03&Prot_20

请参阅子类类型的 USB 音频 2.0 规范。

带 MIDI 的 USB 音频 2.0 设备(上述子类 0x03)将 MIDI 函数枚举为加载了 usbaudio.sys(USB Audio 1.0 驱动程序)的单独多函数设备。

USB Audio 1.0 类驱动程序将此兼容 ID 注册到 wdma_usb.inf。

USB\Class_01

并且具有以下排除项:

USB\Class_01&SubClass_00&Prot_20
USB\Class_01&SubClass_01&Prot_20
USB\Class_01&SubClass_02&Prot_20
USB\Class_01&SubClass_03&Prot_20

由于 Windows 音频堆栈的限制,共享模式下不支持任意数量的声道(大于 8 个)。

IHV USB 音频 2.0 驱动程序和更新

对于 IHV 提供的第三方驱动程序 USB 音频 2.0 驱动程序,除非这些驱动程序更新驱动程序,以显式替代此行为并使用内置驱动程序,否则这些驱动程序将继续优先于其设备。

音频插孔注册表描述

从 Windows 10 版本 1703 开始,IHV 创建具有一个或多个插孔的 USB 音频类 2.0 设备时,将能够将这些插孔描述为内置音频类 2.0 驱动程序。 当处理此设备的 KSPROPERTY_JACK_DESCRIPTION 时,内置驱动程序将使用提供的插孔信息。

插孔信息存储在注册表的设备实例项(HW 项)中。

下面介绍注册表中的音频插孔信息设置:

REG_DWORD  T<tid>_NrJacks                 # of the jack on this device
REG_DWORD  T<tid>_J<n>_ChannelMapping     Channel mask. The value is defined in ksmedia.h. e.g. SPEAKER_FRONT_RIGHT or KSAUDIO_SPEAKER_5POINT1_SURROUND
REG_DWORD  T<tid>_J<n>_ConnectorType      The enum value is define in EPcxConnectionType.
REG_DWORD  T<tid>_J<n>_GeoLocation        The enum value is define in EPcxGeoLocation.
REG_DWORD  T<tid>_J<n>_GenLocation        The enum value is define in EPcxGenLocation.
REG_DWORD  T<tid>_J<n>_PortConnection     The enum value is define in EPxcPortConnection.
REG_DWORD  T<tid>_J<n>_Color              The color needs to be represent by RGB like this: 0x00RRGGBB (NOT a COLORREF).

<tid> = 终端 ID (如描述符中定义)

<n> = 插孔编号 (1 ~ n)。

<tid> 和 <n> 的约定为:

  • 从 10 开始(8, 9, 10,而不是 8, 9, a)
  • 无前导零
  • n 从 1 开始(第一个插孔是插卡 1,而不是插孔 0)

例如:

T1_NrJacks, T1_J2_ChannelMapping, T1_J2_ConnectorType

有关音频插孔的详细信息,请参阅 KSJACK_DESCRIPTION 结构

可以通过多种方式设置这些注册表值:

  • 通过使用自定义 INF 来包装内置 INF,以便设置这些值。

  • 直接由硬件设备通过适用于 USB 设备的 Microsoft OS 描述符设置(请参阅以下示例)。 有关创建这些描述符的详细信息,请参阅面向 USB 设备的 Microsoft OS 描述符

USB Microsoft OS 描述符示例

以下 USB Microsoft OS 描述符示例包含一个插孔的声道映射和颜色。 该示例适用于具有单个功能描述符的非复合设备。

IHV 供应商应将其扩展为包含插孔描述的任何其他信息。

UCHAR Example2_MSOS20DescriptorSetForUAC2 [0x76] = {
    //
    // Microsoft OS 2.0 Descriptor Set Header
    //
    0x0A, 0x00,             // wLength - 10 bytes
    0x00, 0x00,             // MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x0?, 0x06, // dwWindowsVersion – 0x060?0000 for future Windows version
    0x76, 0x00,             // wTotalLength – 118 bytes // update later

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x42, 0x00,             // bLength - 66 bytes
    0x04, 0x00,             // wDescriptorType – 5 for Registry Property
    0x04, 0x00,             // wPropertyDataType - 4 for REG_DWORD
    0x34, 0x00,             // wPropertyNameLength – 52 bytes
    0x54, 0x00, 0x30, 0x00, // Property Name - "T01_J01_ChannelMapping"
    0x31, 0x00, 0x5f, 0x00,
    0x4a, 0x00, 0x30, 0x00,
    0x31, 0x00, 0x5f, 0x00,
    0x43, 0x00, 0x68, 0x00,
    0x61, 0x00, 0x6e, 0x00,
    0x6e, 0x00, 0x65, 0x00,
    0x6c, 0x00, 0x4d, 0x00,
    0x61, 0x00, 0x70, 0x00,
    0x70, 0x00, 0x69, 0x00,
    0x6e, 0x00, 0x67, 0x00,
    0x00, 0x00
    0x04, 0x00,                       // wPropertyDataLength – 4 bytes
    0x02, 0x00, 0x00, 0x00  // PropertyData - SPEAKER_FRONT_RIGHT

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x2A, 0x00,             // bLength - 42 bytes
    0x04, 0x00,             // wDescriptorType – 5 for Registry Property
    0x04, 0x00,             // wPropertyDataType - 4 for REG_DWORD
    0x1C, 0x00,             // wPropertyNameLength – 28 bytes
    0x54, 0x00, 0x30, 0x00, // Property Name - "T01_J01_Color"
    0x31, 0x00, 0x5f, 0x00,
    0x4a, 0x00, 0x30, 0x00,
    0x31, 0x00, 0x5f, 0x00,
    0x43, 0x00, 0x6f, 0x00,
    0x6c, 0x00, 0x6f, 0x00,
    0x72, 0x00, 0x00, 0x00,
    0x04, 0x00,             // wPropertyDataLength – 4 bytes
    0x00, 0x00, 0xff, 0x00  // PropertyData - 0xff0000 - RED }

疑难解答

如果驱动程序未启动,则应检查系统事件日志。 驱动程序会记录指示失败原因的事件。 同样,可以按照 Matthew van Eerde 的 Web 日志文章以旧式方式收集音频日志中所述的步骤手动收集音频日志。 如果失败可能表示驱动程序问题,请使用如下所述的反馈中心进行报告,并包括日志。

有关如何使用补充 TMF 文件读取 USB Audio 2.0 类驱动程序的日志的信息,请参阅有关 Matthew van Eerde Web 日志的使用反馈中心报告问题、包含日志和建议功能。 有关使用 TMF 文件的常规信息,请参阅使用 TMF 文件显示跟踪日志

有关“音频服务未响应”错误和 USB 音频设备在 Windows 10 版本 1703 中不起作用的信息,请参阅 USB 音频未播放

反馈中心

如果遇到此驱动程序的问题,请收集音频日志,然后按照使用反馈中心报告问题、包含日志和建议功能中概述的步骤来引起我们的注意。

驱动程序开发

此 USB 音频 2.0 类驱动程序由 Thesycon 开发,受 Microsoft 支持。

另请参阅