Module: wine Branch: master Commit: 769b3b515fb2a2f8fd8827fa3a666fd8569b8614 URL: http://source.winehq.org/git/wine.git/?a=commit;h=769b3b515fb2a2f8fd8827fa3a...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Thu Nov 4 17:54:28 2010 +0100
quartz: Fix run/pause/stop in filtergraph.
---
dlls/quartz/filtergraph.c | 34 +++++++++++++++++++--------------- 1 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 8189aaa..8c7339b 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -201,7 +201,8 @@ typedef struct _IFilterGraphImpl { BOOL bUnkOuterValid; BOOL bAggregatable; GUID timeformatseek; - LONGLONG start_time; + REFERENCE_TIME start_time; + REFERENCE_TIME pause_time; LONGLONG position; LONGLONG stop_position; LONG recursioncount; @@ -1940,21 +1941,26 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) { ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface); TRACE("(%p/%p)->()\n", This, iface);
- if (This->state == State_Running) return S_OK;
EnterCriticalSection(&This->cs); - if (This->state == State_Stopped) - This->EcCompleteCount = 0; + if (This->state == State_Running) + goto out; + This->EcCompleteCount = 0;
if (This->refClock) { - IReferenceClock_GetTime(This->refClock, &This->start_time); - This->start_time += 500000; + REFERENCE_TIME now; + IReferenceClock_GetTime(This->refClock, &now); + if (This->state == State_Stopped) + This->start_time = now + 500000; + else + This->start_time += now - This->pause_time; } else This->position = This->start_time = 0;
SendFilterMessage(iface, SendRun, 0); This->state = State_Running; +out: LeaveCriticalSection(&This->cs); return S_FALSE; } @@ -1963,21 +1969,16 @@ static HRESULT WINAPI MediaControl_Pause(IMediaControl *iface) { ICOM_THIS_MULTI(IFilterGraphImpl, IMediaControl_vtbl, iface); TRACE("(%p/%p)->()\n", This, iface);
- if (This->state == State_Paused) return S_OK; - EnterCriticalSection(&This->cs); - if (This->state == State_Stopped) - This->EcCompleteCount = 0; + if (This->state == State_Paused) + goto out;
if (This->state == State_Running && This->refClock) - { - LONGLONG time = This->start_time; - IReferenceClock_GetTime(This->refClock, &time); - This->position += time - This->start_time; - } + IReferenceClock_GetTime(This->refClock, &This->pause_time);
SendFilterMessage(iface, SendPause, 0); This->state = State_Paused; +out: LeaveCriticalSection(&This->cs); return S_FALSE; } @@ -5049,6 +5050,9 @@ static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface) static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME tStart) { ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface); + if (tStart) + FIXME("Run called with non-null tStart: %x%08x\n", + (int)(tStart>>32), (int)tStart); return MediaControl_Run((IMediaControl*)&This->IMediaControl_vtbl); }