Alexandre Julliard : quartz: Implemented a number of the MediaPosition methods.

Alexandre Julliard julliard at winehq.org
Tue Nov 24 12:40:23 CST 2009


Module: wine
Branch: master
Commit: a3fbb3929949f96c35b692f3f184487aaf9082a0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a3fbb3929949f96c35b692f3f184487aaf9082a0

Author: Alexandre Julliard <julliard at 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){




More information about the wine-cvs mailing list