Partager via


Énumération des broches

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Les filtres prennent en charge la méthode IBaseFilter::EnumPins , qui énumère les broches disponibles sur le filtre. Elle retourne un pointeur vers l’interface IEnumPins . La méthode IEnumPins::Next récupère les pointeurs d’interface IPin .

L’exemple suivant montre une fonction qui localise une broche avec une direction donnée (entrée ou sortie) sur un filtre donné. Il utilise l’énumération PIN_DIRECTION pour spécifier la direction de l’épingle et la méthode IPin::QueryDirection pour rechercher la direction de chaque broche énumérée. Si cette fonction trouve une broche correspondante, elle retourne un pointeur d’interface IPin avec un nombre de références en attente. L’appelant est responsable de la libération de l’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;  
}

Cette fonction peut facilement être modifiée pour retourner la nième broche avec la direction spécifiée, ou la nièmebroche non connectée. (Pour savoir si une broche est connectée à une autre broche, appelez la méthode IPin::ConnectedTo .)

Énumération d’objets dans un graphique de filtre

Rechercher une épingle non connectée sur un filtre

Techniques de Graph-Building générales

Jeu de propriétés Pin