カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

ピンを操作する

ピンを探す

フィルターの中から特定のピンを探す手順を紹介します。

IBaseFilterインターフェースからピンの列挙子IEnumPinsインターフェースを取得します。

    IBaseFilter     *pFilter;   // 探したいフィルター
    IEnumPins* pEnumPin = NULL;
    HRESULT result = pFilter->EnumPins(&pEnumPin);
    if (FAILED(result))     throw result;

フィルターのピンを列挙します。

    IPin* pPin = NULL;
    DWORD dwFetched;

    while ((result = pEnumPin->Next(1L, &pPin, &dwFetched)) == S_OK)
    {
        // ピンが列挙される
        SAFE_RELEASE(pPin);
    }

出力ピンを探す

列挙されたピンの方向を取得しPINDIR_OUTPUTと比較します。

    PIN_DIRECTION pinDirection;
    result = pPin->QueryDirection(&pinDirection);

    if ((result == S_OK)&&(pinDirection == PINDIR_OUTPUT))
    {
        // 出力ピン
    }

入力ピンを探す

列挙されたピンの方向を取得しPINDIR_INPUTと比較します。

    PIN_DIRECTION pinDirection;
    result = pPin->QueryDirection(&pinDirection);

    if ((result == S_OK)&&(pinDirection == PINDIR_INPUT))
    {
        // 入力ピン
    }

IDで探す

列挙されたピンのIDを取得し探したいIDと比較します。IDはユニコード文字列です。

    LPWSTR id;      // 探したいID
    LPWSTR idGet;
    result = pPin->QueryId(&idGet);

    if ((result == S_OK)&&(! wcscmp(idGet, id)))
    {
        // 見つかった
    }

最後にピンの列挙子をリリースします。

    SAFE_RELEASE(pEnumPin);

つながっているピンを取得する

つながっている相手のピンを取得する方法を以下に示します。

    IPin *pPin;     // 接続元のピン
    IPin* pConnectedPin = NULL;
    result = pPin->ConnectedTo(&pConnectedPin);

    if (result == S_OK)
    {
        // 接続先が見つかった(pConnectedPin)
    }

ピンの利用が終わったらリリースします。

    SAFE_RELEASE(pConnectedPin);
DirectShowでは、1つのピンを同時に複数のピンと接続することはできません。そのためConnectedTo()関数の結果は、相手が見つかったか見つからなかったかのどちらかです。2つ以上見つかることはありません。

ピンをつなぐ・ピンを切る

以下に入力ピンと出力ピンをつなぐ手順を示します。

IFilterGraph::ConnectDirect()関数を用いてピンを接続します。出力ピンを持つフィルター、入力ピンを持つフィルターはそれぞれフィルタグラフに挿入しておく必要があります。

    IPin    *pOutPin;   // 出力ピン
    IPin    *pInPin;    // 入力ピン

    result = m_pGB->ConnectDirect(pOutPin, pInPin, NULL);
    if (FAILED(result))     throw result;
IPinインターフェースにConnect()関数がありますが、これはIFilterGraphが用いる低レベルコマンドです。アプリケーションからは使わないでください。

以下にピンを切断する手順を示します。

IFilterGraph::Disconnect()関数を用いてピンを切断します。入力ピン側と出力ピン側の双方を切断する必要があります。

    IPin    *pOutPin;   // 出力ピン
    IPin    *pInPin;    // 入力ピン

    result = m_pGB->Disconnect(pOutPin);
    if (FAILED(result))     throw result;
    result = m_pGB->Disconnect(pInPin);
    if (FAILED(result))     throw result;

IPin::ConnectedTo()関数を用いて片側のピンを指定して切断する例を示します。

    IPin *pPin;         // 切断したいピン
    IPin *pConnectedPin = NULL;
    result = pPin->ConnectedTo(&pConnectedPin);

    if (result == S_OK)
    {
        result = m_pGB->Disconnect(pConnectedPin);
        if (FAILED(result))     throw result;
    }
    result = m_pGB->Disconnect(pPin);
    if (FAILED(result))     throw result;
IPinインターフェースにDisconnect()関数がありますが、これはIFilterGraphが用いる低レベルコマンドです。アプリケーションからは使わないでください。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ