微型驱动程序可以将流同步到其他微型驱动程序创建的时钟;可将多个流同步到一个时钟。 如果引脚使用或生成此类 主时钟,微型驱动程序应支持 KSPROPERTY_STREAM_MASTERCLOCK。 客户端还可以使用此属性设置引脚的主时钟。 用于执行渲染和捕获操作的引脚经常使用主时钟。 微型驱动程序负责在终止时释放时钟引用。
主时钟的接口是支持方法、属性和事件的文件对象。
针对文件对象的所有查询仅在PASSIVE_LEVEL可用。 但是,时钟位置查询也通过DISPATCH_LEVEL提供的直接函数调用指针来支持,只要文件对象有效,该指针就有效。 此直接调用必须作为上下文参数传递给时钟的文件对象。
文件句柄是通过对筛选器引脚实例发出的创建请求获取的,就像通过IRP_MJ_CREATE创建引脚一样。 请求会导致创建文件句柄,就像创建固定的文件句柄一样,其上下文信息也一样。 然后,此文件句柄将传回调用方,并可用于设置内核模式筛选器的主时钟。 当筛选器被分配图的主时钟时,引脚实例可以查询父文件对象,以确定它是否拥有主时钟。
当筛选器接收到该主时钟的文件句柄时,它可以用于查询属性。 如果主时钟基于内核模式筛选器,则它必须支持一个接口,以便查询主时钟内核模式部分的文件句柄。 如果接口不受支持,则假定时钟是基于用户模式,内核模式筛选器无法同步到该接口。
请求主时钟句柄的 DirectShow 代理筛选器随后将其传递给其基础内核模式筛选器文件句柄。 内核模式筛选器引用基础文件对象。 如果筛选器已有主时钟,它将取消引用文件对象并使用新句柄。 为此,筛选器必须处于 “停止”状态。
主时钟对象的物理时间通常基于硬件。 如果显示主时钟的筛选器没有物理时钟,则流时间会根据所显示数据的时间戳进行。 在这种情况下,由于缺少数据,时间戳可能会停止。
主时钟背后的物理时间可能很远程,在这种情况下,本地代理负责提供准确的读数。 例如,代理负责补偿 1394 连接之间的延迟,或平均跨网络延迟。 此外,如果其他一些内核筛选器是同一 1394 总线上第二个设备的代理,则这两个设备可能会协商与主时钟交互的专用方法。 在这种情况下,设备必须使用专用接口来确定时钟类型,以便验证兼容性。