ピン カテゴリの操作

フィルタで特定のピン カテゴリのピンを検索するには、ICaptureGraphBuilder2::FindPin メソッドを使える。次の例は、ビデオ プレビュー ピンを検索する。

int i = 0;
hr = pBuild->FindPin(
    pFilter,               // 検索するフィルタへのポインタ。
    PINDIR_OUTPUT,         // どちらのピン方向?
    &PIN_CATEGORY_PREVIEW, // どちらのカテゴリ? (NULL は "すべてのカテゴリ" を意味する)
    &MEDIATYPE_Video,      // どちらのメディア タイプ? (NULL は "すべてのタイプ" を意味する)
    FALSE,                 // 接続が必要か?
    i,                     // i 番目に一致するピンを取得する (0 = 最初に一致するピン)
    &pPin                  // ピンへのポインタを受け取る。
);

最初の引数はフィルタのIBaseFilter インターフェイスへのポインタである。次の 3 つの引数で、方向、ピン カテゴリ、およびメディア タイプを指定する。5 番目の引数の値 FALSE は、ピンが接続または未接続できることを示す。 (これらのパラメータの正確な定義については、メソッドのドキュメントを参照すること。)メソッドは、適合するピンを見つけると、pPin パラメータによって IPin インターフェイスへのポインタを返す。

FindPin メソッドは便利だが、必要に応じて独自のヘルパー関数を作成することもできる。ピンのカテゴリを確認するには、「ピン プロパティ セット」トピックで説明しているように、IKsPropertySet::Get メソッドを呼び出す。

次のコードは、ピンが指定されたカテゴリに一致するかどうかを確認するヘルパー関数を示している。

BOOL PinMatchesCategory(IPin *pPin, const GUID& Category)
{
    if (pPin == NULL) return E_POINTER;

    BOOL bFound = FALSE;
    IKsPropertySet *pKs;
    HRESULT hr = pPin->QueryInterface(IID_IKsPropertySet, (void **)&pKs);
    if (SUCCEEDED(hr))
    {
        GUID PinCategory;
        DWORD cbReturned;
        hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, 
            &PinCategory, sizeof(GUID), &cbReturned);
        if (SUCCEEDED(hr))
        {
            bFound = (PinCategory == Category);
        }
        pKs->Release();
    }
    return bFound;
}

次の例は、FindPin メソッドのように、カテゴリ別にピンを検索する関数を示している。

HRESULT FindPinByCategory(
    IBaseFilter *pF,      // 検索するフィルタへのポインタ。
    PIN_DIRECTION PinDir, // ピンの方向。
    const GUID& Category, // ピン カテゴリ。
    IPin **ppPin)         // ピンへのポインタを受け取る。
{
    if (!pF || !ppPin) return E_POINTER;

    *ppPin = 0;
    HRESULT hr;
    IEnumPins *pEnum = 0;
    if (SUCCEEDED(pF->EnumPins(&pEnum)))
    {
        IPin *pPin = 0;
        while (hr = pEnum->Next(1, &pPin, 0), hr == S_OK)
        {
            PIN_DIRECTION ThisPinDir;
            hr = pPin->QueryDirection(&ThisPinDir);
            if (FAILED(hr))
            {
                pPin->Release();
                pEnum->Release();
                return E_UNEXPECTED; // 予期しないことが発生した。
            }
            if ((ThisPinDir == PinDir) && 
                PinMatchesCategory(pPin, Category))
            {
                *ppPin = pPin;  // 呼び出し元はインターフェイスを解放する必要がある。
                pEnum->Release();
                return S_OK;
            }
            pPin->Release();
        }
        pEnum->Release();
    }
    // 一致するピンがない。
    return E_FAIL;
}

次のコードは、前の関数を使い、フィルタでビデオ ポート ピンを検索する。

IPin *pVP; 
hr = FindPinByCategory(pFilter, PINDIR_OUTPUT, 
    PIN_CATEGORY_VIDEOPORT, &pVP);
if (SUCCEEDED(hr))
{
    // pVP を使う ... 
    // 完了したら、解放する。
    pVP->Release();
}

プロパティ セットの詳細については、Microsoft® Windows® Driver Development Kit (DDK) のドキュメントを参照すること。

参照