Module: wine Branch: master Commit: a3fbb3929949f96c35b692f3f184487aaf9082a0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a3fbb3929949f96c35b692f3f1...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Nov 24 13:13:56 2009 +0100
quartz: Implemented a number of the MediaPosition methods.
---
dlls/quartz/filtergraph.c | 87 +++++++++++++++++++++++++++++--------------- 1 files changed, 57 insertions(+), 30 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index d978f72..5377281 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -2557,28 +2557,33 @@ static const IMediaSeekingVtbl IMediaSeeking_VTable = MediaSeeking_GetPreroll };
+static inline IFilterGraphImpl *impl_from_IMediaPosition( IMediaPosition *iface ) +{ + return (IFilterGraphImpl *)((char*)iface - FIELD_OFFSET(IFilterGraphImpl, IMediaPosition_vtbl)); +} + /*** IUnknown methods ***/ -static HRESULT WINAPI MediaPosition_QueryInterface(IMediaPosition* iface, REFIID riid, void** ppvObj){ - ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface); +static HRESULT WINAPI MediaPosition_QueryInterface(IMediaPosition* iface, REFIID riid, void** ppvObj) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface );
TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj); - return Filtergraph_QueryInterface(This, riid, ppvObj); }
-static ULONG WINAPI MediaPosition_AddRef(IMediaPosition *iface){ - ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface); +static ULONG WINAPI MediaPosition_AddRef(IMediaPosition *iface) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface );
TRACE("(%p/%p)->()\n", This, iface); - return Filtergraph_AddRef(This); }
-static ULONG WINAPI MediaPosition_Release(IMediaPosition *iface){ - ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface); +static ULONG WINAPI MediaPosition_Release(IMediaPosition *iface) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface );
TRACE("(%p/%p)->()\n", This, iface); - return Filtergraph_Release(This); }
@@ -2604,31 +2609,51 @@ static HRESULT WINAPI MediaPosition_Invoke(IMediaPosition* iface, DISPID dispIdM }
/*** IMediaPosition methods ***/ -static HRESULT WINAPI MediaPosition_get_Duration(IMediaPosition * iface, REFTIME *plength){ - FIXME("(%p)->(%p) stub!\n", iface, plength); - return E_NOTIMPL; +static HRESULT WINAPI MediaPosition_get_Duration(IMediaPosition * iface, REFTIME *plength) +{ + LONGLONG duration; + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); + HRESULT hr = IMediaSeeking_GetDuration( (IMediaSeeking *)&This->IMediaSeeking_vtbl, &duration ); + if (SUCCEEDED(hr)) *plength = duration; + return hr; }
-static HRESULT WINAPI MediaPosition_put_CurrentPosition(IMediaPosition * iface, REFTIME llTime){ - ICOM_THIS_MULTI(IFilterGraphImpl, IMediaPosition_vtbl, iface); +static HRESULT WINAPI MediaPosition_put_CurrentPosition(IMediaPosition * iface, REFTIME llTime) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); LONGLONG reftime = llTime;
- return IMediaSeeking_SetPositions((IMediaSeeking *)&This->IMediaSeeking_vtbl, &reftime, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); + return IMediaSeeking_SetPositions((IMediaSeeking *)&This->IMediaSeeking_vtbl, + &reftime, AM_SEEKING_AbsolutePositioning, + NULL, AM_SEEKING_NoPositioning); }
-static HRESULT WINAPI MediaPosition_get_CurrentPosition(IMediaPosition * iface, REFTIME *pllTime){ - FIXME("(%p)->(%p) stub!\n", iface, pllTime); - return E_NOTIMPL; +static HRESULT WINAPI MediaPosition_get_CurrentPosition(IMediaPosition * iface, REFTIME *pllTime) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); + LONGLONG pos; + HRESULT hr = IMediaSeeking_GetCurrentPosition( (IMediaSeeking *)&This->IMediaSeeking_vtbl, &pos ); + if (SUCCEEDED(hr)) *pllTime = pos; + return hr; }
-static HRESULT WINAPI MediaPosition_get_StopTime(IMediaPosition * iface, REFTIME *pllTime){ - FIXME("(%p)->(%p) stub!\n", iface, pllTime); - return E_NOTIMPL; +static HRESULT WINAPI MediaPosition_get_StopTime(IMediaPosition * iface, REFTIME *pllTime) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); + LONGLONG pos; + HRESULT hr = IMediaSeeking_GetStopPosition( (IMediaSeeking *)&This->IMediaSeeking_vtbl, &pos ); + if (SUCCEEDED(hr)) *pllTime = pos; + return hr; }
-static HRESULT WINAPI MediaPosition_put_StopTime(IMediaPosition * iface, REFTIME llTime){ - FIXME("(%p)->(%f) stub!\n", iface, llTime); - return E_NOTIMPL; +static HRESULT WINAPI MediaPosition_put_StopTime(IMediaPosition * iface, REFTIME llTime) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); + LONGLONG reftime = llTime; + + return IMediaSeeking_SetPositions((IMediaSeeking *)&This->IMediaSeeking_vtbl, + NULL, AM_SEEKING_NoPositioning, + &reftime, AM_SEEKING_AbsolutePositioning); }
static HRESULT WINAPI MediaPosition_get_PrerollTime(IMediaPosition * iface, REFTIME *pllTime){ @@ -2641,14 +2666,16 @@ static HRESULT WINAPI MediaPosition_put_PrerollTime(IMediaPosition * iface, REFT return E_NOTIMPL; }
-static HRESULT WINAPI MediaPosition_put_Rate(IMediaPosition * iface, double dRate){ - FIXME("(%p)->(%f) stub!\n", iface, dRate); - return E_NOTIMPL; +static HRESULT WINAPI MediaPosition_put_Rate(IMediaPosition * iface, double dRate) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); + return IMediaSeeking_SetRate((IMediaSeeking *)&This->IMediaSeeking_vtbl, dRate); }
-static HRESULT WINAPI MediaPosition_get_Rate(IMediaPosition * iface, double *pdRate){ - FIXME("(%p)->(%p) stub!\n", iface, pdRate); - return E_NOTIMPL; +static HRESULT WINAPI MediaPosition_get_Rate(IMediaPosition * iface, double *pdRate) +{ + IFilterGraphImpl *This = impl_from_IMediaPosition( iface ); + return IMediaSeeking_GetRate((IMediaSeeking *)&This->IMediaSeeking_vtbl, pdRate); }
static HRESULT WINAPI MediaPosition_CanSeekForward(IMediaPosition * iface, LONG *pCanSeekForward){