[PATCH 4/8] dsound: Merge IDirectSoundNotify into the capture buffer object.

Michael Stefaniuc mstefani at redhat.de
Wed Jan 11 17:19:48 CST 2012


---
 dlls/dsound/capture.c        |  122 ++++++++++++++----------------------------
 dlls/dsound/dsound_private.h |    8 +--
 2 files changed, 44 insertions(+), 86 deletions(-)

diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
index 8e6c77d..29d34dc 100644
--- a/dlls/dsound/capture.c
+++ b/dlls/dsound/capture.c
@@ -64,69 +64,59 @@ static void capturebuffer_destroy(IDirectSoundCaptureBufferImpl *This)
     /* remove from DirectSoundCaptureDevice */
     This->device->capture_buffer = NULL;
 
-    if (This->notify)
-        IDirectSoundNotify_Release((LPDIRECTSOUNDNOTIFY)This->notify);
-
     HeapFree(GetProcessHeap(), 0, This->notifies);
     HeapFree(GetProcessHeap(), 0, This);
     TRACE("(%p) released\n", This);
 }
 
-/*****************************************************************************
- * IDirectSoundCaptureNotify implementation structure
- */
-struct IDirectSoundCaptureNotifyImpl
-{
-    /* IUnknown fields */
-    const IDirectSoundNotifyVtbl       *lpVtbl;
-    LONG                                ref;
-    IDirectSoundCaptureBufferImpl*      dscb;
-};
-
 /*******************************************************************************
  * IDirectSoundNotify
  */
+static inline struct IDirectSoundCaptureBufferImpl *impl_from_IDirectSoundNotify(IDirectSoundNotify *iface)
+{
+    return CONTAINING_RECORD(iface, IDirectSoundCaptureBufferImpl, IDirectSoundNotify_iface);
+}
+
 static HRESULT WINAPI IDirectSoundNotifyImpl_QueryInterface(IDirectSoundNotify *iface, REFIID riid,
         void **ppobj)
 {
-    IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
-    TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+    IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundNotify(iface);
 
-    if (This->dscb == NULL) {
-	WARN("invalid parameter\n");
-	return E_INVALIDARG;
-    }
+    TRACE("(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj);
 
-    return IDirectSoundCaptureBuffer_QueryInterface((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb, riid, ppobj);
+    return IDirectSoundCaptureBuffer_QueryInterface(&This->IDirectSoundCaptureBuffer8_iface, riid, ppobj);
 }
 
 static ULONG WINAPI IDirectSoundNotifyImpl_AddRef(IDirectSoundNotify *iface)
 {
-    IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
-    ULONG ref = InterlockedIncrement(&(This->ref));
+    IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundNotify(iface);
+    ULONG ref = InterlockedIncrement(&This->refn);
+
     TRACE("(%p) ref was %d\n", This, ref - 1);
+
+    if(ref == 1)
+        InterlockedIncrement(&This->numIfaces);
+
     return ref;
 }
 
 static ULONG WINAPI IDirectSoundNotifyImpl_Release(IDirectSoundNotify *iface)
 {
-    IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
-    ULONG ref = InterlockedDecrement(&(This->ref));
+    IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundNotify(iface);
+    ULONG ref = InterlockedDecrement(&This->refn);
+
     TRACE("(%p) ref was %d\n", This, ref + 1);
 
-    if (!ref) {
-	This->dscb->notify=NULL;
-	IDirectSoundCaptureBuffer_Release((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb);
-	HeapFree(GetProcessHeap(),0,This);
-	TRACE("(%p) released\n", This);
-    }
+    if (!ref && !InterlockedDecrement(&This->numIfaces))
+        capturebuffer_destroy(This);
+
     return ref;
 }
 
 static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions(IDirectSoundNotify *iface,
         DWORD howmuch, const DSBPOSITIONNOTIFY *notify)
 {
-    IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
+    IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundNotify(iface);
     TRACE("(%p,0x%08x,%p)\n",This,howmuch,notify);
 
     if (howmuch > 0 && notify == NULL) {
@@ -144,23 +134,23 @@ static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions(IDirectSou
     if (howmuch > 0) {
 	/* Make an internal copy of the caller-supplied array.
 	 * Replace the existing copy if one is already present. */
-	if (This->dscb->notifies)
-	    This->dscb->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-		This->dscb->notifies, howmuch * sizeof(DSBPOSITIONNOTIFY));
+        if (This->notifies)
+            This->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->notifies,
+                    howmuch * sizeof(DSBPOSITIONNOTIFY));
 	else
-	    This->dscb->notifies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-		howmuch * sizeof(DSBPOSITIONNOTIFY));
+            This->notifies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                    howmuch * sizeof(DSBPOSITIONNOTIFY));
 
-	if (This->dscb->notifies == NULL) {
+        if (!This->notifies) {
 	    WARN("out of memory\n");
 	    return DSERR_OUTOFMEMORY;
 	}
-	CopyMemory(This->dscb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
-	This->dscb->nrofnotifies = howmuch;
+        CopyMemory(This->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
+        This->nrofnotifies = howmuch;
     } else {
-        HeapFree(GetProcessHeap(), 0, This->dscb->notifies);
-        This->dscb->notifies = NULL;
-        This->dscb->nrofnotifies = 0;
+        HeapFree(GetProcessHeap(), 0, This->notifies);
+        This->notifies = NULL;
+        This->nrofnotifies = 0;
     }
 
     return S_OK;
@@ -174,30 +164,6 @@ static const IDirectSoundNotifyVtbl dscnvt =
     IDirectSoundNotifyImpl_SetNotificationPositions
 };
 
-static HRESULT IDirectSoundCaptureNotifyImpl_Create(
-    IDirectSoundCaptureBufferImpl *dscb,
-    IDirectSoundCaptureNotifyImpl **pdscn)
-{
-    IDirectSoundCaptureNotifyImpl * dscn;
-    TRACE("(%p,%p)\n",dscb,pdscn);
-
-    dscn = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dscn));
-
-    if (dscn == NULL) {
-	WARN("out of memory\n");
-	return DSERR_OUTOFMEMORY;
-    }
-
-    dscn->ref = 0;
-    dscn->lpVtbl = &dscnvt;
-    dscn->dscb = dscb;
-    dscb->notify = dscn;
-    IDirectSoundCaptureBuffer_AddRef((LPDIRECTSOUNDCAPTUREBUFFER)dscb);
-
-    *pdscn = dscn;
-    return DS_OK;
-}
-
 
 static const char * const captureStateString[] = {
     "STATE_STOPPED",
@@ -219,7 +185,6 @@ static HRESULT WINAPI IDirectSoundCaptureBufferImpl_QueryInterface(IDirectSoundC
         REFIID riid, void **ppobj)
 {
     IDirectSoundCaptureBufferImpl *This = impl_from_IDirectSoundCaptureBuffer8(iface);
-    HRESULT hres;
 
     TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
 
@@ -230,18 +195,6 @@ static HRESULT WINAPI IDirectSoundCaptureBufferImpl_QueryInterface(IDirectSoundC
 
     *ppobj = NULL;
 
-    if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {
-	if (!This->notify){
-	    hres = IDirectSoundCaptureNotifyImpl_Create(This, &This->notify);
-	    if(FAILED(hres))
-		return hres;
-	}
-
-        IDirectSoundNotify_AddRef((LPDIRECTSOUNDNOTIFY)This->notify);
-        *ppobj = This->notify;
-        return DS_OK;
-    }
-
     if ( IsEqualGUID( &IID_IDirectSoundCaptureBuffer, riid ) ||
          IsEqualGUID( &IID_IDirectSoundCaptureBuffer8, riid ) ) {
 	IDirectSoundCaptureBuffer8_AddRef(iface);
@@ -249,6 +202,12 @@ static HRESULT WINAPI IDirectSoundCaptureBufferImpl_QueryInterface(IDirectSoundC
         return S_OK;
     }
 
+    if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {
+        IDirectSoundNotify_AddRef(&This->IDirectSoundNotify_iface);
+        *ppobj = &This->IDirectSoundNotify_iface;
+        return S_OK;
+    }
+
     FIXME("(%p,%s,%p) unsupported GUID\n", This, debugstr_guid(riid), ppobj);
     return E_NOINTERFACE;
 }
@@ -707,9 +666,9 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
 
         This->numIfaces = 0;
         This->ref = 0;
+        This->refn = 0;
         This->device = device;
         This->device->capture_buffer = This;
-        This->notify = NULL;
         This->nrofnotifies = 0;
 
         This->pdscbd = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
@@ -724,6 +683,7 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
         }
 
         This->IDirectSoundCaptureBuffer8_iface.lpVtbl = &dscbvt;
+        This->IDirectSoundNotify_iface.lpVtbl = &dscnvt;
 
         err = IMMDevice_Activate(device->mmdevice, &IID_IAudioClient,
                 CLSCTX_INPROC_SERVER, NULL, (void**)&device->client);
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index 34419d1..da309a1 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -49,7 +49,6 @@ typedef struct IDirectSoundBufferImpl        IDirectSoundBufferImpl;
 typedef struct IDirectSoundCaptureImpl       IDirectSoundCaptureImpl;
 typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl;
 typedef struct IDirectSoundNotifyImpl        IDirectSoundNotifyImpl;
-typedef struct IDirectSoundCaptureNotifyImpl IDirectSoundCaptureNotifyImpl;
 typedef struct IDirectSound3DListenerImpl    IDirectSound3DListenerImpl;
 typedef struct IDirectSound3DBufferImpl      IDirectSound3DBufferImpl;
 typedef struct IKsBufferPropertySetImpl      IKsBufferPropertySetImpl;
@@ -248,15 +247,14 @@ struct DirectSoundCaptureDevice
 struct IDirectSoundCaptureBufferImpl
 {
     IDirectSoundCaptureBuffer8          IDirectSoundCaptureBuffer8_iface;
+    IDirectSoundNotify                  IDirectSoundNotify_iface;
     LONG                                numIfaces; /* "in use interfaces" refcount */
-    LONG                                ref;
+    LONG                                ref, refn;
     /* IDirectSoundCaptureBuffer fields */
     DirectSoundCaptureDevice*           device;
     LPDSCBUFFERDESC                     pdscbd;
     DWORD                               flags;
-
-    /* IDirectSoundCaptureNotifyImpl fields */
-    IDirectSoundCaptureNotifyImpl*      notify;
+    /* IDirectSoundNotify fields */
     LPDSBPOSITIONNOTIFY                 notifies;
     int                                 nrofnotifies;
 };
-- 
1.7.6.5



More information about the wine-patches mailing list