Znajdowanie niełączonego numeru PIN w filtrze
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
W tym temacie opisano sposób znajdowania niepodłączonego numeru PIN w filtrze. Znalezienie nieupołączonego numeru PIN jest przydatne podczas nawiązywania połączenia z filtrami.
W typowym scenariuszu tworzenia wykresów DirectShow potrzebny jest niezwiązany numer PIN zgodny z określonym kierunkiem pinezki (wejściem lub wyjściem). Na przykład po połączeniu dwóch filtrów połączysz wyprowadzenie wyjściowe z jednego filtru z jednym filtrem do numeru PIN wejściowego z drugiego filtru. Oba wyprowadzenia muszą być odłączone przed ich połączeniem.
Najpierw potrzebujemy funkcji, która sprawdza, czy numer PIN jest podłączony do innego numeru PIN. Ta funkcja wywołuje metodę IPin::ConnectedTo, aby sprawdzić, czy numer PIN jest podłączony do innego numeru PIN.
// Query whether a pin is connected to another pin.
//
// Note: This function does not return a pointer to the connected pin.
HRESULT IsPinConnected(IPin *pPin, BOOL *pResult)
{
IPin *pTmp = NULL;
HRESULT hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr))
{
*pResult = TRUE;
}
else if (hr == VFW_E_NOT_CONNECTED)
{
// The pin is not connected. This is not an error for our purposes.
*pResult = FALSE;
hr = S_OK;
}
SafeRelease(&pTmp);
return hr;
}
Następnie potrzebujemy funkcji, która sprawdza, czy pinezka pasuje do określonego kierunku pinezki. Ta funkcja wywołuje metodę IPin::QueryDirection, aby uzyskać kierunek pinezki.
// Query whether a pin has a specified direction (input / output)
HRESULT IsPinDirection(IPin *pPin, PIN_DIRECTION dir, BOOL *pResult)
{
PIN_DIRECTION pinDir;
HRESULT hr = pPin->QueryDirection(&pinDir);
if (SUCCEEDED(hr))
{
*pResult = (pinDir == dir);
}
return hr;
}
Następna funkcja jest zgodna z numerem PIN według obu kryteriów (kierunek pinezki i stan połączenia).
// Match a pin by pin direction and connection state.
HRESULT MatchPin(IPin *pPin, PIN_DIRECTION direction, BOOL bShouldBeConnected, BOOL *pResult)
{
assert(pResult != NULL);
BOOL bMatch = FALSE;
BOOL bIsConnected = FALSE;
HRESULT hr = IsPinConnected(pPin, &bIsConnected);
if (SUCCEEDED(hr))
{
if (bIsConnected == bShouldBeConnected)
{
hr = IsPinDirection(pPin, direction, &bMatch);
}
}
if (SUCCEEDED(hr))
{
*pResult = bMatch;
}
return hr;
}
Na koniec poniższa funkcja używa interfejsu IEnumPins do pętli przez pinezki w filtrze. Obiekt wywołujący określa żądany kierunek pinezki. Dla każdego pinezki funkcja wywołuje MatchPin
, aby sprawdzić, czy numer PIN jest zgodny. Jeśli kierunek jest zgodny z numerem PIN i nie jest połączony, funkcja zwraca wskaźnik do pasującego pinezki w parametrze ppPin.
// Return the first unconnected input pin or output pin.
HRESULT FindUnconnectedPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
IEnumPins *pEnum = NULL;
IPin *pPin = NULL;
BOOL bFound = FALSE;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
goto done;
}
while (S_OK == pEnum->Next(1, &pPin, NULL))
{
hr = MatchPin(pPin, PinDir, FALSE, &bFound);
if (FAILED(hr))
{
goto done;
}
if (bFound)
{
*ppPin = pPin;
(*ppPin)->AddRef();
break;
}
SafeRelease(&pPin);
}
if (!bFound)
{
hr = VFW_E_NOT_FOUND;
}
done:
SafeRelease(&pPin);
SafeRelease(&pEnum);
return hr;
}
Aby zapoznać się z przykładem użycia tej funkcji, zobacz Connect Two Filters.
Tematy pokrewne