static HRESULT WINAPI DSoundRender_InputPin_EndOfStream(IPin * iface) { BaseInputPin* This = (BaseInputPin*)iface; DSoundRenderImpl *me = (DSoundRenderImpl*)This->pin.pinInfo.pFilter; IMediaEventSink* pEventSink; HRESULT hr; EnterCriticalSection(This->pin.pCritSec); TRACE("(%p/%p)->()\n", This, iface); hr = BaseInputPinImpl_EndOfStream(iface); if (hr != S_OK) { ERR("%08x\n", hr); LeaveCriticalSection(This->pin.pCritSec); return hr; } hr = IFilterGraph_QueryInterface(me->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); if (SUCCEEDED(hr)) { BYTE * silence; silence = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, me->buf_size); if (silence) { memset(silence, 0, me->buf_size); DSoundRender_SendSampleData((DSoundRenderImpl*)This->pin.pinInfo.pFilter, silence, me->buf_size); HeapFree(GetProcessHeap(), 0, silence); } hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0); IMediaEventSink_Release(pEventSink); } MediaSeekingPassThru_EOS(me->seekthru_unk); LeaveCriticalSection(This->pin.pCritSec); return hr; }
static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface) { HRESULT hr = S_OK; BaseInputPin* This = impl_BaseInputPin_from_IPin(iface); BaseRenderer *pFilter = impl_from_IBaseFilter(This->pin.pinInfo.pFilter); TRACE("(%p/%p)->()\n", This, pFilter); EnterCriticalSection(&pFilter->filter.csFilter); EnterCriticalSection(&pFilter->csRenderLock); hr = BaseInputPinImpl_EndOfStream(iface); EnterCriticalSection(This->pin.pCritSec); if (SUCCEEDED(hr)) { if (pFilter->pFuncsTable->pfnEndOfStream) hr = pFilter->pFuncsTable->pfnEndOfStream(pFilter); else hr = BaseRendererImpl_EndOfStream(pFilter); } LeaveCriticalSection(This->pin.pCritSec); LeaveCriticalSection(&pFilter->csRenderLock); LeaveCriticalSection(&pFilter->filter.csFilter); return hr; }