Главные часы

Минидрайверы могут синхронизировать потоки с клоками, созданными другими минидрайверами; несколько потоков можно синхронизировать с одним клоком. Если вывод использует или создает такие ведущие часы, минидрайвер должен поддерживать KSPROPERTY_STREAM_MASTERCLOCK. Клиенты также могут использовать это свойство, чтобы задать главные часы для пин-кода. Пины, выполняющие операции отрисовки и записи, часто используют основные часы. Минодрайвер отвечает за освобождение ссылок на часы при завершении работы.

Интерфейс основного таймера представляет собой файловый объект, поддерживающий методы, свойства и события.

Все запросы к объекту файла доступны только в PASSIVE_LEVEL. Однако запрос на положение часов также поддерживается с помощью указателя прямого вызова функции, доступного в DISPATCH_LEVEL, который действителен до тех пор, пока объект файла действителен. Этот прямой вызов должен передаваться в файловый объект часов в качестве параметра контекста.

Дескриптор файла приобретается с помощью запроса на создание экземпляра пин-кода фильтра, так как создание пин-кода выполняется IRP_MJ_CREATE. Запрос приводит к созданию дескриптора файла, подобно созданию дескриптора для закрепленного объекта, с собственными сведениями о контексте. Затем этот дескриптор файла передается вызывающей стороне и может использоваться для задания главных часов для фильтров в режиме ядра. В то время, когда фильтр назначается главным часам графа, экземпляр пин-кода может запрашивать родительский объект файла, чтобы определить, владеет ли он главными часами.

Если фильтр получает дескриптор файла к этим главным часам, его можно использовать для запроса свойств. Если главные часы основаны на фильтре в режиме ядра, они должны поддерживать интерфейс для запроса дескриптора файла к части главных часов в режиме ядра. Если интерфейс не поддерживается, предполагается, что часы основаны на пользовательском режиме, а фильтры в режиме ядра не могут синхронизироваться с ним.

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

Физическое время на объекте главных часов часто основано на оборудовании. Если фильтр, представляющий опорные часы, не имеет физических часов, время потока продвигается в соответствии с метками времени представленных данных. В такой ситуации метки времени могут остановиться из-за отсутствия данных.

Физическое время главных часов может находиться на удалении, в этом случае обязанность локального прокси-сервера — предоставить точные значения. Например, прокси-сервер несет ответственность за компенсацию задержки через подключение 1394 или усреднение задержки в сети. Кроме того, если другой фильтр ядра является прокси-сервером для второго устройства на той же шине 1394, два устройства могут согласовывать частный метод взаимодействия с главными часами. В таком случае устройства должны использовать частные интерфейсы для определения типа часов для проверки совместимости.