Commit 2b016601 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Alexandre Julliard

quartz: Handle selecting default sync source better.

parent f0ebe19b
...@@ -200,6 +200,7 @@ typedef struct _IFilterGraphImpl { ...@@ -200,6 +200,7 @@ typedef struct _IFilterGraphImpl {
IUnknown * pUnkOuter; IUnknown * pUnkOuter;
BOOL bUnkOuterValid; BOOL bUnkOuterValid;
BOOL bAggregatable; BOOL bAggregatable;
BOOL defaultclock;
GUID timeformatseek; GUID timeformatseek;
REFERENCE_TIME start_time; REFERENCE_TIME start_time;
REFERENCE_TIME pause_time; REFERENCE_TIME pause_time;
...@@ -754,17 +755,38 @@ static HRESULT WINAPI FilterGraph2_Disconnect(IFilterGraph2 *iface, IPin *ppin) ...@@ -754,17 +755,38 @@ static HRESULT WINAPI FilterGraph2_Disconnect(IFilterGraph2 *iface, IPin *ppin)
static HRESULT WINAPI FilterGraph2_SetDefaultSyncSource(IFilterGraph2 *iface) { static HRESULT WINAPI FilterGraph2_SetDefaultSyncSource(IFilterGraph2 *iface) {
ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface); ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
IReferenceClock *pClock = NULL; IReferenceClock *pClock = NULL;
HRESULT hr; HRESULT hr = S_OK;
int i;
TRACE("(%p/%p)->() live sources not handled properly!\n", iface, This);
TRACE("(%p/%p)->() semi-stub\n", iface, This); 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); hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (LPVOID*)&pClock);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = IMediaFilter_SetSyncSource((IMediaFilter*)&(This->IMediaFilter_vtbl), pClock); hr = IMediaFilter_SetSyncSource((IMediaFilter*)&(This->IMediaFilter_vtbl), pClock);
This->defaultclock = TRUE;
IReferenceClock_Release(pClock); IReferenceClock_Release(pClock);
} }
LeaveCriticalSection(&This->cs);
return hr; return hr;
} }
...@@ -1931,6 +1953,9 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) { ...@@ -1931,6 +1953,9 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) {
goto out; goto out;
This->EcCompleteCount = 0; This->EcCompleteCount = 0;
if (This->defaultclock && !This->refClock)
IFilterGraph2_SetDefaultSyncSource((IFilterGraph2*)This);
if (This->refClock) if (This->refClock)
{ {
REFERENCE_TIME now; REFERENCE_TIME now;
...@@ -5075,6 +5100,7 @@ static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceC ...@@ -5075,6 +5100,7 @@ static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceC
This->refClock = pClock; This->refClock = pClock;
if (This->refClock) if (This->refClock)
IReferenceClock_AddRef(This->refClock); IReferenceClock_AddRef(This->refClock);
This->defaultclock = FALSE;
if (This->HandleEcClockChanged) if (This->HandleEcClockChanged)
{ {
...@@ -5428,6 +5454,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) ...@@ -5428,6 +5454,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
fimpl->pUnkOuter = pUnkOuter; fimpl->pUnkOuter = pUnkOuter;
fimpl->bUnkOuterValid = FALSE; fimpl->bUnkOuterValid = FALSE;
fimpl->bAggregatable = FALSE; fimpl->bAggregatable = FALSE;
fimpl->defaultclock = TRUE;
fimpl->IInner_vtbl = &IInner_VTable; fimpl->IInner_vtbl = &IInner_VTable;
fimpl->IFilterGraph2_vtbl = &IFilterGraph2_VTable; fimpl->IFilterGraph2_vtbl = &IFilterGraph2_VTable;
fimpl->IMediaControl_vtbl = &IMediaControl_VTable; fimpl->IMediaControl_vtbl = &IMediaControl_VTable;
...@@ -5490,7 +5517,6 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) ...@@ -5490,7 +5517,6 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
CoTaskMemFree(fimpl); CoTaskMemFree(fimpl);
return hr; return hr;
} }
IFilterGraph2_SetDefaultSyncSource((IFilterGraph2*)fimpl);
*ppObj = fimpl; *ppObj = fimpl;
return S_OK; return S_OK;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment