Compartir a través de


Enumerar patillas

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Los filtros admiten el método IBaseFilter::EnumPins , que enumera los patillas disponibles en el filtro. Devuelve un puntero a la interfaz IEnumPins . El método IEnumPins::Next recupera punteros de interfaz IPin .

En el ejemplo siguiente se muestra una función que busca un pin con una dirección determinada (entrada o salida) en un filtro determinado. Usa la enumeración PIN_DIRECTION para especificar la dirección del pin y el método IPin::QueryDirection para buscar la dirección de cada patilla enumerada. Si esta función encuentra un pin coincidente, devuelve un puntero de interfaz IPin con un recuento de referencias pendiente. El autor de la llamada es responsable de liberar la interfaz.

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

Esta función se podría modificar fácilmente para devolver el nº pin con la dirección especificada o la patilla no conectada. (Para averiguar si un pin está conectado a otro pin, llame al método IPin::ConnectedTo ).

Enumerar objetos en un gráfico de filtros

Buscar un pin no conectado en un filtro

Técnicas generales de Graph-Building

Pin (conjunto de propiedades)