Find an Unconnected Pin on a Filter

 
Microsoft DirectShow 9.0

Find an Unconnected Pin on a Filter

The following function searches on a filter for an unconnected pin, either input or output. It returns the first matching pin. Finding unconnected pins is useful when you are connecting filters.

HRESULT GetUnconnectedPin(
    IBaseFilter *pFilter,   // Pointer to the filter.
    PIN_DIRECTION PinDir,   // Direction of the pin to find.
    IPin **ppPin)           // Receives a pointer to the pin.
{
    *ppPin = 0;
    IEnumPins *pEnum = 0;
    IPin *pPin = 0;
    HRESULT hr = pFilter->EnumPins(&pEnum);
    if (FAILED(hr))
    {
        return hr;
    }
    while (pEnum->Next(1, &pPin, NULL) == S_OK)
    {
        PIN_DIRECTION ThisPinDir;
        pPin->QueryDirection(&ThisPinDir);
        if (ThisPinDir == PinDir)
        {
            IPin *pTmp = 0;
            hr = pPin->ConnectedTo(&pTmp);
            if (SUCCEEDED(hr))  // Already connected, not the pin we want.
            {
                pTmp->Release();
            }
            else  // Unconnected, this is the pin we want.
            {
                pEnum->Release();
                *ppPin = pPin;
                return S_OK;
            }
        }
        pPin->Release();
    }
    pEnum->Release();
    // Did not find a matching pin.
    return E_FAIL;
}

The function uses the IEnumPins interface to loop through the pins on the filter. For each pin, it calls IPin::QueryDirection to determine the direction of the pin. If the direction matches, it calls the IPin::ConnectedTo method to test whether the pin is already connected to another pin.

The following code example uses this function to find an unconnected output pin on a filter:

IPin *pOut = NULL;
HRESULT hr = GetUnconnectedPin(pFilter, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
    /* ... */
    pOut->Release();
}

See Also