Commit f9527e9c authored by Chris Robinson's avatar Chris Robinson Committed by Alexandre Julliard

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

parent a8675531
...@@ -181,6 +181,7 @@ typedef struct _IFilterGraphImpl { ...@@ -181,6 +181,7 @@ typedef struct _IFilterGraphImpl {
int nFilters; int nFilters;
int filterCapacity; int filterCapacity;
long nameIndex; long nameIndex;
IReferenceClock *refClock;
EventsQueue evqueue; EventsQueue evqueue;
HANDLE hEventCompletion; HANDLE hEventCompletion;
int CompletionStatus; int CompletionStatus;
...@@ -263,8 +264,15 @@ static ULONG Filtergraph_Release(IFilterGraphImpl *This) { ...@@ -263,8 +264,15 @@ static ULONG Filtergraph_Release(IFilterGraphImpl *This) {
if (ref == 0) { if (ref == 0) {
int i; int i;
if (This->refClock)
IReferenceClock_Release(This->refClock);
for (i = 0; i < This->nFilters; i++) for (i = 0; i < This->nFilters; i++)
{
IBaseFilter_SetSyncSource(This->ppFiltersInGraph[i], NULL);
IBaseFilter_Release(This->ppFiltersInGraph[i]); IBaseFilter_Release(This->ppFiltersInGraph[i]);
}
for (i = 0; i < This->nItfCacheEntries; i++) for (i = 0; i < This->nItfCacheEntries; i++)
IUnknown_Release(This->ItfCacheEntries[i].iface); IUnknown_Release(This->ItfCacheEntries[i].iface);
IFilterMapper2_Release(This->pFilterMapper2); IFilterMapper2_Release(This->pFilterMapper2);
...@@ -392,6 +400,7 @@ static HRESULT WINAPI GraphBuilder_AddFilter(IGraphBuilder *iface, ...@@ -392,6 +400,7 @@ static HRESULT WINAPI GraphBuilder_AddFilter(IGraphBuilder *iface,
This->ppFiltersInGraph[This->nFilters] = pFilter; This->ppFiltersInGraph[This->nFilters] = pFilter;
This->pFilterNames[This->nFilters] = wszFilterName; This->pFilterNames[This->nFilters] = wszFilterName;
This->nFilters++; This->nFilters++;
IBaseFilter_SetSyncSource(pFilter, This->refClock);
} }
else else
CoTaskMemFree(wszFilterName); CoTaskMemFree(wszFilterName);
...@@ -430,6 +439,7 @@ static HRESULT WINAPI GraphBuilder_RemoveFilter(IGraphBuilder *iface, ...@@ -430,6 +439,7 @@ static HRESULT WINAPI GraphBuilder_RemoveFilter(IGraphBuilder *iface,
hr = IBaseFilter_JoinFilterGraph(pFilter, NULL, This->pFilterNames[i]); hr = IBaseFilter_JoinFilterGraph(pFilter, NULL, This->pFilterNames[i]);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
IBaseFilter_SetSyncSource(pFilter, NULL);
IBaseFilter_Release(pFilter); IBaseFilter_Release(pFilter);
CoTaskMemFree(This->pFilterNames[i]); CoTaskMemFree(This->pFilterNames[i]);
memmove(This->ppFiltersInGraph+i, This->ppFiltersInGraph+i+1, sizeof(IBaseFilter*)*(This->nFilters - 1 - 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 ...@@ -4253,16 +4263,58 @@ static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD dwMsTimeou
static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceClock *pClock) 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) 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 = static const IMediaFilterVtbl IMediaFilter_VTable =
...@@ -4535,6 +4587,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) ...@@ -4535,6 +4587,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
fimpl->nFilters = 0; fimpl->nFilters = 0;
fimpl->filterCapacity = 0; fimpl->filterCapacity = 0;
fimpl->nameIndex = 1; fimpl->nameIndex = 1;
fimpl->refClock = NULL;
fimpl->hEventCompletion = CreateEventW(0, TRUE, FALSE, 0); fimpl->hEventCompletion = CreateEventW(0, TRUE, FALSE, 0);
fimpl->HandleEcComplete = TRUE; fimpl->HandleEcComplete = TRUE;
fimpl->HandleEcRepaint = TRUE; fimpl->HandleEcRepaint = TRUE;
......
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