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


Приемник волн для Kernel-Mode синтезаторов программного обеспечения

Как описано в статье Синтезаторы и приемники волн, драйвер порта DMus реализует приемник волн для программного синтезатора, работающего в режиме ядра. Драйвер мини-порта для синтезатора предоставляет драйверу порта интерфейс ISynthSinkDMus . Приемник волн драйвера порта использует этот интерфейс для считывания данных волн, создаваемых синтезатором.

Чтобы использовать приемник волн драйвера порта DMus, драйвер miniport DMus должен определить фильтр DirectMus с двумя типами контактов:

  • Входной контакт DirectMusic или PIN-код ввода MIDI. Этот контакт является приемником для потока отрисовки, содержащего сообщения MIDI.

  • Вывод волн. Этот контакт является источником для потока отрисовки, содержащего примеры PCM.

На следующем рисунке показан фильтр DirectMusic, содержащий узел синтезатора (KSNODETYPE_SYNTHESIZER). Этот фильтр соответствует предыдущим требованиям для программного синтезатора в режиме ядра, предоставляя входной контакт DirectMusic и выходной волновой контакт. (Кроме того, драйвер минипорта DMus, поддерживающий устаревший синтез MIDI, может предоставлять входной контакт MIDI.)

Схема, иллюстрирующая фильтр DirectMusic для программного синтезатора режима ядра с контактом ввода DirectMusic и выводом волн.

В левой части рисунка поток MIDI попадает в фильтр через контакт ввода DirectMusic. Этот контакт имеет интерфейс IMXF , который он предоставляет драйверу порта. Драйвер порта получает этот интерфейс, вызывая метод IMiniportDMus::NewStream . Драйвер порта передает сообщения MIDI в контакт, вызывая метод IMXF::P utMessage .

В правой части рисунка поток волны выходит из фильтра через контакт вывода волн и передается в приемник волн драйвера порта. Драйвер порта взаимодействует с контактом через интерфейс ISynthSinkDMus . Драйвер порта получает этот интерфейс, сначала вызывая IMiniportDMus::NewStream для получения объекта потока с интерфейсом IMXF , а затем запрашивая у объекта его интерфейс ISynthSinkDMus . Приемник волн извлекает данные волн из контакта, вызывая метод ISynthSinkDMus::Render .

Хотя аппаратный синтезатор может, в принципе, полагаться на приемник волн драйвера порта для отрисовки, вызов ISynthSinkDMus::Render добавляет достаточно задержки в поток MIDI, чтобы сделать его непривлекательным для многих интерактивных приложений. Чтобы уменьшить задержку потока, аппаратные синтезаторы, скорее всего, будут иметь внутренние подключения к оборудованию для смешивания и отрисовки волн, а не использовать приемник волн драйвера порта. Этот тип синтезатора заменяет выходной волновой контакт с правой стороны предыдущего рисунка жестким соединением (представленным в виде моста) с аппаратным микшером.

Интерфейс ISynthSinkDMus предоставляет методы для отрисовки волновых данных через приемник волн, преобразования времени отсчета к выборке времени и обратно, а также для синхронизации с master часами:

ISynthSinkdMus::RefTimeToSample

ISynthSinkdMus::Render

ISynthSinkdMus::SampleToRefTime

ISynthSinkdMus::SyncToMaster

ISynthSinkDMus наследуется от интерфейса IMXF . Дополнительные сведения см. в разделе ISynthSinkDMus.

Драйвер DMus miniport на предыдущем рисунке определяет входной контакт DirectMusic и выходной волновой контакт следующим образом:

  • Чтобы определить входной контакт DirectMusic, драйвер мини-порта определяет диапазон данных контакта, чтобы иметь основной формат типа KSDATAFORMAT_TYPE_MUSIC и подчиненный формат типа KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Это сочетание указывает, что закрепление принимает поток MIDI с меткой времени. Дескриптор диапазона данных — это структура типа KSDATARANGE_MUSIC. (Пример см. в разделе Диапазон данных DirectMusic Stream.) Драйвер мини-порта определяет направление потока данных контакта, KSPIN_DATAFLOW_IN. (KsPinDescriptorструктуры PCPIN_DESCRIPTOR. Элемент DataFlow указывает направление потока данных.) При вызове IMiniportDMus::NewStream для создания объекта потока для этого контакта драйвер порта устанавливает для параметра StreamType значение DMUS_STREAM_MIDI_RENDER.

  • Для идентификации выходного волнового контакта драйвер минипорта определяет диапазон данных контакта, который имеет основной формат типа KSDATAFORMAT_TYPE_AUDIO и подчиненный формат типа KSDATAFORMAT_SUBTYPE_PCM. Это сочетание указывает, что контакт излучает волновой звуковой поток, содержащий примеры PCM. Дескриптор диапазона данных — это структура типа KSDATARANGE_AUDIO. (См. пример в разделе Диапазон данных потока PCM.) Драйвер мини-порта определяет направление потока данных контакта, KSPIN_DATAFLOW_OUT. При вызове IMiniportDMus::NewStream для создания объекта потока для этого контакта драйвер порта устанавливает для параметра StreamType значение DMUS_STREAM_WAVE_SINK.

Кроме того, если бы драйвер поддерживал входной pin-код MIDI для синтезатора, его определение было бы похоже на определение контактного ввода DirectMusic, но в определении закрепления будет указан подчиненный формат типа KSDATAFORMAT_SUBTYPE_MIDI, а контакт будет принимать необработанный поток MIDI, а не поток MIDI с меткой времени.