Поделиться через


Перечисление закрепления

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Фильтры поддерживают метод IBaseFilter::EnumPins , который перечисляет контакты, доступные в фильтре. Он возвращает указатель на интерфейс IEnumPins . Метод IEnumPins::Next извлекает указатели интерфейса IPin .

В следующем примере показана функция, которая находит контакт с заданным направлением (входными или выходными данными) в заданном фильтре. Он использует перечисление PIN_DIRECTION для указания направления закрепления, а метод IPin::QueryDirection — для поиска направления каждого перечисленного контакта. Если эта функция находит соответствующий контакт, она возвращает указатель интерфейса IPin с незавершенным числом ссылок. Вызывающий объект отвечает за освобождение интерфейса.

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

Эту функцию можно легко изменить для возврата n-го контакта с указанным направлением или n-гонесоединенного контакта. (Чтобы узнать, подключен ли контакт к другому контакту, вызовите метод IPin::ConnectedTo .)

Перечисление объектов в графе фильтра

Поиск несоединенного контакта в фильтре

Общие методы Graph-Building

Закрепление набора свойств