为音频适配器安装设备接口

客户端通过供应商在适配器的 INF 文件中指定的一组设备接口访问音频设备。 INF 文件中指定的设备接口与适配器驱动程序在初始化设备时创建的子设备具有一对一对应关系(请参阅创建子设备)。 对于每个设备接口,INF 文件会指定一个 FriendlyName 条目值,该值在接口注册表项下以用户模式进行访问。

在内核流式处理体系结构中,拓扑类别(请参阅 KSPROPERTY_TOPOLOGY_CATEGORIES)表示设备接口类。

下表列出了音频适配器最有可能用来描述其子设备功能的拓扑类别。

类别 说明
KSCATEGORY_ACOUSTIC_ECHO_CANCEL 可以执行回声消除(请参阅 DirectSound 捕获效果)的音频设备将自身注册在此类别下。
KSCATEGORY_AUDIO 所有音频设备都将自身注册在此类别下。
KSCATEGORY_CAPTURE 可捕获数据流的音频设备将自身注册在此类别下。
KSCATEGORY_DATATRANSFORM 对流执行数据转换的音频设备将自身注册在此类别下。
KSCATEGORY_MIXER 可混合数据流的音频设备将自身注册在此类别下。
KSCATEGORY_RENDER 可呈现数据流的音频设备将自身注册在此类别下。
KSCATEGORY_SYNTHESIZER 可将 MIDI 消息转换为波形音频样本或模拟输出信号的音频设备将自身注册在此类别下(请参阅合成器和波形接收器)。
KSCATEGORY_TOPOLOGY 设备的拓扑微型端口驱动程序将自身注册在此类别下。
KSCATEGORY_DRM_DESCRAMBLE 可以解译受 DRM 保护的波次流的音频设备将自身注册在此类别下(请参阅数字版权管理)。

有关拓扑类别的完整列表,请参阅头文件 Ks.h 和 Ksmedia.h 中定义的 KSCATEGORY_XXX GUID。

所有音频设备都分类在 KSCATEGORY_AUDIO 下,但音频设备也可能分为其他类别,例如 KSCATEGORY_RENDER(对于音频渲染设备)或 KSCATEGORY_SYNTHESIZER(对于合成器)。 对于 INF 文件为设备指定的每个类别,Windows Installer 将在类别名称下为该设备生成一组注册表条目(请参阅筛选器工厂)。

只有包含内置合成器的设备才能将自身注册在类别 KSCATEGORY_SYNTHESIZER 下。 请注意,此类别不包括纯 MPU-401 设备。 纯 MPU-401 设备(可以输出或输入来自 UART 的原始 MIDI)应将自身注册在以下类别下:

  • KSCATEGORY_AUDIO

  • KSCATEGORY_RENDER

  • KSCATEGORY_CAPTURE

请注意,SysAudio 系统驱动程序会保留注册表类别 KSCATEGORY_AUDIO_DEVICE 专用于其虚拟音频设备。 适配器驱动程序不应将自身注册在此类别下。

以下示例会安装适配器通常支持音频设备的四个通用系统定义设备接口。

示例:安装音频设备接口

在此示例中,XYZ 音频设备的 device-install 节使用 INF AddInterface 指令安装四个音频适配器接口。 在下面的四个指令中,每个指令都会向接口分配唯一引用字符串,适配器驱动程序可以使用该字符串来区分每个接口类的实例。

  [XYZ-Audio-Device.Interfaces]
  AddInterface=%KSCATEGORY_AUDIO%,%KSName_Wave%,XYZ-Audio-Device.Wave
  AddInterface=%KSCATEGORY_RENDER%,%KSName_Wave%,XYZ-Audio-Device.Wave
  AddInterface=%KSCATEGORY_CAPTURE%,%KSName_Wave%,XYZ-Audio-Device.Wave
  AddInterface=%KSCATEGORY_TOPOLOGY%,%KSName_Topology%,XYZ-Audio-Device.Topology

前三个 AddInterface 指令指会定名为 XYZ-Audio-Device.Wave 的 add-interface 节。 最后一个指定名为 XYZ-Audio-Device.Topology 的 add-interface 节。 每个 add-interface 节都会将以下注册表条目添加到设备接口子项,该子项可在 \DeviceClasses\<InterfaceGUID> 注册表项下以用户模式可访问:

  • FriendlyName 注册表条目为每个设备接口指定一个友好名称。

  • Microsoft DirectShow 需要 CLSID 注册表条目(设置为代理 GUID 值),该值指示适配器可由 KSProxy 系统驱动程序访问和控制。

以下示例中显示了两个 add-interface 节,其中包含将每个接口的 FriendlyName 和 CLSID 添加到注册表的 INF 文件条目:

  [XYZ-Audio-Device.Wave]
  AddReg=XYZ-Audio-Device.Wave.AddReg
  [XYZ-Audio-Device.Wave.AddReg]
  HKR,,FriendlyName,,%WaveDeviceName%
  HKR,,CLSID,,%Proxy.CLSID%

  [XYZ-Audio-Device.Topology]
  AddReg=XYZ-Audio-Device.Topology.AddReg
  [XYZ-Audio-Device.Topology.AddReg]
  HKR,,FriendlyName,,%WaveDeviceMixerName%
  HKR,,CLSID,,%Proxy.CLSID%

此示例中的关键字 HKR 表示设备的系统提供的注册表路径。 有关详细信息,请参阅 INF AddReg 指令

下面是此示例的 Strings 节。

  [Strings]
  KSCATEGORY_AUDIO="{6994AD04-93EF-11D0-A3CC-00A0C9223196}"
  KSCATEGORY_RENDER="{65E8773E-8F56-11D0-A3B9-00A0C9223196}"
  KSCATEGORY_CAPTURE="{65E8773D-8F56-11D0-A3B9-00A0C9223196}"
  KSCATEGORY_TOPOLOGY="{DDA54A40-1E4C-11D1-A050-405705C10000}"
  Proxy.CLSID="{17CCA71B-ECD7-11D0-B908-00A0C9223196}"
  WaveDeviceName="XYZ Audio Device"
  WaveDeviceMixerName="XYZ Audio Device Super Mixer"

AddInterface 指令为 KSCATEGORY_XXX 设备接口指定的字符串名称无法本地化,因为适配器驱动程序在内部使用与字符串常量相同的名称。 Windows 驱动程序工具包 (WDK) 中的示例适配器驱动程序对其音频设备接口使用以下字符串名称:

  KSNAME_Wave="Wave"
  KSNAME_UART="UART"
  KSNAME_FMSynth="FMSynth"
  KSNAME_Topology="Topology"
  KSNAME_Wavetable="Wavetable"
  KSNAME_DMusic="DMusic"

为了保持一致,专有驱动程序应将这些相同的名称分配给其相应的设备接口。 如果驱动程序支持其他专有设备接口,则可以为这些接口发明自己的专有名称。 确保驱动程序使用的名称与 INF 文件中的名称匹配。 如果字符串不匹配,系统设置将不会加载驱动程序。