Графические интерфейсы музыкальной технологии

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

Технология GUID KSDATARANGE_MUSIC 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 mapper.

KSMUSIC_TECHNOLOGY_WAVETABLE

MOD_WAVETABLE

Устройство — это аппаратный синтезатор волны.

KSMUSIC_TECHNOLOGY_SWSYNTH

MOD_SWSYNTH

Устройство — это программный синтезатор.

Функция midiOutGetDevCaps преобразует идентификатор GUID технологии, который он получает от драйвера к индексу, который записывается в член wTechnology структуры MIDIOUTCAPS, которая выводится вызывающему объекту. В предыдущей таблице показано значение wTechnology (центральный столбец), соответствующее каждому идентификатору GUID технологии. Дополнительные сведения о midiOutGetDevCaps и MIDIOUTCAPS см. в документации по microsoft Windows SDK.

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

Как описано в MIDI и DirectMusic Filters, драйвер адаптера вызывает функцию 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 через синтезатор волны.

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

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

Вызвав метод IMusicTechnology::SetTechnology , драйвер адаптера может перезаписать идентификаторы графического интерфейса технологии в диапазонах данных драйвера мини-порта. В следующем примере кода драйвер адаптера изменяет 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 ). Системно поставляемые драйверы DMusUART и UART поддерживают интерфейс IMusicTechnology. Для других драйверов минипорта поддержка IMusicTechnology является необязательной. Дополнительные сведения см. в реализации метода SetTechnology в примере звукового драйвера DMusUART в комплекте драйверов Microsoft Windows (WDK).