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


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

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

Чтобы использовать волновой приемник драйвера порта DMus, драйвер минипорта DMus должен определить фильтр DirectMusic с двумя типами штыревых разъемов.

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

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

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

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

На левой стороне рисунка поток MIDI входит в фильтр через входной разъем DirectMusic. Этот пин-код содержит интерфейс IMXF, который он предоставляет драйверу порта. Драйвер порта получает этот интерфейс, вызвав метод IMiniportDMus::NewStream. Драйвер порта передает сообщения MIDI на вывод, вызывая метод IMXF::PutMessage.

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

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

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

ISynthSinkDMus::RefTimeToSample

ISynthSinkdMus::Render

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

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

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

  • Чтобы определить свой входной контакт DirectMusic, драйвер минипорта задает диапазон данных контакта, чтобы иметь основной формат типа KSDATAFORMAT_TYPE_MUSIC и подформат типа KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Это сочетание указывает, что контакт принимает поток MIDI с меткой времени. Дескриптор диапазона данных — это структура типа KSDATARANGE_MUSIC. (Пример см. в разделе Диапазон данных DirectMusic Stream.) Драйвер минипорта определяет направление потока данных пина как KSPIN_DATAFLOW_IN. (Участник DataFlow структуры PCPIN_DESCRIPTORKsPinDescriptorуказывает направление поток данных.) При вызове 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.

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