Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Модель минипорта синтезатора предназначена для синхронизации выходных данных звука между несколькими устройствами. Таким образом, он содержит более сложную модель времени, чем это предоставляется чистым устройством UART.
События доставляются (и записываются из) минипорт-драйвера с связанной меткой времени. Эта метка времени относится к главному часову. Главные часы такие же, используемые всеми последовательностями во всей системе. Время мастер-часов измеряется в единицах тиков по 100 наносекунд.
Драйвер минипорта получает текущее время из главных часов путем вызова IMasterClock::GetTime. Во время создания пин-кода драйвер порта передает интерфейс IMasterClock режима ядра в драйвер минипорта в качестве одного из входных параметров методу IMiniportDMus::NewStream . В настоящее время опорные часы синхронизируют системные часы в режиме реального времени. Главные часы никогда не изменяются при наличии контактов, требующих, чтобы он был в состоянии выполнения. Это часы постоянной частоты, которые никогда не останавливаются.
Все устройства воспроизведения имеют некоторую задержку между приемом события и моментом, когда событие может быть услышано. Эта задержка может быть константой или переменной (как в случае синтезатора программного обеспечения, где задержка зависит от текущей позиции воспроизведения буфера звука). Эта задержка компенсируется следующими причинами:
Позволяя драйверу минипорта DMus получать события достаточно заранее, чтобы они могли воспроизводиться вовремя, несмотря на задержку устройства. События упорядочиваются для минипорт-драйвера с помощью модуля секвенсора в драйвере порта DMus.
Во время создания пин-кода драйвер портов запрашивает драйвер мини-порта для разностного времени в 100-наносекундах единиц. Это время дельты определяет, насколько заблаговременно относительно времени презентации каждого события драйвер минипорта хочет получить это событие. Драйвер порта делает свои лучшие усилия по доставке событий на этом далеко вперед. Указание очень большого значения для этой дельты (установленного параметром SchedulePreFetchIMiniportDMus::NewStream) заставляет драйвер порта передавать события в мини-драйвер сразу после их доставки драйверу порта из режима пользователя.
Информирование приложений о том, насколько далеко впереди планировать события. Использование максимальной задержки в данном случае нежелательно. Поскольку события не могут быть отменены после отправки, чем ближе к времени их презентации они могут быть отправлены, тем более оперативно приложение и синтезатор могут взаимодействовать. Для обработки этого требования DirectMusic представила концепцию часов задержки.
Латентный таймер предоставляет ближайшее время в будущем, чтобы событие можно было запланировать для воспроизведения и при этом воспроизведение будет своевременным. Другими словами, если приложение планирует воспроизвести событие до текущего времени в соответствии с часами задержки, то событие воспроизводится поздно. Минипорт-драйверы синтезатора обеспечивают часы задержки, отвечая на элемент свойства KSPROPERTY_SYNTH_LATENCYCLOCK .
Минипорт-драйвер запрашивается для KSPROPSETID_Synth и KSPROPERTY_SYNTH_LATENCYCLOCK. Обработчик свойств минипорта должен возвращать значение задержки, указывающее в терминах мастер-часов, когда данные могут быть воспроизведены вовремя. Например, если основные часы в настоящий момент показывают 50, и имеется 25 задержки, то часы задержки показывают 75. Причина реализации часов таким образом заключается в том, что задержка не должна быть постоянной величиной, а возвращаемое значение более полезно для приложений, чем просто разность.