From 6692f97e01b6c06c247f11e51b327f9ca4b277c0 Mon Sep 17 00:00:00 2001 From: Michael Stefaniuc Date: Thu, 16 Aug 2012 01:40:59 +0200 Subject: [PATCH] dsound: Add an object refcount for DirectSoundFullDuplex. --- dlls/dsound/duplex.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/dlls/dsound/duplex.c b/dlls/dsound/duplex.c index c9f08c4ff66..0e9320a10aa 100644 --- a/dlls/dsound/duplex.c +++ b/dlls/dsound/duplex.c @@ -43,8 +43,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dsound); typedef struct IDirectSoundFullDuplexImpl { IDirectSoundFullDuplex IDirectSoundFullDuplex_iface; - LONG ref; - + LONG ref, numIfaces; /* IDirectSoundFullDuplexImpl fields */ IDirectSound8 *renderer_device; IDirectSoundCapture *capture_device; @@ -72,6 +71,16 @@ typedef struct IDirectSoundFullDuplex_IDirectSoundCapture { IDirectSoundFullDuplexImpl *pdsfd; } IDirectSoundFullDuplex_IDirectSoundCapture; +static void fullduplex_destroy(IDirectSoundFullDuplexImpl *This) +{ + if (This->capture_device) + IDirectSoundCapture_Release(This->capture_device); + if (This->renderer_device) + IDirectSound_Release(This->renderer_device); + HeapFree(GetProcessHeap(), 0, This); + TRACE("(%p) released\n", This); +} + /******************************************************************************* * IUnknown */ @@ -449,7 +458,11 @@ static ULONG WINAPI IDirectSoundFullDuplexImpl_AddRef(IDirectSoundFullDuplex *if { IDirectSoundFullDuplexImpl *This = impl_from_IDirectSoundFullDuplex(iface); ULONG ref = InterlockedIncrement(&(This->ref)); - TRACE("(%p) ref was %d\n", This, ref - 1); + + TRACE("(%p) ref=%d\n", This, ref); + + if(ref == 1) + InterlockedIncrement(&This->numIfaces); return ref; } @@ -516,16 +529,11 @@ static ULONG WINAPI IDirectSoundFullDuplexImpl_Release(IDirectSoundFullDuplex *i { IDirectSoundFullDuplexImpl *This = impl_from_IDirectSoundFullDuplex(iface); ULONG ref = InterlockedDecrement(&(This->ref)); - TRACE("(%p) ref was %d\n", This, ref - 1); - if (!ref) { - if (This->capture_device) - IDirectSoundCapture_Release(This->capture_device); - if (This->renderer_device) - IDirectSound_Release(This->renderer_device); - HeapFree( GetProcessHeap(), 0, This ); - TRACE("(%p) released\n", This); - } + TRACE("(%p) ref=%d\n", This, ref); + + if (!ref && !InterlockedDecrement(&This->numIfaces)) + fullduplex_destroy(This); return ref; } @@ -634,6 +642,7 @@ HRESULT DSOUND_FullDuplexCreate(REFIID riid, void **ppv) obj->IDirectSoundFullDuplex_iface.lpVtbl = &dsfd_vtbl; obj->ref = 1; + obj->numIfaces = 1; hr = IUnknown_QueryInterface((IUnknown*)obj, riid, ppv); IUnknown_Release((IUnknown*)obj);