[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