Maarten Lankhorst : quartz: Fix EC_COMPLETE handling on dsound renderer.
Alexandre Julliard
julliard at winehq.org
Fri Nov 5 13:47:16 CDT 2010
Module: wine
Branch: master
Commit: 89223ff78bc8bbf9430ecef0cd7e671d43c5630e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=89223ff78bc8bbf9430ecef0cd7e671d43c5630e
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Thu Nov 4 17:02:21 2010 +0100
quartz: Fix EC_COMPLETE handling on dsound renderer.
---
dlls/quartz/dsoundrender.c | 38 +++++++++++++++++++++++++-------------
1 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index a51da6c..5e8d7b7 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -620,6 +620,7 @@ static HRESULT WINAPI DSoundRender_Run(IBaseFilter * iface, REFERENCE_TIME tStar
TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(tStart));
EnterCriticalSection(&This->filter.csFilter);
+ if (This->pInputPin->pin.pConnectedTo)
{
This->filter.rtStreamStart = tStart;
if (This->filter.state == State_Paused)
@@ -633,9 +634,18 @@ static HRESULT WINAPI DSoundRender_Run(IBaseFilter * iface, REFERENCE_TIME tStar
This->pInputPin->end_of_stream = 0;
}
ResetEvent(This->blocked);
-
- This->filter.state = State_Running;
+ } 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))
+ This->filter.state = State_Running;
LeaveCriticalSection(&This->filter.csFilter);
return hr;
@@ -802,6 +812,7 @@ static HRESULT WINAPI DSoundRender_InputPin_EndOfStream(IPin * iface)
BaseInputPin* This = (BaseInputPin*)iface;
DSoundRenderImpl *me = (DSoundRenderImpl*)This->pin.pinInfo.pFilter;
IMediaEventSink* pEventSink;
+ BYTE *silence;
HRESULT hr;
EnterCriticalSection(This->pin.pCritSec);
@@ -815,21 +826,22 @@ static HRESULT WINAPI DSoundRender_InputPin_EndOfStream(IPin * iface)
return hr;
}
- hr = IFilterGraph_QueryInterface(me->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
- if (SUCCEEDED(hr))
+ silence = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, me->buf_size);
+ if (silence)
{
- BYTE * silence;
+ memset(silence, 0, me->buf_size);
+ DSoundRender_SendSampleData(me, silence, me->buf_size);
+ HeapFree(GetProcessHeap(), 0, silence);
+ }
- silence = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, me->buf_size);
- if (silence)
+ if (me->filter.filterInfo.pGraph)
+ {
+ hr = IFilterGraph_QueryInterface(me->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
+ if (SUCCEEDED(hr))
{
- 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, (LONG_PTR)me);
+ IMediaEventSink_Release(pEventSink);
}
-
- hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0);
- IMediaEventSink_Release(pEventSink);
}
MediaSeekingPassThru_EOS(me->seekthru_unk);
LeaveCriticalSection(This->pin.pCritSec);
More information about the wine-cvs
mailing list