Поделиться через


Идентификаторы GUID music Technology

Драйвер miniport MIDI или DMus должен указать диапазон форматов потоков, которые может обрабатывать каждый из его контактов. Как описано в разделе Pin Factories, драйвер указывает эти сведения в виде массива одного или нескольких дескрипторов диапазона данных, каждый из которых является структурой типа KSDATARANGE_MUSIC. Элемент Technology этой структуры указывает, какой тип технологии синтезатора использует устройство MIDI или DirectMusic. Драйвер мини-порта может задать элементу Technology одно из значений GUID, показанных в следующей таблице (левый столбец).

guid технологии KSDATARANGE_MUSIC MIDIOUTCAPS wTechnology Value Значение

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 технологии, получаемый от драйвера, в индекс, который он записывает в член wTechnology структуры MIDIOUTCAPS, которую она выводит вызывающему объекту. В предыдущей таблице показано значение wTechnology (центральный столбец), соответствующее guid каждой технологии. Дополнительные сведения о midiOutGetDevCaps и MIDIOUTCAPS см. в документации по Microsoft Windows SDK.

При перечислении устройств приложение MIDI, использующее API midiOut или midiIn для Windows multimedia, может видеть контакты MIDI, но не контакты DirectMusic. Приложение DirectMusic может просматривать контакты MIDI и DirectMusic. Драйвер мини-порта MIDI или DMus идентифицирует PIN-код MIDI, задавая guid подтипа в диапазонах данных контакта KSDATAFORMAT_SUBTYPE_MIDI. Драйвер мини-порта DMus идентифицирует закрепление DirectMusic, задав guid подтипа KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Примеры диапазонов данных для контактов MIDI и DirectMusic см. в разделах MidI Stream Data Range и DirectMusic Stream Data Range.

Как описано в разделах ФИЛЬТРЫ 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 присваивает KSMUSIC_TECHNOLOGY_FMSYNTH технологии своим контактам.

Некоторые волновые синтезаторные устройства предоставляют приложениям как устройства MPU-401 (с технологическим GUID KSMUSIC_TECHNOLOGY_PORT). При отсутствии внешнего синтезатора они могут воспроизводить необработанный поток MIDI-байтов через волновой синтезатор.

Однако API midiOut предпочитает волновые синтезаторные устройства (с технологическим GUID KSMUSIC_TECHNOLOGY_WAVETABLE) при выборе стандартного (предпочтительного) устройства воспроизведения MIDI. Он явно избегает выбора устройства MPU-401, которое будет использоваться по умолчанию.

Чтобы сделать себя подходящим для использования в качестве устройства по умолчанию, устройство с волновой схемой, которое может воспроизводить необработанный MIDI, должно предоставлять себя как волновое, а не устройство MPU-401. Однако если драйвер адаптера использует системный драйвер MPU-401 miniport, DMusUART, для управления своим волновым синтезатором, этот драйвер минипорта статически назначает KSMUSIC_TECHNOLOGY_PORT технологии своим контактам.

Вызывая метод IMusicTechnology::SetTechnology , драйвер адаптера может перезаписать идентификаторы GUID технологии в диапазонах данных драйвера мини-порта. В следующем примере кода драйвер адаптера изменяет GUID технологии в диапазонах данных драйвера мини-порта DMusUART со значения по умолчанию KSMUSIC_TECHNOLOGY_PORT на значение KSMUSIC_TECHNOLOGY_WAVETABLE. Благодаря этому новому параметру устройство, подобное MPU, может быть выбрано API midiOut в качестве 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);
  }

Как указано в комментарии в предыдущем примере кода, драйвер адаптера должен вызвать SetTechnology перед вызовом метода драйвера Init порта (который, в свою очередь, вызывает метод драйвера Init miniport). Системные драйверы мини-портов DMusUART и UART поддерживают интерфейс IMusicTechnology . Для других драйверов мини-портов поддержка IMusicTechnology является необязательной. Дополнительные сведения см. в разделе Реализация метода SetTechnology в примере аудиодрайва DMusUART в комплекте драйверов Microsoft Windows (WDK).