quartz: Force disconnect when a filter is fully released
Chris Robinson
chris.kcat at gmail.com
Tue Mar 13 13:01:18 CDT 2007
-------------- next part --------------
From 09a9e6caa240f2e1307eb9b85101153b57719ba7 Mon Sep 17 00:00:00 2001
From: Chris Robinson <chris.kcat at gmail.com>
Date: Tue, 13 Mar 2007 10:47:47 -0700
Subject: [PATCH] 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);
--
1.4.4.4
More information about the wine-patches
mailing list