Horloges de référence

L’une des fonctions du Gestionnaire de filtres Graph consiste à synchroniser tous les filtres du graphique sur la même horloge, appelée horloge de référence.

Tout objet qui expose l’interface IReferenceClock peut agir comme l’horloge de référence. L’horloge de référence peut être fournie par un filtre DirectShow , généralement le convertisseur audio, qui a accès à un minuteur matériel. En tant que secours, le Gestionnaire de filtre Graph peut utiliser l’heure système.

Nominalement, une horloge de référence mesure l’heure dans les intervalles de 100 nanosecondes, même si la précision réelle de l’horloge peut être inférieure. Pour récupérer l’heure actuelle de l’horloge, appelez la méthode IReferenceClock::GetTime . La base de référence de l’horloge , l’heure à partir de laquelle elle commence à compter, dépend de l’implémentation, de sorte que la valeur retournée par GetTime n’est pas intrinsèquement significative. Ce qui importe est le delta à partir du moment où le graphique a commencé à s’exécuter.

Bien que la précision d’une horloge de référence puisse varier, les heures retournées par la méthode GetTime sont garanties pour augmenter monotoniquement. En d’autres termes, les heures d’horloge ne vont jamais revenir en arrière. Si une horloge de référence génère des heures d’horloge à partir d’une source matérielle et que l’horloge matérielle saute vers l’arrière (par exemple, s’il existe un ajustement de l’horloge), la méthode GetTime doit continuer à retourner la dernière heure signalée jusqu’à ce que l’horloge matérielle se rattrape. Pour plus d’informations, consultez la classe CBaseReferenceClock.

Horloge de référence par défaut

Le Gestionnaire de filtre Graph sélectionne automatiquement une horloge de référence lorsque le graphique s’exécute. Il utilise l’algorithme suivant pour sélectionner l’horloge :

  • Si l’application a sélectionné une horloge (voir ci-dessous), utilisez cette horloge.
  • Si le graphique contient un filtre source actif qui prend en charge IReferenceClock, utilisez ce filtre. Pour obtenir la définition d’une source dynamique, consultez Sources dynamiques.
  • Si le graphique ne contient pas de filtres sources en direct, utilisez n’importe quel filtre dans le graphique qui prend en charge IReferenceClock, en commençant par les renderers et en travaillant en amont. Préférez les filtres connectés par rapport aux filtres non connectés. (Si le graphique affiche un flux audio, cette étape de l’algorithme sélectionne normalement le filtre du convertisseur audio.)
  • Si aucun filtre ne fournit une horloge appropriée, utilisez l’horloge de référence système, qui est basée sur l’heure système.

Définition de l’horloge de référence

Une application peut sélectionner une horloge en appelant la méthode IMediaFilter::SetSyncSource sur le Gestionnaire de filtre Graph. Vous devez le faire uniquement si vous avez une raison particulière de préférer une autre horloge.

Vous pouvez indiquer au Gestionnaire de filtre Graph de ne pas utiliser d’horloge de référence en appelant SetSyncSource avec la valeur NULL. Par exemple, vous pouvez le faire pour traiter des exemples aussi rapidement que possible. Pour restaurer l’horloge de référence par défaut, appelez la méthode IFilterGraph::SetDefaultSyncSource sur le Gestionnaire de filtre Graph.

Chaque fois que l’horloge de référence change, le Gestionnaire de filtre Graph avertit chaque filtre en appelant sa méthode IMediaFilter::SetSyncSource. Les applications ne doivent jamais appeler cette méthode sur les filtres.

Définition de l’horloge Graph

Heure et horloges dans DirectShow