[PATCH 09/15] dsound: Add an object refcount for DirectSoundFullDuplex.

Michael Stefaniuc mstefani at redhat.de
Wed Aug 15 18:40:59 CDT 2012


---
 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);
-- 
1.7.6.5



More information about the wine-patches mailing list