ピンの列挙

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

フィルターは、フィルターで使用できるピンを列挙する IBaseFilter::EnumPins メソッドをサポートしています。 IEnumPins インターフェイスへのポインターを返します。 IEnumPins::Next メソッドは IPin インターフェイス ポインターを取得します。

次の例は、特定のフィルターで特定の方向 (入力または出力) を持つピンを検索する関数を示しています。 PIN_DIRECTION列挙を使用してピンの方向を指定し、IPin::QueryDirection メソッドを使用して各列挙ピンの方向を検索します。 この関数は、一致するピンを検出すると、未処理の参照カウントを持つ IPin インターフェイス ポインターを返します。 呼び出し元は、インターフェイスの解放を担当します。

HRESULT GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
    IEnumPins  *pEnum = NULL;
    IPin       *pPin = NULL;
    HRESULT    hr;

    if (ppPin == NULL)
    {
        return E_POINTER;
    }

    hr = pFilter->EnumPins(&pEnum);
    if (FAILED(hr))
    {
        return hr;
    }
    while(pEnum->Next(1, &pPin, 0) == S_OK)
    {
        PIN_DIRECTION PinDirThis;
        hr = pPin->QueryDirection(&PinDirThis);
        if (FAILED(hr))
        {
            pPin->Release();
            pEnum->Release();
            return hr;
        }
        if (PinDir == PinDirThis)
        {
            // Found a match. Return the IPin pointer to the caller.
            *ppPin = pPin;
            pEnum->Release();
            return S_OK;
        }
        // Release the pin for the next time through the loop.
        pPin->Release();
    }
    // No more pins. We did not find a match.
    pEnum->Release();
    return E_FAIL;  
}

この関数は、指定した方向の n 番目のピン、または n 番目の未接続のピンを返すように簡単に変更できます。 (ピンが別のピンに接続されているかどうかを確認するには、 IPin::ConnectedTo メソッドを呼び出します)。

フィルター グラフ内のオブジェクトの列挙

フィルターで接続されていないピンを検索する

一般的なGraph-Building手法

Pin プロパティ セット