2 つのフィルタの接続

次の関数は、特定のフィルタの出力ピンを別のフィルタで最初に利用できる入力ピンに接続する。

HRESULT ConnectFilters(
    IGraphBuilder *pGraph, // フィルタ グラフ マネージャ。
    IPin *pOut,            // アップストリーム フィルタの出力ピン。
    IBaseFilter *pDest)    // ダウンストリーム フィルタ。
{
    if ((pGraph == NULL) || (pOut == NULL) || (pDest == NULL))
    {
        return E_POINTER;
    }
#ifdef debug
        PIN_DIRECTION PinDir;
        pOut->QueryDirection(&PinDir);
        _ASSERTE(PinDir == PINDIR_OUTPUT);
#endif

    // ダウンストリーム フィルタの入力ピンを検索する。
    IPin *pIn = 0;
    HRESULT hr = GetUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
    if (FAILED(hr))
    {
        return hr;
    }
    // 接続を試す。
    hr = pGraph->Connect(pOut, pIn);
    pIn->Release();
    return hr;
}

ダウンストリーム フィルタで利用可能な入力ピンを取得するため、この関数では GetUnconnectedPin 関数を呼び出す (GetUnconnectedPin 関数については、「フィルタの未接続ピンの検索」を参照)。ダウンストリーム フィルタに未接続の入力ピンがある場合、関数は IGraphBuilder::Connect を呼び出して 2 つのピンを接続する。ピンどうしを直接接続できない場合、接続を完成させるため、Connect メソッドは 2 つのピンの間にフィルタを加えることがある。

次の例は、同じ関数をオーバーロードしたバージョンである。2 番目のパラメータはピンではなく、フィルタへのポインタになっている。関数は最初のフィルタを 2 番目のフィルタに接続する。

HRESULT ConnectFilters(
    IGraphBuilder *pGraph, 
    IBaseFilter *pSrc, 
    IBaseFilter *pDest)
{
    if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL))
    {
        return E_POINTER;
    }

    // 最初のフィルタの出力ピンを検索する。
    IPin *pOut = 0;
    HRESULT hr = GetUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
    if (FAILED(hr)) 
    {
        return hr;
    }
    hr = ConnectFilters(pGraph, pOut, pDest);
    pOut->Release();
    return hr;
}

次の例は、この関数を使って AVI Mux フィルタをファイル ライタ フィルタに接続する。また、この例では AddFilterByCLSID 関数も使う (AddFilterByCLSID 関数については、「CLSID によるフィルタの追加」を参照)。

IBaseFilter *pMux, *pWrite;
hr = AddFilterByCLSID(pGraph, CLSID_AviDest, L"AVI Mux", &pMux);
if (SUCCEEDED(hr))
{
    hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWrite);
    if (SUCCEEDED(hr))
    {
        hr = ConnectFilters(pGraph, pMux, pWrite);
        /* IFileSinkFilter を使ってファイル名を設定する (省略)。 */
       pWrite->Release();
    }
    pMux->Release();
}

参照