Module: wine Branch: master Commit: 2b016601783125d3ab422ff075b2169dd8506aa3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2b016601783125d3ab422ff075...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Mon Nov 29 10:44:18 2010 +0100
quartz: Handle selecting default sync source better.
---
dlls/quartz/filtergraph.c | 34 ++++++++++++++++++++++++++++++---- 1 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 7b3fec9..f431cdb 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -200,6 +200,7 @@ typedef struct _IFilterGraphImpl { IUnknown * pUnkOuter; BOOL bUnkOuterValid; BOOL bAggregatable; + BOOL defaultclock; GUID timeformatseek; REFERENCE_TIME start_time; REFERENCE_TIME pause_time; @@ -754,17 +755,38 @@ static HRESULT WINAPI FilterGraph2_Disconnect(IFilterGraph2 *iface, IPin *ppin) static HRESULT WINAPI FilterGraph2_SetDefaultSyncSource(IFilterGraph2 *iface) { ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface); IReferenceClock *pClock = NULL; - HRESULT hr; + HRESULT hr = S_OK; + int i;
- TRACE("(%p/%p)->() semi-stub\n", iface, This); + TRACE("(%p/%p)->() live sources not handled properly!\n", iface, This);
- hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (LPVOID*)&pClock); + EnterCriticalSection(&This->cs); + + for (i = 0; i < This->nFilters; ++i) + { + DWORD miscflags; + IAMFilterMiscFlags *flags = NULL; + IUnknown_QueryInterface(This->ppFiltersInGraph[i], &IID_IAMFilterMiscFlags, (void**)&flags); + if (!flags) + continue; + miscflags = IAMFilterMiscFlags_GetMiscFlags(flags); + IUnknown_Release(flags); + if (miscflags == AM_FILTER_MISC_FLAGS_IS_RENDERER) + IUnknown_QueryInterface(This->ppFiltersInGraph[i], &IID_IReferenceClock, (void**)&pClock); + if (pClock) + break; + } + + if (!pClock) + hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (LPVOID*)&pClock);
if (SUCCEEDED(hr)) { hr = IMediaFilter_SetSyncSource((IMediaFilter*)&(This->IMediaFilter_vtbl), pClock); + This->defaultclock = TRUE; IReferenceClock_Release(pClock); } + LeaveCriticalSection(&This->cs);
return hr; } @@ -1931,6 +1953,9 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) { goto out; This->EcCompleteCount = 0;
+ if (This->defaultclock && !This->refClock) + IFilterGraph2_SetDefaultSyncSource((IFilterGraph2*)This); + if (This->refClock) { REFERENCE_TIME now; @@ -5075,6 +5100,7 @@ static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceC This->refClock = pClock; if (This->refClock) IReferenceClock_AddRef(This->refClock); + This->defaultclock = FALSE;
if (This->HandleEcClockChanged) { @@ -5428,6 +5454,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) fimpl->pUnkOuter = pUnkOuter; fimpl->bUnkOuterValid = FALSE; fimpl->bAggregatable = FALSE; + fimpl->defaultclock = TRUE; fimpl->IInner_vtbl = &IInner_VTable; fimpl->IFilterGraph2_vtbl = &IFilterGraph2_VTable; fimpl->IMediaControl_vtbl = &IMediaControl_VTable; @@ -5490,7 +5517,6 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) CoTaskMemFree(fimpl); return hr; } - IFilterGraph2_SetDefaultSyncSource((IFilterGraph2*)fimpl);
*ppObj = fimpl; return S_OK;