フィルタの未接続ピンの検索
次の関数はフィルタで未接続の入力ピンまたは出力ピンを検索する。最初に条件に一致したピンを返す。フィルタを接続するとき、未接続ピンの検索は役立つ。
HRESULT GetUnconnectedPin(
IBaseFilter *pFilter, // フィルタへのポインタ。
PIN_DIRECTION PinDir, // 検索するピンの方向。
IPin **ppPin) // ピンへのポインタを受け取る。
{
*ppPin = 0;
IEnumPins *pEnum = 0;
IPin *pPin = 0;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}
while (pEnum->Next(1, &pPin, NULL) == S_OK)
{
PIN_DIRECTION ThisPinDir;
pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir == PinDir)
{
IPin *pTmp = 0;
hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr)) // 既に接続済み、必要なピンではない。
{
pTmp->Release();
}
else // 未接続、これが必要なピンである。
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();
// 一致するピンが見つからなかった。
return E_FAIL;
}
関数は IEnumPins インターフェイスを使い、フィルタのピンをループする。ピンの方向を判別するため、ピンごとにIPin::QueryDirection を呼び出す。方向が一致した場合、IPin::ConnectedTo メソッドを呼び出し、そのピンが別のピンに既に接続しているかどうかをテストする。
次のコードは、この関数を使い、フィルタで未接続の出力ピンを検索する。
IPin *pOut = NULL;
HRESULT hr = GetUnconnectedPin(pFilter, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
/* ... */
pOut->Release();
}
参照