Michael Stefaniuc : dsound: Add an object refcount for DirectSoundFullDuplex.
Alexandre Julliard
julliard at winehq.org
Thu Aug 16 15:26:11 CDT 2012
Module: wine
Branch: master
Commit: 6692f97e01b6c06c247f11e51b327f9ca4b277c0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6692f97e01b6c06c247f11e51b327f9ca4b277c0
Author: Michael Stefaniuc <mstefani at 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);
More information about the wine-cvs
mailing list