Chris Robinson : quartz: Implement Get/SetSyncSource for the FilterGraph' s IMediaFilter interface.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 4 15:40:07 CDT 2007


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

Author: Chris Robinson <chris.kcat at gmail.com>
Date:   Tue Apr  3 10:44:41 2007 -0700

quartz: Implement Get/SetSyncSource for the FilterGraph's IMediaFilter interface.

---

 dlls/quartz/filtergraph.c |   61 ++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 5964502..8f87870 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -181,6 +181,7 @@ typedef struct _IFilterGraphImpl {
     int nFilters;
     int filterCapacity;
     long nameIndex;
+    IReferenceClock *refClock;
     EventsQueue evqueue;
     HANDLE hEventCompletion;
     int CompletionStatus;
@@ -263,8 +264,15 @@ static ULONG Filtergraph_Release(IFilterGraphImpl *This) {
     
     if (ref == 0) {
         int i;
+
+        if (This->refClock)
+            IReferenceClock_Release(This->refClock);
+
         for (i = 0; i < This->nFilters; i++)
+        {
+            IBaseFilter_SetSyncSource(This->ppFiltersInGraph[i], NULL);
             IBaseFilter_Release(This->ppFiltersInGraph[i]);
+        }
         for (i = 0; i < This->nItfCacheEntries; i++)
             IUnknown_Release(This->ItfCacheEntries[i].iface);
 	IFilterMapper2_Release(This->pFilterMapper2);
@@ -392,6 +400,7 @@ static HRESULT WINAPI GraphBuilder_AddFilter(IGraphBuilder *iface,
         This->ppFiltersInGraph[This->nFilters] = pFilter;
         This->pFilterNames[This->nFilters] = wszFilterName;
         This->nFilters++;
+        IBaseFilter_SetSyncSource(pFilter, This->refClock);
     }
     else
 	CoTaskMemFree(wszFilterName);
@@ -430,6 +439,7 @@ static HRESULT WINAPI GraphBuilder_RemoveFilter(IGraphBuilder *iface,
             hr = IBaseFilter_JoinFilterGraph(pFilter, NULL, This->pFilterNames[i]);
             if (SUCCEEDED(hr))
             {
+                IBaseFilter_SetSyncSource(pFilter, NULL);
                 IBaseFilter_Release(pFilter);
                 CoTaskMemFree(This->pFilterNames[i]);
                 memmove(This->ppFiltersInGraph+i, This->ppFiltersInGraph+i+1, sizeof(IBaseFilter*)*(This->nFilters - 1 - i));
@@ -4253,16 +4263,58 @@ static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD dwMsTimeou
 
 static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceClock *pClock)
 {
-    FIXME("(%p): stub\n", pClock);
+    ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+    HRESULT hr = S_OK;
+    int i;
 
-    return E_NOTIMPL;
+    TRACE("(%p/%p)->(%p)\n", iface, This, pClock);
+
+    EnterCriticalSection(&This->cs);
+    {
+        for (i = 0;i < This->nFilters;i++)
+        {
+            hr = IBaseFilter_SetSyncSource(This->ppFiltersInGraph[i], pClock);
+            if (FAILED(hr))
+                break;
+        }
+
+        if (FAILED(hr))
+        {
+            for(;i >= 0;i--)
+                IBaseFilter_SetSyncSource(This->ppFiltersInGraph[i], This->refClock);
+        }
+        else
+        {
+            if (This->refClock)
+                IReferenceClock_Release(This->refClock);
+            This->refClock = pClock;
+            if (This->refClock)
+                IReferenceClock_AddRef(This->refClock);
+        }
+    }
+    LeaveCriticalSection(&This->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI MediaFilter_GetSyncSource(IMediaFilter *iface, IReferenceClock **ppClock)
 {
-    FIXME("(%p): stub\n", ppClock);
+    ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p/%p)->(%p)\n", iface, This, ppClock);
+
+    if (!ppClock)
+        return E_POINTER;
+
+    EnterCriticalSection(&This->cs);
+    {
+        *ppClock = This->refClock;
+        if (*ppClock)
+            IReferenceClock_AddRef(*ppClock);
+    }
+    LeaveCriticalSection(&This->cs);
+
+    return S_OK;
 }
 
 static const IMediaFilterVtbl IMediaFilter_VTable =
@@ -4535,6 +4587,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
     fimpl->nFilters = 0;
     fimpl->filterCapacity = 0;
     fimpl->nameIndex = 1;
+    fimpl->refClock = NULL;
     fimpl->hEventCompletion = CreateEventW(0, TRUE, FALSE, 0);
     fimpl->HandleEcComplete = TRUE;
     fimpl->HandleEcRepaint = TRUE;




More information about the wine-cvs mailing list