IGraphConfig::Reconnect
Reconnect メソッドは、2 つのピンの間の動的な再接続を実行する。
構文
HRESULT Reconnect(
IPin *pOutputPin,
IPin *pInputPin,
const AM_MEDIA_TYPE *pmtFirstConnection,
IBaseFilter *pUsingFilter,
HANDLE hAbortEvent,
DWORD dwFlags
);
パラメータ
pOutputPin
[in] 出力ピンへのポインタ。NULL も可。その場合、pInputPin は NULL であってはならない。
pInputPin
[in] 入力ピンへのポインタ。NULL も可。その場合、pOutputPin は NULL であってはならない。
pmtFirstConnection
[in] 再接続の最初のピン接続に使うメディア タイプを指定する AM_MEDIA_TYPE 構造体へのポインタ。この引数が NULL の場合、最初の接続のメディア タイプは限定されない。
pUsingFilter
[in] 再接続に使うフィルタへのポインタ (省略可能)。フィルタは既にグラフに含まれていなければならない。NULL も可。
hAbortEvent
[in] イベントのハンドル。フィルタのデータ処理スレッドのいずれかからこのメソッドを呼び出す場合は、この引数に、そのフィルタが停止状態に切り替わったときに通知済みになるイベントのハンドルを指定しなければならない。それ以外の場合、この引数は NULL でかまわない。詳細については、「注意」を参照すること。
dwFlags
[in] 再接続の実行方法を指定する AM_GRAPH_CONFIG_RECONNECT_FLAGS 列挙のフラグの組み合わせ。
戻り値
成功した場合は S_OK を返す。それ以外の場合は、次のいずれかのエラー コードか、または一覧に示されていないその他の値を返す。
E_INVALIDARG | 無効な引数。たとえば、pInputPin と pOutputPin の両方に NULL が指定された場合など。 |
E_NOINTERFACE | 入力ピンで IPinConnection がサポートされていない。 |
VFW_E_CANNOT_CONNECT | フィルタを接続できない。 |
VFW_E_STATE_CHANGED | フィルタの状態が変化した。操作を完了できない。 |
注意
出力ピンを 1 つだけ指定すると、メソッドはもう一方のピンを検索する。ただしデフォルトでは、IFilterGraph::AddFilter メソッドでグラフに追加したフィルタが見つかると検索が失敗する。この動作をオーバーライドするには、IGraphConfig::SetFilterFlags を呼び出してフィルタの AM_FILTER_FLAGS_REMOVABLE フラグを設定する。
再接続処理は以下のステップで実行され、その大半はこのメソッド内で処理される。
- まず、メソッドを呼び出す前に、再構成しようとしているパスに沿ったデータ フローの動作を確実に停止する。呼び出し元がアプリケーションの場合、これには IPinFlowControl::Block メソッドを呼び出さなければならない。アプリケーションではなくフィルタから呼び出す場合、データ フローをフィルタ側で内部的に制御できる可能性がある。
- 指定する出力ピンと入力ピンによって、再接続の始点と終点が定義される。入力ピンは IPinConnection インターフェイスをサポートしなければならない。これらのピンのいずれかを指定しない (NULL 引数を渡す) と、メソッドは、フィルタ グラフから再接続の候補となるピンを検索する (入力ピンは出力ピンからダウンストリームへ、出力ピンは入力ピンからアップストリームへ検索する)。
- メソッドが、フィルタ グラフを通じてペンディング状態のデータを引き渡す (内部的に IGraphConfig::PushThroughData を呼び出す)。
- グラフに挿入するフィルタを指定した場合、そのフィルタの入力ピンに最初の出力ピンが接続され、そのフィルタの出力ピンが最後の入力ピンに接続される。フィルタを指定しなかった場合には、出力ピンが入力ピンに直接接続される。いずれの場合も、接続の確立に必要な変換フィルタがあれば挿入される。ただし、適切なフラグを設定すると、この動作をオーバーライドできる (詳細については、「dwFlags」引数の説明を参照すること)。
- 最後に、新しいフィルタが実行状態に切り替えられる。データ フローを再開することは、呼び出し元の責任である。呼び出し元がアプリケーションの場合、これには、フラグを設定せずに IPinFlowControl::Block を呼び出せばよい。
フィルタのデータ処理スレッドのいずれかからこのメソッドを呼び出すと、デッドロックに陥る危険性がある。このメソッドがフィルタ グラフをロックするため、IMediaFilter::Stop の呼び出しを受け取ったとき、フィルタが停止できない可能性がある。この状況を避けるため、このメソッドはフィルタが提供するイベント オブジェクトのハンドルを利用する。フィルタは、その Stop メソッドの呼び出しを受け取ったら、イベントを通知しなければならない。
参照