CBasePin 接続処理
ここでは、CBasePin クラスでピン接続処理がどのように実装されるかを説明する。
フィルタ グラフ マネージャがすべてのピン接続を開始する。フィルタ グラフ マネージャは、入力ピンを指定して出力ピンの IPin::Connect メソッドを呼び出す。出力ピンは受信ピンの IPin::ReceiveConnection メソッドを呼び出すことで、接続を完了する。入力ピンは接続を受け入れることも拒否することもできる。
フィルタ グラフ マネージャは接続のメディア タイプを指定することもできる。接続のメディア タイプを指定した場合、ピンはそのタイプを使って接続を試みる。この指定がない場合、ピンはタイプをネゴシエートしなければならない。フィルタ グラフ マネージャは、メジャー タイプ、サブタイプ、またはフォーマット タイプとして GUID_NULL 値を持つパーシャル メディア タイプを指定することもできる。この場合、ピンはメディア タイプの指定された部分に合わせようとし、GUID_NULL 値はワイルドカードとして機能する。
CBasePin::Connect メソッドは、ピンが接続を受け入れることができるかどうかを検証することによって開始する。たとえば、ピンが既に接続されているかどうかをチェックする。接続処理の残りは CBasePin::AgreeMediaType メソッドに委任する。それ以降のすべては AgreeMediaType によって実行される。
メディア タイプが完全に指定された場合、ピンは CBasePin::AttemptConnection メソッドを呼び出して接続を試みる。それ以外の場合、ピンは次の順序で複数のメディア タイプを試す。
- 入力ピンが優先するタイプ。
- 出力ピンが優先するタイプ。
この順番は CBasePin::m_bTryMyTypesFirst フラグを TRUE に設定すれば逆にできる。
それぞれの場合に、ピンは IPin::EnumMediaTypes を呼び出してメディア タイプを列挙する。このメソッドは、列挙子オブジェクトを取得する。取得したオブジェクトは CBasePin::TryMediaTypes メソッドに渡される。TryMediaTypes メソッドは各メディア タイプを繰り返し処理し、各タイプに対して AttemptConnection を呼び出す。
AttemptConnection 内で、出力ピンは次のメソッドを呼び出す。
- 出力ピン自身の CBasePin::CheckConnect を呼び出し、入力ピンが適切かどうかをチェックする。
- 出力ピン自身の CBasePin::CheckMediaType を呼び出し、メディア タイプを確認する。
- 入力ピンの IPin::ReceiveConnection を呼び出す。入力ピンは、このメソッドを使って、接続を受け入れるかどうかを決定する。
- 出力ピン自身の CBasePin::CompleteConnect を呼び出し、接続を完了する。
以下に注意すること。
- CheckConnect は仮想メソッドである。基底クラスでは、このメソッドはピンの向きに互換性があるかどうかをチェックする。出力ピンは入力ピンにのみ接続しなければならない。同様に、入力ピンは出力ピンにのみ接続しなければならない。派生ピン クラスは通常このメソッドをオーバーライドして他のチェックを実行する。たとえば、接続に必要なインターフェイスを他のピンに問い合わせる。派生クラスが CheckConnect をオーバーライドする場合は、CBasePin メソッドを呼び出す必要がある。
- CheckMediaType は派生クラスが必ず実装しなければならない純粋仮想メソッドである。
- CompleteConnect は、基底クラスでは何も実行しない仮想メソッドである。派生クラスはこのメソッドをオーバーライドして、メモリ アロケータの決定のような、接続を完了させるために必要な追加処理を実行できる。
これらのステップが失敗すると、出力ピンは CBasePin::BreakConnect メソッドを呼び出して、CheckConnect によって行われたステップをすべて元に戻す。
入力ピンの ReceiveConnection メソッドは入力ピンの CheckConnect、CheckMediaType、および CompleteConnect メソッドを呼び出す。これらのメソッドのいずれかが失敗すると、接続の試みも失敗する。
次の図は、CBasePin の接続処理を示す。