Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
[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.]
De volgende pseudocode laat zien hoe u de methode IPin::BeginFlush implementeert:
HRESULT CMyInputPin::BeginFlush()
{
CAutoLock lock_it(m_pLock);
// First, make sure the Receive method will fail from now on.
HRESULT hr = CBaseInputPin::BeginFlush();
// Force downstream filters to release samples. If our Receive method
// is blocked in GetBuffer or Deliver, this will unblock it.
for (each output pin)
{
hr = pOutputPin->DeliverBeginFlush();
}
// Unblock our Receive method if it is waiting on an event.
SetEvent(m_hSomeEventThatReceiveNeedsToWaitOn);
// At this point, the Receive method can't be blocked. Make sure
// it finishes, by taking the streaming lock. (Not necessary if this
// is the last step.)
{
CAutoLock lock_2(&m_csReceive);
/* Now it's safe to do anything that would crash or hang
if Receive were executing. */
}
return hr;
}
Wanneer het doorspoelen begint, neemt de methode BeginFlush de filtervergrendeling over, waardoor de statuswijziging wordt geserialiseerd. Het is nog niet veilig om de streamingvergrendeling te nemen, omdat het leegmaken op de toepassingsthread plaatsvindt en de streaming-thread zich mogelijk in het midden van een gesprek ontvangen bevindt. De pincode moet garanderen dat Ontvangen niet wordt geblokkeerd en dat alle volgende aanroepen naar Ontvangen mislukken. Met de methode CBaseInputPin::BeginFlush wordt een interne vlag ingesteld, CBaseInputPin::m_bFlushing. Wanneer de vlag TRUEis, mislukt de methode Receive.
Door de BeginFlush--aanroep naar downstream te sturen, garandeert de pin dat alle downstreamfilters hun samples vrijgeven en terugkeren van Ontvangen--aanroepen. Dit garandeert op zijn beurt dat de invoerpinaansluiting niet wordt geblokkeerd in afwachting van GetBuffer- of Receive. Als de Receive methode van uw pin ooit op een gebeurtenis wacht (bijvoorbeeld om resources op te halen), zou de BeginFlush methode de wachttijd moeten beëindigen door de gebeurtenis in te stellen. Op dit moment wordt gegarandeerd dat de methode Receive terugkeert, en de vlag m_bFlushing voorkomt dat nieuwe Receive-aanroepen kunnen worden uitgevoerd.
Voor sommige filters is dat alles dat BeginFlush moet doen. De EndFlush-methode geeft aan dat het filter opnieuw voorbeelden kan ontvangen. Andere filters moeten mogelijk variabelen of middelen gebruiken in BeginFlush en die ook worden gebruikt in Receive. In dat geval moet het filter eerst de streamingvergrendeling bevatten. Zorg ervoor dat u dit niet doet vóór een van de vorige stappen, omdat u mogelijk een impasse veroorzaakt.
De methode EndFlush bevat de filtervergrendeling en voert de aanroep downstream door:
HRESULT CMyInputPin::EndFlush()
{
CAutoLock lock_it(m_pLock);
for (each output pin)
hr = pOutputPin->DeliverEndFlush();
return CBaseInputPin::EndFlush();
}
Met de methode CBaseInputPin::EndFlush wordt de vlag m_bFlushing opnieuw ingesteld op FALSE, waardoor de methode Receive opnieuw samples kan ontvangen. Dit moet de laatste stap zijn in EndFlush-, omdat de pin geen samples mag ontvangen totdat het flushen is voltooid en alle downstream filters worden gewaarschuwd.
Verwante onderwerpen