Een niet-verbonden pincode zoeken op een filter
[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
In dit onderwerp wordt beschreven hoe u een niet-verbonden pincode voor een filter kunt vinden. Het vinden van een niet-verbonden pincode is handig wanneer u filters verbindt.
In een typisch DirectShow-grafiekbouwscenario hebt u een niet-verbonden pin nodig die overeenkomt met een bepaalde speldrichting (invoer of uitvoer). Wanneer u bijvoorbeeld twee filters verbindt, koppelt u een uitvoerpin van het ene filter aan een invoerpincode van het andere filter. Beide pinnen moeten niet verbonden zijn voordat u ze verbindt.
Eerst hebben we een functie nodig waarmee wordt getest of een pin is verbonden met een andere pin. Met deze functie wordt de methode IPin::ConnectedTo aangeroepen om te testen of de pin is verbonden met een andere pincode.
// 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;
}
Notitie
In dit voorbeeld wordt de functie SafeRelease gebruikt om interfaceaanwijzers vrij te geven.
Vervolgens hebben we een functie nodig waarmee wordt getest of een speld overeenkomt met een opgegeven speldrichting. Met deze functie wordt de methode IPin::QueryDirection aangeroepen om de richting van de speld op te halen.
// 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;
}
De volgende functie komt overeen met een speld op basis van beide criteria (pinrichting en verbindingsstatus).
// 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;
}
Ten slotte gebruikt de volgende functie de IEnumPins interface om de spelden op het filter te doorlopen. De beller geeft de gewenste richting van de speld aan. Voor elke speld roept de functie MatchPin
aan om te testen of de pin een overeenkomst is. Als de richting overeenkomt en de speld niet is verbonden, retourneert de functie een aanwijzer naar de overeenkomende speld in de parameter 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;
}
Zie Connect Two Filtersvoor een voorbeeld van hoe deze functie kan worden gebruikt.
Verwante onderwerpen