Module: wine Branch: master Commit: 809f68420f5332594cd3da60ada4351e34c6a855 URL: http://source.winehq.org/git/wine.git/?a=commit;h=809f68420f5332594cd3da60ad...
Author: Chris Robinson chris.kcat@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);