static HRESULT WINAPI VideoRenderer_EndFlush(BaseRenderer* iface) { VideoRendererImpl *This = impl_from_BaseRenderer(iface); TRACE("(%p)->()\n", iface); if (This->renderer.pMediaSample) { ResetEvent(This->hEvent); LeaveCriticalSection(iface->pInputPin->pin.pCritSec); LeaveCriticalSection(&iface->csRenderLock); LeaveCriticalSection(&iface->filter.csFilter); WaitForSingleObject(This->hEvent, INFINITE); EnterCriticalSection(&iface->filter.csFilter); EnterCriticalSection(&iface->csRenderLock); EnterCriticalSection(iface->pInputPin->pin.pCritSec); } if (This->renderer.filter.state == State_Paused) { ResetEvent(This->hEvent); } return BaseRendererImpl_EndFlush(iface); }
static HRESULT WINAPI DSoundRender_EndFlush(BaseRenderer* iface) { DSoundRenderImpl *This = impl_from_BaseRenderer(iface); TRACE("\n"); BaseRendererImpl_EndFlush(iface); if (This->renderer.filter.state != State_Stopped) ResetEvent(This->blocked); if (This->dsbuffer) { LPBYTE buffer; DWORD size; /* Force a reset */ IDirectSoundBuffer_Lock(This->dsbuffer, 0, 0, (LPVOID *)&buffer, &size, NULL, NULL, DSBLOCK_ENTIREBUFFER); memset(buffer, 0, size); IDirectSoundBuffer_Unlock(This->dsbuffer, buffer, size, NULL, 0); This->writepos = This->buf_size; } return S_OK; }
static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin * iface) { BaseInputPin* This = impl_BaseInputPin_from_IPin(iface); BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter); HRESULT hr = S_OK; TRACE("(%p/%p)->()\n", This, pFilter); EnterCriticalSection(&pFilter->filter.csFilter); EnterCriticalSection(&pFilter->csRenderLock); EnterCriticalSection(This->pin.pCritSec); hr = BaseInputPinImpl_EndFlush(iface); if (SUCCEEDED(hr)) { if (pFilter->pFuncsTable->pfnEndFlush) hr = pFilter->pFuncsTable->pfnEndFlush(pFilter); else hr = BaseRendererImpl_EndFlush(pFilter); } LeaveCriticalSection(This->pin.pCritSec); LeaveCriticalSection(&pFilter->csRenderLock); LeaveCriticalSection(&pFilter->filter.csFilter); return hr; }