Maarten Lankhorst : quartz: Fix IFilterGraph RemoveFilter to stop the filter before removing it.

Alexandre Julliard julliard at winehq.org
Sat Mar 15 05:53:47 CDT 2008


Module: wine
Branch: master
Commit: 14ba79ec621bf60855016297cded61cc865daf5a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=14ba79ec621bf60855016297cded61cc865daf5a

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Thu Mar 13 22:00:57 2008 -0700

quartz: Fix IFilterGraph RemoveFilter to stop the filter before removing it.

Also checks for VFW_E_NOT_STOPPED that is allowed to cause a
disconnection to fail.

---

 dlls/quartz/filtergraph.c |   23 +++++++++++++++++++++--
 1 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 7f92562..762e3e2 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -448,12 +448,31 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface,
         if (This->ppFiltersInGraph[i] == pFilter)
         {
             IEnumPins *penumpins;
+            IBaseFilter_Stop(pFilter);
             hr = IBaseFilter_EnumPins(pFilter, &penumpins);
             if (SUCCEEDED(hr)) {
                 IPin *ppin;
                 while(IEnumPins_Next(penumpins, 1, &ppin, NULL) == S_OK) {
-                    IPin_Disconnect(ppin);
-                    IPin_Release(ppin);
+                    IPin *victim = NULL;
+                    HRESULT h;
+                    IPin_ConnectedTo(ppin, &victim);
+                    if (victim)
+                    {
+                        h = IPin_Disconnect(victim);
+                        TRACE("Disconnect other side: %08x\n", h);
+                        if (h == VFW_E_NOT_STOPPED)
+                        {
+                            PIN_INFO pinfo;
+                            IPin_QueryPinInfo(victim, &pinfo);
+                            IBaseFilter_Stop(pinfo.pFilter);
+                            IBaseFilter_Release(pinfo.pFilter);
+                            h = IPin_Disconnect(victim);
+                            TRACE("Disconnect retry: %08x\n", h);
+                        }
+                        IPin_Release(victim);
+                    }
+                    h = IPin_Disconnect(ppin);
+                    TRACE("Disconnect 2: %08x\n", h);
                 }
                 IEnumPins_Release(penumpins);
             }




More information about the wine-cvs mailing list