From c4cc7ddb9215a3228649c5a33621d26dfcf2116a Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Tue, 1 Apr 2008 14:07:38 -0700 Subject: [PATCH] quartz: Implement filtergraph mediaseeking setpositions --- dlls/quartz/filtergraph.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 files changed, 36 insertions(+), 2 deletions(-) diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 5fd6a95..0a841d9 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -2015,16 +2015,50 @@ static HRESULT WINAPI MediaSeeking_ConvertTimeFormat(IMediaSeeking *iface, return S_OK; } +struct pos_args { + LONGLONG* current, *stop; + DWORD curflags, stopflags; +}; + +static HRESULT WINAPI found_setposition(IFilterGraphImpl *This, IMediaSeeking *seek, DWORD_PTR pargs) +{ + struct pos_args *args = (void*)pargs; + + return IMediaSeeking_SetPositions(seek, args->current, args->curflags, args->stop, args->stopflags); +} + static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags) { ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface); + HRESULT hr = S_OK; + FILTER_STATE state; + struct pos_args args; - FIXME("(%p/%p)->(%p, %08x, %p, %08x): stub !!!\n", This, iface, pCurrent, dwCurrentFlags, pStop, dwStopFlags); + TRACE("(%p/%p)->(%p, %08x, %p, %08x)\n", This, iface, pCurrent, dwCurrentFlags, pStop, dwStopFlags); - return S_OK; + EnterCriticalSection(&This->cs); + state = This->state; + TRACE("State: %s\n", state == State_Running ? "Running" : (state == State_Paused ? "Paused" : (state == State_Stopped ? "Stopped" : "UNKNOWN"))); + + if ((dwCurrentFlags & 0x7) == AM_SEEKING_AbsolutePositioning) + This->position = *pCurrent; + else if ((dwCurrentFlags & 0x7) != AM_SEEKING_NoPositioning) + FIXME("Adjust method %x not handled yet!\n", dwCurrentFlags & 0x7); + + if ((dwStopFlags & 0x7) != AM_SEEKING_NoPositioning) + FIXME("Stop position not handled yet!\n"); + + args.current = pCurrent; + args.stop = pStop; + args.curflags = dwCurrentFlags; + args.stopflags = dwStopFlags; + hr = all_renderers_seek(This, found_setposition, (DWORD_PTR)&args); + LeaveCriticalSection(&This->cs); + + return hr; } static HRESULT WINAPI MediaSeeking_GetPositions(IMediaSeeking *iface, -- 1.5.4.1