Microsoft DirectX 8.0

IStreamBuilder インターフェイス

このインターフェイスを使用すると、出力ピンからフィルタ グラフ マネージャに、フィルタ グラフのダウンストリーム部分をピン自体が構築することを通知できる。特殊な接続を必要とする出力ピンでは、このインターフェイスを実装して、フィルタ グラフ マネージャが使用するピン接続のデフォルト処理をオーバーライドできる。

vtable 順のメソッド

IUnknown メソッド説明
QueryInterface サポートされているインターフェイスへのポインタを取得する。
AddRef 参照カウントをインクリメントする。
Release 参照カウントをデクリメントする。
IStreamBuilder メソッド説明
Render このピンから始まるストリームのレンダリングを完了する。このとき必要に応じて、フィルタがフィルタ グラフに追加され、接続される。
Backout Render で行われたステップを元に戻す。Render 内で追加されたフィルタがあれば、その切断および削除も行われる。

IStreamBuilder::Backout

IStreamBuilder インターフェイス

Render で行われたステップを元に戻す。Render 内で追加されたフィルタがあれば、その切断および削除も行われる。

構文

HRESULT Backout(
   IPin *ppinOut
   IGraphBuilder *pGraph
)

パラメータ

ppinOut
[in] このピンの IPin インターフェイスへのポインタ。
pGraph
[in] フィルタ グラフ マネージャの IGraphBuilder インターフェイスへのポインタ。

戻り値

HRESULT 値を返す。グラフ ビルダにとって、リターン コード S_OK は切断が成功したことを示す。

注意

次のコードは、このメソッドを出力ピンに実装する方法を示す。

STDMETHODIMP CMyOutputPin::BackOut(IPin *pOutputPin, IGraphBuilder *pBuilder)
{
    HRESULT hr = S_OK;
    if (m_Connected != NULL) {
        FILTER_INFO fi;

        // 自分のピンに接続しているピンのフィルタ ポインタを検索する。
        hr = m_Connected->QueryFilterInfo(&fi);
        if (SUCCEEDED(hr)) {
            if (fi.pFilter != NULL) {
                // 切断する。
                pBuilder->Disconnect(m_Connected);
                pBuilder->Disconnect(pOutputPin);
                // 追加したフィルタをグラフから削除する。
                pBuilder->RemoveFilter(fi.pFilter);
                fi.pFilter->Release();
            } else {
                hr = E_UNEXPECTED;
            }
        }
    }
    return hr;
}

IStreamBuilder::Render

IStreamBuilder インターフェイス

このピンから始まるストリームのレンダリングを完了する。このとき必要に応じて、フィルタがフィルタ グラフに追加され、接続される。

構文

HRESULT Render(
    IPin *ppinOut
    IGraphBuilder *pGraph
);

パラメータ

ppinOut
[in] このピンの IPin インターフェイスへのポインタ。
pGraph
[in] フィルタ グラフ マネージャの IGraphBuilder インターフェイスへのポインタ。

戻り値

HRESULT 値を返す。リターン コード S_OK はストリームのレンダリングが成功したことを示す。

注意

次のコードは、このメソッドを出力ピンに実装する方法を示す。

STDMETHODIMP CMyOutputPin::Render(IPin *pOutputPin, IGraphBuilder *pBuilder)
{
    // このフィルタには自作の特殊なレンダラを接続する必要がある。
    IBaseFilter *pMyRenderer = NULL;
    IPin *pMyRendererInputPin = NULL;
    bool bAddedToGraph = false;

    // 独自のレンダラを作成する。
    HRESULT hr = CoCreateInstance(CLSID_MyRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pMyRenderer);
    if (SUCCEEDED(hr)) {
        // レンダラをフィルタ グラフに追加する。
        hr = pBuilder->AddFilter(pMyRenderer, L"My Renderer");
    }
    // レンダラの入力ピンを検索する。

    if (SUCCEEDED(hr)) {
            bAddedToGraph = true;
            IEnumPins *pEnumPins;
            hr = pMyRenderer->EnumPins(&pEnumPins);
            if (SUCCEEDED(hr)) {
                DWORD nPins;
                if (S_OK != pEnumPins->Next(1, &pMyRendererInputPin, &nPins)) {
                    hr = E_UNEXPECTED;
                }
            }
    }
    if (SUCCEEDED(hr)) {
        // レンダラを自分の出力ピンに接続する。
        hr = pBuilder->ConnectDirect(pOutputPin, pMyRendererInputPin);
    }
    if (FAILED(hr)) {
        if (bAddedToGraph) {
            pBuilder->RemoveFilter(pMyRenderer);
        }
        pMyRenderer->Release();
    }
    if (NULL != pMyRendererOutputPin) {
        pMyRendererInputPin->Release();
    }
    return hr;
}