[PATCH 5/6] quartz: Fix EC_COMPLETE handling on null renderer

Maarten Lankhorst m.b.lankhorst at gmail.com
Thu Nov 4 11:02:25 CDT 2010


---
 dlls/quartz/nullrenderer.c |   25 +++++++++++++++++++++----
 1 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/dlls/quartz/nullrenderer.c b/dlls/quartz/nullrenderer.c
index 1764e23..cab2090 100644
--- a/dlls/quartz/nullrenderer.c
+++ b/dlls/quartz/nullrenderer.c
@@ -334,19 +334,36 @@ static HRESULT WINAPI NullRenderer_Pause(IBaseFilter * iface)
 
 static HRESULT WINAPI NullRenderer_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
 {
+    HRESULT hr = S_OK;
     NullRendererImpl *This = (NullRendererImpl *)iface;
 
     TRACE("(%p/%p)->(%s)\n", This, iface, wine_dbgstr_longlong(tStart));
 
     EnterCriticalSection(&This->filter.csFilter);
+    if (This->filter.state == State_Running)
+        goto out;
+    if (This->pInputPin->pin.pConnectedTo)
     {
         This->filter.rtStreamStart = tStart;
-        This->filter.state = State_Running;
         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))
+        This->filter.state = State_Running;
+out:
     LeaveCriticalSection(&This->filter.csFilter);
 
-    return S_OK;
+    return hr;
 }
 
 /** IBaseFilter implementation **/
@@ -404,10 +421,10 @@ static HRESULT WINAPI NullRenderer_InputPin_EndOfStream(IPin * iface)
     graph = pNull->filter.filterInfo.pGraph;
     if (graph)
     {
-        hr = IFilterGraph_QueryInterface(((NullRendererImpl*)This->pin.pinInfo.pFilter)->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
+        hr = IFilterGraph_QueryInterface(pNull->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
         if (SUCCEEDED(hr))
         {
-            hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0);
+            hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)pNull);
             IMediaEventSink_Release(pEventSink);
         }
     }
-- 
1.7.1




More information about the wine-patches mailing list