音乐技术 GUID

MIDI 或 DMus 微型端口驱动程序必须指定其每个引脚能够处理的流格式范围。 如引脚工厂中所述,驱动程序将此类信息指定为含一个或多个数据范围描述符的数组,其中每个描述符都是类型 KSDATARANGE_MUSIC 的结构。 此结构的 Technology 成员表示 MIDI 或 DirectMusic 设备使用的合成器技术类型音乐。 微型端口驱动程序可以将 Technology 成员设置为下表中所示的 GUID 值之一(左列)。

KSDATARANGE_MUSIC 技术 GUID MIDIOUTCAPS wTechnology 值 含义

KSMUSIC_TECHNOLOGY_PORT

MOD_MIDIPORT

设备是 MPU-401 设备。

KSMUSIC_TECHNOLOGY_SYNTH

MOD_SYNTH

设备是合成器。

KSMUSIC_TECHNOLOGY_SQSYNTH

MOD_SQSYNTH

设备是方波合成器。

KSMUSIC_TECHNOLOGY_FMSYNTH

MOD_FMSYNTH

设备是 FM 合成器。

KSMUSIC_TECHNOLOGY_MAPPER

MOD_MAPPER

设备是 Microsoft MIDI 映射器。

KSMUSIC_TECHNOLOGY_WAVETABLE

MOD_WAVETABLE

设备是硬件可波式合成器。

KSMUSIC_TECHNOLOGY_SWSYNTH

MOD_SWSYNTH

设备是软件合成器。

midiOutGetDevCaps 函数将自身从驱动程序接收的技术 GUID 转换为自身写入它输出到调用方的 MIDIOUTCAPS 结构的 wTechnology 成员的索引。 上表显示了对应于每个技术 GUID 的 wTechnology 值(中心列)。 有关 midiOutGetDevCaps 和 MIDIOUTCAPS 的详细信息,请参阅 Microsoft Windows SDK 文档。

枚举设备时,使用 Windows 多媒体 midiOut 或 midiIn API 的 MIDI 应用程序可以看到 MIDI 引脚,但不能看到 DirectMusic 引脚。 DirectMusic 应用程序可以看到 MIDI 和 DirectMusic 引脚。 通过将引脚数据范围中的子类型 GUID 设置为 KSDATAFORMAT_SUBTYPE_MIDI,MIDI 或 DMus 微型端口驱动程序可标识 MIDI 引脚。 通过将子类型 GUID 设置为 KSDATAFORMAT_SUBTYPE_DIRECTMUSIC,DMus 微型端口驱动程序可标识 DirectMusic 引脚。 有关 MIDI 和 DirectMusic 引脚的数据范围示例,请参阅 MIDI 流数据范围DirectMusic 流数据范围

MIDI 和 DirectMusic 筛选器中所述,适配器驱动程序会调用 PcNewMiniport 函数,以创建 Portcls.sys 中系统提供的微型端口驱动程序之一的实例。 调用方指定下表中的一个驱动程序 GUID,以指定要实例化的微型端口驱动程序。

驱动程序 GUID 技术 GUID

CLSID_MiniportDriverDMusUART

KSMUSIC_TECHNOLOGY_PORT

CLSID_MiniportDriverDMusUARTCapture

KSMUSIC_TECHNOLOGY_PORT

CLSID_MiniportDriverFmSynth

KSMUSIC_TECHNOLOGY_FMSYNTH

CLSID_MiniportDriverFmSynthWithVol

KSMUSIC_TECHNOLOGY_FMSYNTH

CLSID_MiniportDriverUart

KSMUSIC_TECHNOLOGY_PORT

上表的右列指示相应的微型端口驱动程序在其引脚数据范围中指定的技术 GUID。 例如,FmSynth 微型端口驱动程序会将技术 GUID KSMUSIC_TECHNOLOGY_FMSYNTH 分配给其引脚。

某些可波式合成器设备将自身作为 MPU-401 设备(采用技术 GUID KSMUSIC_TECHNOLOGY_PORT)向应用程序公开。 如果没有外部合成器,它们可以通过可波式合成器播放原始 MIDI 字节流。

但是,在选择默认(首选)MIDI 播放设备时,midiOut API 首选可波式合成器设备(采用技术 GUID KSMUSIC_TECHNOLOGY_WAVETABLE)。 它会显式避免选择 MPU-401 设备作为默认设备。

为了使自己有资格成为默认设备,可播放原始 MIDI 的可波式设备应将自身作为可波式设备公开,而不是作为 MPU-401 设备公开。 但是,如果适配器驱动程序在使用系统提供的 MPU-401 微型端口驱动程序 DMusUART,来管理其可波式合成器设备,则微型端口驱动程序会静态将技术 GUID KSMUSIC_TECHNOLOGY_PORT 分配给其引脚。

通过调用 IMusicTechnology::SetTechnology 方法,适配器驱动程序可以覆盖微型端口驱动程序数据范围内的技术 GUID。 在以下代码示例中,适配器驱动程序将 DMusUART 微型端口驱动程序数据范围中的技术 GUID 从其默认值 KSMUSIC_TECHNOLOGY_PORT 更改为值 KSMUSIC_TECHNOLOGY_WAVETABLE。 通过这一新设置,类似 MPU 的可波式设备将有资格被 midiOut API 选择为默认 MIDI 设备。

  // Create the miniport object.
  PUNKNOWN miniport;

  ntStatus = PcNewMiniport((PMINIPORT*)&miniport, CLSID_MiniportDriverDMusUART);

  // Query the miniport driver for the IMusicTechnology interface.
  IMusicTechnology* pMusicTechnology;

  if (NT_SUCCESS(ntStatus))
  {
      ntStatus = miniport->QueryInterface(IID_IMusicTechnology, (PVOID*)&pMusicTechnology);
  }

  // Set the Technology members in the DirectMusic data-range entries
  // for all the pins that are exposed by this miniport.
  // SetTechnology should be called before initializing the miniport.
  if (NT_SUCCESS(ntStatus))
  {
      ntStatus = pMusicTechnology->SetTechnology(&KSMUSIC_TECHNOLOGY_WAVETABLE);
  }

如前面的代码示例中的注释所示,适配器驱动程序应在调用端口驱动程序的 Init 方法之前,调用 SetTechnology(这反过来又会调用微型端口驱动程序的 Init 方法)。 系统提供的 DMusUART 和 UART 微型端口驱动程序都支持 IMusicTechnology 接口。 对于其他微型端口驱动程序,IMusicTechnology 支持为可选。 有关详细信息,请参阅 Microsoft Windows 驱动程序工具包 (WDK) 中 DMusUART 示例音频驱动程序中的 SetTechnology 方法实现。