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


Часы задержки

Модель драйвера мини-порта синтезатора предназначена для синхронизации аудиовыхода между несколькими устройствами. Таким образом, он содержит более сложную модель времени, чем модель, предоставляемая чистым устройством UART.

События доставляются (и записываются из) в драйвер мини-порта с соответствующей меткой времени. Эта метка времени относится к master часам. Часы master — это те же часы, которые используются всеми последовательности во всей системе. Время главного времени измеряется в единицах 100-наносекундных тактов.

Драйвер мини-порта получает текущее время из master часов, вызывая IMasterClock::GetTime. Во время создания закреплений драйвер порта передает интерфейс IMasterClock в режиме ядра драйверу мини-порта в качестве одного из входных параметров метода IMiniportDMus::NewStream . В настоящее время master часы упаковывают системные часы в режиме реального времени. Часы master никогда не изменяются при наличии закреплений, которые требуют, чтобы они были в состоянии выполнения. Это часы с постоянной скоростью, которые никогда не приостанавливается.

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

  • Это позволяет драйверу мини-порта DMus получать события достаточно заранее, чтобы их можно было воспроизводить вовремя, несмотря на задержку устройства. События упорядочены для драйвера мини-порта подсистемой sequencer в драйвере порта DMus.

    Во время создания пин-кода драйвер порта запрашивает у драйвера мини-порта разностное время в 100-наносекундных единицах. Это разностное время определяет, насколько далеко впереди времени презентации каждого события драйвер мини-порта хочет получить событие. Драйвер порта делает все возможное, чтобы доставить события на этом далеко вперед. Если задать очень большое значение для этого разностного значения (заданное параметром SchedulePreFetchобъекта IMiniportDMus::NewStream), драйвер порта передает события драйверу мини-порта сразу после их доставки в драйвер порта из пользовательского режима.

  • Информирование приложений о том, как далеко вперед планировать события. В этом случае использование максимальной задержки нежелательно. Так как события не могут быть отменены после отправки, чем ближе к времени их презентации, тем быстрее будут взаимодействовать приложения и синтезаторы. Чтобы выполнить это требование, в DirectMusic появилась концепция часов задержки.

    Часы задержки предоставляют ближайшее время в будущем, когда событие может быть запланировано для воспроизведения и по-прежнему вовремя. Другими словами, если приложение планирует воспроизвести событие до текущего времени в соответствии с временем задержки, то событие воспроизводится с опозданием. Драйверы мини-порта синтезатора обеспечивают часы задержки, реагируя на элемент свойства KSPROPERTY_SYNTH_LATENCYCLOCK .

    Драйвер мини-порта запрашивается для KSPROPSETID_Synth и KSPROPERTY_SYNTH_LATENCYCLOCK. Обработчик свойств драйвера мини-порта должен возвращать часы задержки, указывающие с точки зрения master часов в следующий раз, когда данные могут быть отрисованы вовремя. Например, если master часов в настоящее время считывает 50 и в настоящее время имеется 25 единиц задержки, то часы задержки считывают 75. Причина, по которой часы реализованы таким образом, заключается в том, что задержка не должна быть постоянной, а возвращаемое значение более полезно для приложений, чем просто разностное значение.