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


Синтезаторы и приемники волн

Модуль отрисовки состоит из двух частей:

  • Синтезатор, который принимает MIDI-сообщения и преобразует их в образцы волнового звука.

  • Приемник волны, который предоставляет назначение для выборки волн и помогает синхронизировать выходные данные.

По умолчанию приложение DirectMusic использует Microsoft Software Synthesizer (dmsynth.dll) в качестве синтезатора и DirectSound в качестве устройства вывода волн.

В DirectX 6.1 и DirectX 7 приложение DirectMusic может переопределить эти значения по умолчанию. Например, приложение может использовать Microsoft Software Synthesizer, но направить выходные данные в WAV-файл или реализовать пользовательский синтезатор, который работает с приемником волн по умолчанию. Последний сценарий более вероятен, так как приемник волн по умолчанию должен хорошо работать для большинства синтезаторов.

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

На рисунке ниже показано, как архитектура DirectMusic включает синтезаторы пользовательского режима и приемники волн. Обратите внимание, что блок с меткой DirectMusic Port на следующем рисунке не следует путать с драйвером DMus в режиме ядра в модуле системного драйвера PortCls, portcls.sys. Порт DirectMusic — это объект пользовательского режима с интерфейсом IDirectMusicPort (часть API DirectMusic) и реализован в dmusic.dll. Дополнительные сведения о портах DirectMusic см. в документации по Microsoft Windows SDK.

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

На предыдущем рисунке приложение отправляет данные на пользовательский порт DirectMusic, который передает данные (MIDI или DLS) в программный синтезатор (dmsynth.dll по умолчанию), чтобы можно было преобразовать заметки в волновые данные. Приемник волны управляет временем и передает синтезатору буфер для заполнения, когда он будет готов к получению всплеска данных. Синтезатор заполняет буфер (объект IDirectSoundBuffer по умолчанию) данными, чтобы их можно было передать в DirectSound. DirectSound воспроизводит данные через системный драйвер KMixer или через маркер отрисовки с аппаратным ускорением DirectSound на звуковом устройстве, если он доступен (см. обзор аппаратного ускорения DirectSound).

Эта же базовая архитектура также применяется к реализациям режима ядра, за исключением того, что приемник волны передает буфер данных непосредственно в оборудование или в системный драйвер KMixer. Драйвер порта DMus реализует приемник волн для программного синтезатора в режиме ядра. Дополнительные сведения см. в статье Приемник волны для Kernel-Mode синтезаторов программного обеспечения.

После выполнения этих действий порт DirectMusic в пользовательском режиме должен быть открыт и активирован для использования. Как только эта часть кода драйвера будет работать, вы можете приступить к реализации функций. Используйте исходный код для пользовательского программного синтезатора (Майкрософт) в качестве шаблона и начните добавлять новые функции.

Программный синтезатор в пользовательском режиме можно реализовать как объект с интерфейсом IDirectMusicSynth. Приемник волн в пользовательском режиме можно реализовать как объект с интерфейсом IDirectMusicSynthSink. Дополнительные сведения см. в разделах IDirectMusicSynth и IDirectMusicSynthSink.