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