Chris Robinson : quartz: Force disconnect when a filter is fully released.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 13 16:56:43 CDT 2007


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

Author: Chris Robinson <chris.kcat at gmail.com>
Date:   Tue Mar 13 10:47:47 2007 -0700

quartz: Force disconnect when a filter is fully released.

---

 dlls/quartz/dsoundrender.c  |    9 +++++++++
 dlls/quartz/parser.c        |   11 +++++++++++
 dlls/quartz/transform.c     |   11 +++++++++++
 dlls/quartz/videorenderer.c |    9 +++++++++
 4 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index bdb6079..b5fa40b 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -398,6 +398,8 @@ static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface)
 
     if (!refCount)
     {
+        IPin *pConnectedTo;
+
         This->csFilter.DebugInfo->Spare[0] = 0;
         DeleteCriticalSection(&This->csFilter);
         if (This->pClock)
@@ -410,6 +412,13 @@ static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface)
             IDirectSound_Release(This->dsound);
         This->dsound = NULL;
        
+        if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[0], &pConnectedTo)))
+        {
+            IPin_Disconnect(pConnectedTo);
+            IPin_Release(pConnectedTo);
+        }
+        IPin_Disconnect(This->ppPins[0]);
+
         IPin_Release(This->ppPins[0]);
         
         CoTaskMemFree(This->ppPins);
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index 1da0b6d..fb8c085 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -193,7 +193,18 @@ static ULONG WINAPI Parser_Release(IBaseFilter * iface)
             IReferenceClock_Release(This->pClock);
         
         for (i = 0; i < This->cStreams + 1; i++)
+        {
+            IPin *pConnectedTo;
+
+            if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo)))
+            {
+                IPin_Disconnect(pConnectedTo);
+                IPin_Release(pConnectedTo);
+            }
+            IPin_Disconnect(This->ppPins[i]);
+
             IPin_Release(This->ppPins[i]);
+        }
         
         CoTaskMemFree(This->ppPins);
         This->lpVtbl = NULL;
diff --git a/dlls/quartz/transform.c b/dlls/quartz/transform.c
index 22cb2bf..04366ef 100644
--- a/dlls/quartz/transform.c
+++ b/dlls/quartz/transform.c
@@ -283,7 +283,18 @@ static ULONG WINAPI TransformFilter_Release(IBaseFilter * iface)
             IReferenceClock_Release(This->pClock);
 
         for (i = 0; i < 2; i++)
+        {
+            IPin *pConnectedTo;
+
+            if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo)))
+            {
+                IPin_Disconnect(pConnectedTo);
+                IPin_Release(pConnectedTo);
+            }
+            IPin_Disconnect(This->ppPins[i]);
+
             IPin_Release(This->ppPins[i]);
+        }
 
         CoTaskMemFree(This->ppPins);
         This->lpVtbl = NULL;
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 695258d..ccfa61a 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -522,6 +522,8 @@ static ULONG WINAPI VideoRenderer_Release(IBaseFilter * iface)
 
     if (!refCount)
     {
+        IPin *pConnectedTo;
+
         This->csFilter.DebugInfo->Spare[0] = 0;
         DeleteCriticalSection(&This->csFilter);
 
@@ -533,6 +535,13 @@ static ULONG WINAPI VideoRenderer_Release(IBaseFilter * iface)
         if (This->pClock)
             IReferenceClock_Release(This->pClock);
         
+        if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[0], &pConnectedTo)))
+        {
+            IPin_Disconnect(pConnectedTo);
+            IPin_Release(pConnectedTo);
+        }
+        IPin_Disconnect(This->ppPins[0]);
+
         IPin_Release(This->ppPins[0]);
         
         CoTaskMemFree(This->ppPins);




More information about the wine-cvs mailing list