Delen via


Hoofdklokken

Minidrivers kunnen streams synchroniseren met klokken die zijn gemaakt door andere minidrivers; meerdere streams kunnen worden gesynchroniseerd met één klok. Als de pin een dergelijke hoofdklok gebruikt of produceert, moet de minidriver KSPROPERTY_STREAM_MASTERCLOCK ondersteunen. Clients kunnen deze eigenschap ook gebruiken om de hoofdklok voor de pin in te stellen. Pinnen die rendering- en opnamebewerkingen uitvoeren, gebruiken vaak een hoofdklok. De minidriver is verantwoordelijk voor het vrijgeven van klokverwijzingen bij beëindiging van het proces.

De interface voor een hoofdklok is een bestandsobject dat methoden, eigenschappen en gebeurtenissen ondersteunt.

Alle query's voor het bestandsobject zijn alleen beschikbaar op PASSIVE_LEVEL. De klokpositiequery wordt echter ook ondersteund via een aanroepaanwijzer voor directe functies die beschikbaar is op DISPATCH_LEVEL, wat geldig is zolang het bestandsobject geldig is. Deze directe aanroep moet als contextparameter worden doorgegeven aan het bestandsobject van de klok.

De bestandshandle wordt verkregen via een verzoek voor het creëren van een filterpin-instantie, net zoals de pin wordt gecreëerd door IRP_MJ_CREATE. De aanvraag zorgt ervoor dat een bestandsgreep wordt gemaakt, net zoals een bestandsgreep voor een pincode wordt gemaakt, met eigen contextinformatie. Deze bestandsgreep wordt vervolgens teruggegeven aan de aanroeper en kan worden gebruikt om de hoofdklok in te stellen voor kernelmodusfilters. Op het moment dat het filter aan de masterklok van de grafiek wordt toegewezen, kan een pininstantie een query op het bovenliggende bestandsobject uitvoeren om te bepalen of het eigenaar is van de masterklok.

Wanneer een filter de file handle van deze hoofdklok krijgt, kan het vervolgens worden gebruikt om eigenschappen op te vragen. Als een hoofdklok is gebaseerd op een kernelmodusfilter, moet deze een interface ondersteunen om een query uit te voeren op de bestandsgreep naar het kernelmodusgedeelte van de hoofdklok. Als de interface niet wordt ondersteund, wordt ervan uitgegaan dat de klok is gebaseerd op de gebruikersmodus en dat filters in de kernelmodus niet met deze interface kunnen worden gesynchroniseerd.

Het DirectShow-proxyfilter dat de hoofdklokgreep aanvraagt, geeft het vervolgens door aan de onderliggende filterbestandsgreep voor kernelmodus. Het kernelmodusfilter verwijst naar het onderliggende bestandsobject. Als het filter al een hoofdklok heeft, heft het de dereferentie van het bestandsobject op en gebruikt het de nieuwe handle. Hiervoor moet het filter de status Stoppen hebben.

De fysieke tijd op het meesterklokobject is vaak op hardware gebaseerd. Als een filter dat de hoofdklok weergeeft geen fysieke klok heeft, verloopt de stroomtijd wegens de tijdstempels van de gepresenteerde gegevens. In een dergelijke situatie kunnen tijdstempels stoppen vanwege een gebrek aan gegevens.

De fysieke tijd achter de hoofdklok kan extern zijn, in dat geval is het de verantwoordelijkheid van de lokale proxy om nauwkeurige metingen te bieden. De proxy is bijvoorbeeld verantwoordelijk voor het compenseren van de vertraging in een 1394-verbinding of het gemiddelde van de vertraging in een netwerk. Als een ander kernelfilter bovendien een proxy is voor een tweede apparaat op dezelfde 1394-bus, kunnen de twee apparaten onderhandelen over een persoonlijke methode om te communiceren met de hoofdklok. In dat geval moeten de apparaten privéinterfaces gebruiken om het kloktype te bepalen om de compatibiliteit te controleren.