HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart) { HRESULT hr = S_OK; BaseRenderer *This = impl_from_IBaseFilter(iface); TRACE("(%p)->(%s)\n", This, wine_dbgstr_longlong(tStart)); EnterCriticalSection(&This->csRenderLock); This->filter.rtStreamStart = tStart; if (This->filter.state == State_Running) goto out; SetEvent(This->evComplete); ResetEvent(This->ThreadSignal); if (This->pInputPin->pin.pConnectedTo) { This->pInputPin->end_of_stream = 0; } else if (This->filter.filterInfo.pGraph) { IMediaEventSink *pEventSink; hr = IFilterGraph_QueryInterface(This->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); if (SUCCEEDED(hr)) { hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)This); IMediaEventSink_Release(pEventSink); } hr = S_OK; } if (SUCCEEDED(hr)) { QualityControlRender_Start(This->qcimpl, This->filter.rtStreamStart); if (This->pFuncsTable->pfnOnStartStreaming) This->pFuncsTable->pfnOnStartStreaming(This); if (This->filter.state == State_Stopped) BaseRendererImpl_ClearPendingSample(This); SetEvent(This->RenderEvent); This->filter.state = State_Running; } out: LeaveCriticalSection(&This->csRenderLock); return hr; }
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; }
HRESULT WINAPI BaseRendererImpl_EndOfStream(BaseRenderer* iface) { IMediaEventSink* pEventSink; IFilterGraph *graph; HRESULT hr = S_OK; TRACE("(%p)\n", iface); graph = iface->filter.filterInfo.pGraph; if (graph) { hr = IFilterGraph_QueryInterface(iface->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); if (SUCCEEDED(hr)) { hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)iface); IMediaEventSink_Release(pEventSink); } } RendererPosPassThru_EOS(iface->pPosition); SetEvent(iface->evComplete); return hr; }
static HRESULT WINAPI NullRenderer_InputPin_EndOfStream(IPin * iface) { InputPin* This = (InputPin*)iface; IMediaEventSink* pEventSink; IFilterGraph *graph; HRESULT hr = S_OK; TRACE("(%p/%p)->()\n", This, iface); InputPin_EndOfStream(iface); graph = ((NullRendererImpl*)This->pin.pinInfo.pFilter)->filterInfo.pGraph; if (graph) { hr = IFilterGraph_QueryInterface(((NullRendererImpl*)This->pin.pinInfo.pFilter)->filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink); if (SUCCEEDED(hr)) { hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0); IMediaEventSink_Release(pEventSink); } } return hr; }