Processo di connessione CBasePin

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Questa sezione descrive come la classe CBasePin implementa il processo di connessione pin.

Filter Graph Manager avvia tutte le connessioni pin. Chiama il metodo IPin::Connect del pin di output, specificando il pin di input. Il pin di output completa la connessione chiamando il metodo IPin::ReceiveConnection del pin di input. Il pin di input può accettare o rifiutare la connessione.

Filter Graph Manager può anche specificare un tipo di supporto per la connessione. In tal caso, i pin tentano di connettersi a tale tipo. In caso contrario, i pin devono negoziare il tipo. Filter Graph Manager può anche specificare un tipo di supporto parziale , che ha il valore GUID_NULL per il tipo principale, il sottotipo o il tipo di formato. In tal caso, i pin tentano di corrispondere a qualsiasi parte del tipo di supporto specificato; il valore GUID_NULL funge da carattere jolly.

Il metodo CBasePin::Connect inizia verificando che il pin possa accettare una connessione. Ad esempio, verifica che il pin non sia già connesso. Delega il resto del processo di connessione al metodo CBasePin::AgreeMediaType . Tutto ciò che segue viene eseguito da AgreeMediaType.

Se il tipo di supporto è completamente specificato, il pin chiama il metodo CBasePin::AttemptConnection per tentare la connessione. In caso contrario, prova i tipi di supporti nell'ordine seguente:

  1. Tipi preferiti del pin di input.
  2. Tipi preferiti del pin di output.

È possibile invertire questo ordine impostando il flag CBasePin::m_bTryMyTypesFirst su TRUE.

In ogni caso, il pin chiama IPin::EnumMediaTypes per enumerare i tipi di supporti. Questo metodo recupera un oggetto enumeratore, che viene passato al metodo CBasePin::TryMediaTypes . Il metodo TryMediaTypes esegue un ciclo in ogni tipo di supporto e chiama AttemptConnection per ogni tipo.

All'interno del metodo AttemptConnection , il pin di output chiama i metodi seguenti:

Tenere presente quanto segue:

  • CheckConnect è un metodo virtuale. Nella classe base questo metodo controlla se le direzioni dei pin sono compatibili. I pin di output devono connettersi ai pin di input e viceversa. La classe pin derivata esegue in genere l'override di questo metodo per eseguire altri controlli. Ad esempio, potrebbe eseguire una query sull'altro pin per un'interfaccia necessaria per la connessione. Se la classe derivata esegue l'override di CheckConnect, deve chiamare anche il metodo CBasePin .
  • CheckMediaType è un metodo virtuale puro, che la classe derivata deve implementare.
  • CompleteConnect è un metodo virtuale che non esegue alcuna operazione nella classe di base. Le classi derivate possono eseguire l'override di questo metodo per eseguire qualsiasi lavoro aggiuntivo necessario per completare la connessione, ad esempio decidere un allocatore di memoria.

Se uno di questi passaggi ha esito negativo, il pin di output chiama il metodo CBasePin::BreakConnect per annullare i passaggi eseguiti da CheckConnect.

Il metodo ReceiveConnection del pin di input chiama i metodi CheckConnect, CheckMediaType e CompleteConnect del pin di input. Se uno di questi errori ha esito negativo, anche il tentativo di connessione ha esito negativo.

Il diagramma seguente illustra il processo di connessione in CBasePin:

Processo di connessione cbasepin

CBasePin