Processus de connexion CBasePin

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Cette section décrit comment la classe CBasePin implémente le processus de connexion d’épingle.

Le Gestionnaire de graphe de filtre lance toutes les connexions d’épingle. Il appelle la méthode IPin::Connect de la broche de sortie, en spécifiant la broche d’entrée. La broche de sortie termine la connexion en appelant la méthode IPin::ReceiveConnection de la broche d’entrée. La broche d’entrée peut accepter ou rejeter la connexion.

Le Gestionnaire de graphe de filtre peut également spécifier un type de média pour la connexion. Si c’est le cas, les broches essaient de se connecter à ce type. Si ce n’est pas le cas, les broches doivent négocier le type. Le Gestionnaire de graphe de filtre peut également spécifier un type de média partiel , qui a la valeur GUID_NULL pour le type principal, le sous-type ou le type de format. Dans ce cas, les broches essaient de faire correspondre les parties du type de média qui ont été spécifiées ; la valeur GUID_NULL agit comme un caractère générique.

La méthode CBasePin::Connect commence par vérifier que l’épingle peut accepter une connexion. Par exemple, il vérifie que la broche n’est pas déjà connectée. Il délègue le reste du processus de connexion à la méthode CBasePin::AgreeMediaType . Tout ce qui suit est effectué par AgreeMediaType.

Si le type de média est entièrement spécifié, l’épingle appelle la méthode CBasePin::AttemptConnection pour tenter la connexion. Sinon, il tente les types de médias dans l’ordre suivant :

  1. Types préférés de la broche d’entrée.
  2. Types préférés de la broche de sortie.

Vous pouvez inverser cet ordre en définissant l’indicateur CBasePin::m_bTryMyTypesFirst sur TRUE.

Dans chaque cas, l’épingle appelle IPin::EnumMediaTypes pour énumérer les types de médias. Cette méthode récupère un objet énumérateur, qui est passé à la méthode CBasePin::TryMediaTypes . La méthode TryMediaTypes effectue une boucle dans chaque type de média et appelle AttemptConnection pour chaque type.

Dans la méthode AttemptConnection , la broche de sortie appelle les méthodes suivantes :

Notez les points suivants :

  • CheckConnect est une méthode virtuelle. Dans la classe de base, cette méthode vérifie si les directions de broche sont compatibles. Les broches de sortie doivent se connecter aux broches d’entrée, et inversement. La classe pin dérivée remplace généralement cette méthode pour effectuer d’autres vérifications. Par exemple, il peut interroger l’autre broche pour obtenir une interface requise pour la connexion. Si la classe dérivée remplace CheckConnect, elle doit également appeler la méthode CBasePin .
  • CheckMediaType est une méthode virtuelle pure, que la classe dérivée doit implémenter.
  • CompleteConnect est une méthode virtuelle qui ne fait rien dans la classe de base. Les classes dérivées peuvent remplacer cette méthode pour effectuer tout travail supplémentaire nécessaire pour terminer la connexion, comme le choix d’un allocateur de mémoire.

Si l’une de ces étapes échoue, la broche de sortie appelle la méthode CBasePin::BreakConnect pour annuler toutes les étapes effectuées par CheckConnect.

La méthode ReceiveConnection de la broche d’entrée appelle les méthodes CheckConnect, CheckMediaType et CompleteConnect de la broche d’entrée. Si l’un de ces problèmes échoue, la tentative de connexion échoue également.

Le diagramme suivant montre le processus de connexion dans CBasePin :

Processus de connexion cbasepin

CBasePin