共用方式為


在篩選上尋找未連線的釘選

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

本主題描述如何在篩選上尋找未連接的針腳。 當您連接篩選準則時,尋找未連線的針腳很有用。

在典型的 DirectShow 圖形建置案例中,您需要符合特定針腳方向的未連接針腳, (輸入或輸出) 。 例如,當您連接兩個篩選時,會將輸出針腳從一個篩選連接到另一個篩選的輸入針腳。 兩個針腳都必須未連線,才能連接它們。

首先,我們需要一個函式,以測試針腳是否連接到另一個針腳。 此函式會呼叫 IPin::ConnectedTo 方法,以測試針腳是否已連接到另一個針腳。

// Query whether a pin is connected to another pin.
//
// Note: This function does not return a pointer to the connected pin.

HRESULT IsPinConnected(IPin *pPin, BOOL *pResult)
{
    IPin *pTmp = NULL;
    HRESULT hr = pPin->ConnectedTo(&pTmp);
    if (SUCCEEDED(hr))
    {
        *pResult = TRUE;
    }
    else if (hr == VFW_E_NOT_CONNECTED)
    {
        // The pin is not connected. This is not an error for our purposes.
        *pResult = FALSE;
        hr = S_OK;
    }

    SafeRelease(&pTmp);
    return hr;
}

注意

此範例會使用 SafeRelease 函式來釋放介面指標。

 

接下來,我們需要一個函式,以測試針腳是否符合指定的針腳方向。 此函式會呼叫 IPin::QueryDirection 方法來取得針腳方向。

// Query whether a pin has a specified direction (input / output)
HRESULT IsPinDirection(IPin *pPin, PIN_DIRECTION dir, BOOL *pResult)
{
    PIN_DIRECTION pinDir;
    HRESULT hr = pPin->QueryDirection(&pinDir);
    if (SUCCEEDED(hr))
    {
        *pResult = (pinDir == dir);
    }
    return hr;
}

下一個函式會依照 (針腳方向和線上狀態) 準則比對針腳。

// Match a pin by pin direction and connection state.
HRESULT MatchPin(IPin *pPin, PIN_DIRECTION direction, BOOL bShouldBeConnected, BOOL *pResult)
{
    assert(pResult != NULL);

    BOOL bMatch = FALSE;
    BOOL bIsConnected = FALSE;

    HRESULT hr = IsPinConnected(pPin, &bIsConnected);
    if (SUCCEEDED(hr))
    {
        if (bIsConnected == bShouldBeConnected)
        {
            hr = IsPinDirection(pPin, direction, &bMatch);
        }
    }

    if (SUCCEEDED(hr))
    {
        *pResult = bMatch;
    }
    return hr;
}

最後,下列函式會使用 IEnumPins 介面來迴圈查看篩選上的針腳。 呼叫端會指定所需的針腳方向。 針對每個針腳,函式會呼叫 MatchPin 來測試針腳是否相符。 如果方向符合且針腳未連線,函式會傳回 ppPin 參數中相符針腳的指標。

// Return the first unconnected input pin or output pin.
HRESULT FindUnconnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
    IEnumPins *pEnum = NULL;
    IPin *pPin = NULL;
    BOOL bFound = FALSE;

    HRESULT hr = pFilter->EnumPins(&pEnum);
    if (FAILED(hr))
    {
        goto done;
    }

    while (S_OK == pEnum->Next(1, &pPin, NULL))
    {
        hr = MatchPin(pPin, PinDir, FALSE, &bFound);
        if (FAILED(hr))
        {
            goto done;
        }
        if (bFound)
        {
            *ppPin = pPin;
            (*ppPin)->AddRef();
            break;
        }
        SafeRelease(&pPin);
    }

    if (!bFound)
    {
        hr = VFW_E_NOT_FOUND;
    }

done:
    SafeRelease(&pPin);
    SafeRelease(&pEnum);
    return hr;
}

如需如何使用此函式的範例,請參閱 連接兩個篩選

列舉針腳

一般Graph-Building技術

ICaptureGraphBuilder2::FindPin