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