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