Delen via


CBasePin-verbindingsproces

[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]

In deze sectie wordt beschreven hoe de klasse CBasePin het verbindingsproces voor vastmaken implementeert.

Filter Graph Manager initieert alle vastgemaakte verbindingen. Hiermee wordt de IPin::Connect methode van de uitvoerpin aangeroepen, waarbij de invoerpin wordt opgegeven. De uitvoerpin voltooit de verbinding door de IPin::ReceiveConnection-methode van de invoerpin aan te roepen. De invoerpin kan de verbinding accepteren of weigeren.

Filter Graph Manager kan ook een mediatype voor de verbinding opgeven. Zo ja, dan proberen de pinnen verbinding te maken met dat type. Zo niet, dan moeten de spelden onderhandelen over het type. Filter Graph Manager kan ook een gedeeltelijk mediatype opgeven, met de waarde GUID_NULL voor het primaire type, subtype of opmaaktype. In dat geval proberen de pinnen overeen te komen met de delen van het mediatype; de waarde GUID_NULL fungeert als jokerteken.

De methode CBasePin::Connect begint door te controleren of de pincode een verbinding kan accepteren. Er wordt bijvoorbeeld gecontroleerd of de pincode nog niet is verbonden. De rest van het verbindingsproces wordt gedelegeerd aan de methode CBasePin::AgreeMediaType. Alles dat volgt, wordt uitgevoerd door AgreeMediaType.

Als het mediatype volledig is opgegeven, roept de pincode de CBasePin::AttemptConnection methode aan om de verbinding te proberen. Anders worden mediatypen in de volgende volgorde geprobeerd:

  1. De voorkeurstypen van de invoerpin.
  2. De voorkeurstypen van de uitvoerpin.

U kunt deze volgorde omkeren door de vlag CBasePin::m_bTryMyTypesFirst in te stellen op TRUE-.

In elk geval roept de pincode IPin::EnumMediaTypes aan om de mediatypen op te sommen. Met deze methode wordt een enumerator-object opgehaald dat wordt doorgegeven aan de methode CBasePin::TryMediaTypes. De methode TryMediaTypes doorloopt elk mediatype en roept AttemptConnection voor elk type aan.

Binnen de methode AttemptConnection roept de uitvoerpin de volgende methoden aan:

Let op het volgende:

  • CheckConnect is een virtuele methode. In de basisklasse wordt met deze methode gecontroleerd of de speldrichtingen compatibel zijn. Uitvoerpinnen moeten verbinding maken met invoerpinnen en omgekeerd. De afgeleide pinklasse overschrijft deze methode doorgaans om andere controles uit te voeren. Het kan bijvoorbeeld een query uitvoeren op de andere pincode voor een interface die vereist is voor de verbinding. Als de afgeleide klasse CheckConnect-overschrijft, moet deze ook de methode CBasePin aanroepen.
  • CheckMediaType is een pure virtuele methode die door de afgeleide klasse moet worden geïmplementeerd.
  • CompleteConnect- is een virtuele methode die niets in de basisklasse doet. Afgeleide klassen kunnen deze methode overschrijven om extra werk uit te voeren die nodig zijn om de verbinding te voltooien, zoals het bepalen van een geheugentoewijzing.

Als een van deze stappen mislukt, roept de uitvoerpin de methode CBasePin::BreakConnect aan om de stappen die zijn uitgevoerd door CheckConnect-ongedaan te maken.

De ReceiveConnection-methode van de invoerpincode roept de CheckConnect-, CheckMediaType-en CompleteConnect-methoden aan. Als een van deze mislukt, mislukt de verbindingspoging ook.

In het volgende diagram ziet u het verbindingsproces in CBasePin-:

cbasepin-verbindingsproces

CBasePin-