Идентификаторы 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).