Module: wine Branch: master Commit: 6692f97e01b6c06c247f11e51b327f9ca4b277c0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6692f97e01b6c06c247f11e51b...
Author: Michael Stefaniuc mstefani@redhat.de Date: Thu Aug 16 01:40:59 2012 +0200
dsound: Add an object refcount for DirectSoundFullDuplex.
---
dlls/dsound/duplex.c | 33 +++++++++++++++++++++------------ 1 files changed, 21 insertions(+), 12 deletions(-)
diff --git a/dlls/dsound/duplex.c b/dlls/dsound/duplex.c index c9f08c4..0e9320a 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);