Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер минипорта 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).