Enumerando pinos

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Os filtros dão suporte ao método IBaseFilter::EnumPins , que enumera os pinos disponíveis no filtro. Ele retorna um ponteiro para a interface IEnumPins . O método IEnumPins::Next recupera ponteiros de interface IPin .

O exemplo a seguir mostra uma função que localiza um pino com uma determinada direção (entrada ou saída) em um determinado filtro. Ele usa a enumeração PIN_DIRECTION para especificar a direção do pino e o método IPin::QueryDirection para localizar a direção de cada pino enumerado. Se essa função encontrar um pino correspondente, ela retornará um ponteiro de interface IPin com uma contagem de referência pendente. O chamador é responsável por liberar a interface.

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;  
}

Essa função pode ser facilmente modificada para retornar o nº pino com a direção especificada ou o pino não conectado. (Para descobrir se um pino está conectado a outro pino, chame o método IPin::ConnectedTo .)

Enumerando objetos em um grafo de filtro

Localizar um pino não conectado em um filtro

Técnicas gerais de Graph-Building

Fixar Conjunto de Propriedades