[PATCH 4/6] quartz/filtergraph: Implement IMediaControl state functions on top of IMediaFilter.

Zebediah Figura z.figura12 at gmail.com
Tue Sep 25 23:30:21 CDT 2018


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/filtergraph.c       | 211 ++++++++++++++++++++--------------------
 dlls/quartz/tests/filtergraph.c |   2 -
 2 files changed, 108 insertions(+), 105 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index e721388..1857f92 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -2262,114 +2262,34 @@ static HRESULT SendFilterMessage(IFilterGraphImpl *This, fnFoundFilter FoundFilt
     return S_FALSE;
 }
 
-/*** IMediaControl methods ***/
 static HRESULT WINAPI MediaControl_Run(IMediaControl *iface)
 {
-    IFilterGraphImpl *This = impl_from_IMediaControl(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaControl(iface);
 
-    TRACE("(%p/%p)->()\n", This, iface);
-
-    EnterCriticalSection(&This->cs);
-    if (This->state == State_Running)
-        goto out;
-    This->EcCompleteCount = 0;
-
-    if (This->defaultclock && !This->refClock)
-        IFilterGraph2_SetDefaultSyncSource(&This->IFilterGraph2_iface);
-
-    if (This->refClock)
-    {
-        REFERENCE_TIME now;
-        IReferenceClock_GetTime(This->refClock, &now);
-        if (This->state == State_Stopped)
-            This->start_time = now + 500000;
-        else if (This->pause_time >= 0)
-            This->start_time += now - This->pause_time;
-        else
-            This->start_time = now;
-    }
-    else This->start_time = 0;
-
-    SendFilterMessage(This, SendRun, (DWORD_PTR)&This->start_time);
-    This->state = State_Running;
-out:
-    LeaveCriticalSection(&This->cs);
-    return S_FALSE;
+    return IMediaFilter_Run(&graph->IMediaFilter_iface, 0);
 }
 
 static HRESULT WINAPI MediaControl_Pause(IMediaControl *iface)
 {
-    IFilterGraphImpl *This = impl_from_IMediaControl(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaControl(iface);
 
-    TRACE("(%p/%p)->()\n", This, iface);
-
-    EnterCriticalSection(&This->cs);
-    if (This->state == State_Paused)
-        goto out;
-
-    if (This->defaultclock && !This->refClock)
-        IFilterGraph2_SetDefaultSyncSource(&This->IFilterGraph2_iface);
-
-    if (This->state == State_Running && This->refClock && This->start_time >= 0)
-        IReferenceClock_GetTime(This->refClock, &This->pause_time);
-    else
-        This->pause_time = -1;
-
-    SendFilterMessage(This, SendPause, 0);
-    This->state = State_Paused;
-out:
-    LeaveCriticalSection(&This->cs);
-    return S_FALSE;
+    return IMediaFilter_Pause(&graph->IMediaFilter_iface);
 }
 
 static HRESULT WINAPI MediaControl_Stop(IMediaControl *iface)
 {
-    IFilterGraphImpl *This = impl_from_IMediaControl(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaControl(iface);
 
-    TRACE("(%p/%p)->()\n", This, iface);
-
-    if (This->state == State_Stopped) return S_OK;
-
-    EnterCriticalSection(&This->cs);
-    if (This->state == State_Running) SendFilterMessage(This, SendPause, 0);
-    SendFilterMessage(This, SendStop, 0);
-    This->state = State_Stopped;
-    LeaveCriticalSection(&This->cs);
-    return S_OK;
+    return IMediaFilter_Stop(&graph->IMediaFilter_iface);
 }
 
-static HRESULT WINAPI MediaControl_GetState(IMediaControl *iface, LONG msTimeout,
-        OAFilterState *pfs)
+static HRESULT WINAPI MediaControl_GetState(IMediaControl *iface, LONG timeout, OAFilterState *state)
 {
-    IFilterGraphImpl *This = impl_from_IMediaControl(iface);
-    DWORD end;
+    IFilterGraphImpl *graph = impl_from_IMediaControl(iface);
 
-    TRACE("(%p/%p)->(%d, %p)\n", This, iface, msTimeout, pfs);
+    if (timeout < 0) timeout = INFINITE;
 
-    if (!pfs)
-        return E_POINTER;
-
-    EnterCriticalSection(&This->cs);
-
-    *pfs = This->state;
-    if (msTimeout > 0)
-    {
-        end = GetTickCount() + msTimeout;
-    }
-    else if (msTimeout < 0)
-    {
-        end = INFINITE;
-    }
-    else
-    {
-        end = 0;
-    }
-    if (end)
-        SendFilterMessage(This, SendGetState, end);
-
-    LeaveCriticalSection(&This->cs);
-
-    return S_OK;
+    return IMediaFilter_GetState(&graph->IMediaFilter_iface, timeout, (FILTER_STATE *)state);
 }
 
 static HRESULT WINAPI MediaControl_RenderFile(IMediaControl *iface, BSTR strFilename)
@@ -5488,34 +5408,119 @@ static HRESULT WINAPI MediaFilter_GetClassID(IMediaFilter *iface, CLSID * pClass
 
 static HRESULT WINAPI MediaFilter_Stop(IMediaFilter *iface)
 {
-    IFilterGraphImpl *This = impl_from_IMediaFilter(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaFilter(iface);
 
-    return MediaControl_Stop(&This->IMediaControl_iface);
+    TRACE("graph %p.\n", graph);
+
+    EnterCriticalSection(&graph->cs);
+
+    if (graph->state == State_Stopped)
+    {
+        LeaveCriticalSection(&graph->cs);
+        return S_OK;
+    }
+
+    if (graph->state == State_Running)
+        SendFilterMessage(graph, SendPause, 0);
+    SendFilterMessage(graph, SendStop, 0);
+    graph->state = State_Stopped;
+
+    LeaveCriticalSection(&graph->cs);
+    return S_OK;
 }
 
 static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface)
 {
-    IFilterGraphImpl *This = impl_from_IMediaFilter(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaFilter(iface);
 
-    return MediaControl_Pause(&This->IMediaControl_iface);
+    TRACE("graph %p.\n", graph);
+
+    EnterCriticalSection(&graph->cs);
+
+    if (graph->state == State_Paused)
+    {
+        LeaveCriticalSection(&graph->cs);
+        return S_OK;
+    }
+
+    if (graph->defaultclock && !graph->refClock)
+        IFilterGraph2_SetDefaultSyncSource(&graph->IFilterGraph2_iface);
+
+    if (graph->state == State_Running && graph->refClock && graph->start_time >= 0)
+        IReferenceClock_GetTime(graph->refClock, &graph->pause_time);
+    else
+        graph->pause_time = -1;
+
+    SendFilterMessage(graph, SendPause, 0);
+    graph->state = State_Paused;
+
+    LeaveCriticalSection(&graph->cs);
+    return S_FALSE;
 }
 
-static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME tStart)
+static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME start)
 {
-    IFilterGraphImpl *This = impl_from_IMediaFilter(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaFilter(iface);
 
-    if (tStart)
-        FIXME("Run called with non-null tStart: %s\n", wine_dbgstr_longlong(tStart));
+    TRACE("graph %p, start %s.\n", graph, wine_dbgstr_longlong(start));
 
-    return MediaControl_Run(&This->IMediaControl_iface);
+    EnterCriticalSection(&graph->cs);
+
+    if (graph->state == State_Running)
+    {
+        LeaveCriticalSection(&graph->cs);
+        return S_OK;
+    }
+    graph->EcCompleteCount = 0;
+
+    if (graph->defaultclock && !graph->refClock)
+        IFilterGraph2_SetDefaultSyncSource(&graph->IFilterGraph2_iface);
+
+    if (!start && graph->refClock)
+    {
+        REFERENCE_TIME now;
+        IReferenceClock_GetTime(graph->refClock, &now);
+        if (graph->state == State_Stopped)
+            graph->start_time = now + 500000;
+        else if (graph->pause_time >= 0)
+            graph->start_time += now - graph->pause_time;
+        else
+            graph->start_time = now;
+    }
+    else
+        graph->start_time = start;
+
+    SendFilterMessage(graph, SendRun, (DWORD_PTR)&graph->start_time);
+    graph->state = State_Running;
+
+    LeaveCriticalSection(&graph->cs);
+    return S_FALSE;
 }
 
-static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD dwMsTimeout,
-        FILTER_STATE *pState)
+static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD timeout, FILTER_STATE *state)
 {
-    IFilterGraphImpl *This = impl_from_IMediaFilter(iface);
+    IFilterGraphImpl *graph = impl_from_IMediaFilter(iface);
+    DWORD end;
 
-    return MediaControl_GetState(&This->IMediaControl_iface, dwMsTimeout, (OAFilterState*)pState);
+    TRACE("graph %p, timeout %u, state %p.\n", graph, timeout, state);
+
+    if (!state)
+        return E_POINTER;
+
+    EnterCriticalSection(&graph->cs);
+
+    *state = graph->state;
+    if (timeout > 0)
+        end = GetTickCount() + timeout;
+    else if (timeout == INFINITE)
+        end = INFINITE;
+    else
+        end = 0;
+    if (end)
+        SendFilterMessage(graph, SendGetState, end);
+
+    LeaveCriticalSection(&graph->cs);
+    return S_OK;
 }
 
 static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceClock *pClock)
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index 8dc7341..6838c02 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -2698,10 +2698,8 @@ todo_wine
 todo_wine
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_filter_state(graph, State_Running);
-todo_wine {
     ok(source.start_time == 0xdeadbeef, "Got time %s.\n", wine_dbgstr_longlong(source.start_time));
     ok(sink.start_time == 0xdeadbeef, "Got time %s.\n", wine_dbgstr_longlong(sink.start_time));
-}
 
     hr = IMediaFilter_Pause(filter);
 todo_wine
-- 
2.7.4




More information about the wine-devel mailing list