Commit 46f4c4b4 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Alexandre Julliard

quartz: Make removing filters work slightly better.

parent 50b98a29
......@@ -279,7 +279,8 @@ static ULONG WINAPI FilterGraphInner_AddRef(IUnknown * iface) {
return ref;
}
static ULONG WINAPI FilterGraphInner_Release(IUnknown * iface) {
static ULONG WINAPI FilterGraphInner_Release(IUnknown * iface)
{
ICOM_THIS_MULTI(IFilterGraphImpl, IInner_vtbl, iface);
ULONG ref = InterlockedDecrement(&This->ref);
......@@ -289,12 +290,13 @@ static ULONG WINAPI FilterGraphInner_Release(IUnknown * iface) {
int i;
IMediaControl_Stop((IMediaControl*)&(This->IMediaControl_vtbl));
if (This->refClock)
IReferenceClock_Release(This->refClock);
while (This->nFilters)
IFilterGraph2_RemoveFilter((IFilterGraph2*)This, This->ppFiltersInGraph[0]);
if (This->refClock)
IReferenceClock_Release(This->refClock);
for (i = 0; i < This->nItfCacheEntries; i++)
{
if (This->ItfCacheEntries[i].iface)
......@@ -439,8 +441,8 @@ static HRESULT WINAPI FilterGraph2_AddFilter(IFilterGraph2 *iface,
return hr;
}
static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface,
IBaseFilter *pFilter) {
static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface, IBaseFilter *pFilter)
{
ICOM_THIS_MULTI(IFilterGraphImpl, IFilterGraph2_vtbl, iface);
int i;
HRESULT hr = E_FAIL;
......@@ -453,12 +455,21 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface,
{
if (This->ppFiltersInGraph[i] == pFilter)
{
IEnumPins *penumpins;
IEnumPins *penumpins = NULL;
FILTER_STATE state;
TRACE("Removing filter %s\n", debugstr_w(This->pFilterNames[i]));
IBaseFilter_GetState(pFilter, 0, &state);
if (state == State_Running)
IBaseFilter_Pause(pFilter);
if (state != State_Stopped)
IBaseFilter_Stop(pFilter);
hr = IBaseFilter_EnumPins(pFilter, &penumpins);
if (SUCCEEDED(hr)) {
IPin *ppin;
while(IEnumPins_Next(penumpins, 1, &ppin, NULL) == S_OK) {
while(IEnumPins_Next(penumpins, 1, &ppin, NULL) == S_OK)
{
IPin *victim = NULL;
HRESULT h;
IPin_ConnectedTo(ppin, &victim);
......@@ -470,6 +481,10 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface,
{
PIN_INFO pinfo;
IPin_QueryPinInfo(victim, &pinfo);
IBaseFilter_GetState(pinfo.pFilter, 0, &state);
if (state == State_Running)
IBaseFilter_Pause(pinfo.pFilter);
IBaseFilter_Stop(pinfo.pFilter);
IBaseFilter_Release(pinfo.pFilter);
h = IPin_Disconnect(victim);
......
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