Maarten Lankhorst : quartz: Make removing filters work slightly better.
Alexandre Julliard
julliard at winehq.org
Fri Jun 27 07:41:56 CDT 2008
Module: wine
Branch: master
Commit: 46f4c4b4d8d440500980f8ad46f4fee5886590c4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=46f4c4b4d8d440500980f8ad46f4fee5886590c4
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Thu Jun 26 10:59:10 2008 -0700
quartz: Make removing filters work slightly better.
---
dlls/quartz/filtergraph.c | 35 +++++++++++++++++++++++++----------
1 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 6ceb125..62cdff3 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -279,22 +279,24 @@ 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);
-
+
TRACE("(%p)->(): new ref = %d\n", This, ref);
-
+
if (ref == 0) {
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;
- IBaseFilter_Stop(pFilter);
+ 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);
More information about the wine-cvs
mailing list