Приемник волн для Kernel-Mode синтезаторов программного обеспечения
Как описано в статье Синтезаторы и приемники волн, драйвер порта DMus реализует приемник волн для программного синтезатора, работающего в режиме ядра. Драйвер мини-порта для синтезатора предоставляет драйверу порта интерфейс ISynthSinkDMus . Приемник волн драйвера порта использует этот интерфейс для считывания данных волн, создаваемых синтезатором.
Чтобы использовать приемник волн драйвера порта DMus, драйвер miniport DMus должен определить фильтр DirectMus с двумя типами контактов:
Входной контакт DirectMusic или PIN-код ввода MIDI. Этот контакт является приемником для потока отрисовки, содержащего сообщения MIDI.
Вывод волн. Этот контакт является источником для потока отрисовки, содержащего примеры PCM.
На следующем рисунке показан фильтр DirectMusic, содержащий узел синтезатора (KSNODETYPE_SYNTHESIZER). Этот фильтр соответствует предыдущим требованиям для программного синтезатора в режиме ядра, предоставляя входной контакт DirectMusic и выходной волновой контакт. (Кроме того, драйвер минипорта DMus, поддерживающий устаревший синтез MIDI, может предоставлять входной контакт MIDI.)
В левой части рисунка поток MIDI попадает в фильтр через контакт ввода DirectMusic. Этот контакт имеет интерфейс IMXF , который он предоставляет драйверу порта. Драйвер порта получает этот интерфейс, вызывая метод IMiniportDMus::NewStream . Драйвер порта передает сообщения MIDI в контакт, вызывая метод IMXF::P utMessage .
В правой части рисунка поток волны выходит из фильтра через контакт вывода волн и передается в приемник волн драйвера порта. Драйвер порта взаимодействует с контактом через интерфейс ISynthSinkDMus . Драйвер порта получает этот интерфейс, сначала вызывая IMiniportDMus::NewStream для получения объекта потока с интерфейсом IMXF , а затем запрашивая у объекта его интерфейс ISynthSinkDMus . Приемник волн извлекает данные волн из контакта, вызывая метод ISynthSinkDMus::Render .
Хотя аппаратный синтезатор может, в принципе, полагаться на приемник волн драйвера порта для отрисовки, вызов ISynthSinkDMus::Render добавляет достаточно задержки в поток MIDI, чтобы сделать его непривлекательным для многих интерактивных приложений. Чтобы уменьшить задержку потока, аппаратные синтезаторы, скорее всего, будут иметь внутренние подключения к оборудованию для смешивания и отрисовки волн, а не использовать приемник волн драйвера порта. Этот тип синтезатора заменяет выходной волновой контакт с правой стороны предыдущего рисунка жестким соединением (представленным в виде моста) с аппаратным микшером.
Интерфейс ISynthSinkDMus предоставляет методы для отрисовки волновых данных через приемник волн, преобразования времени отсчета к выборке времени и обратно, а также для синхронизации с master часами:
ISynthSinkdMus::RefTimeToSample
ISynthSinkdMus::SampleToRefTime
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 с меткой времени.