Michael Stefaniuc : dsound: Aggregate IDirectSoundCapture8 instead of wrapping it.

Alexandre Julliard julliard at winehq.org
Thu Aug 16 15:26:11 CDT 2012


Module: wine
Branch: master
Commit: 0d33e204d1016c317f656c627a2c4537d1d9e315
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0d33e204d1016c317f656c627a2c4537d1d9e315

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Thu Aug 16 01:50:27 2012 +0200

dsound: Aggregate IDirectSoundCapture8 instead of wrapping it.

---

 dlls/dsound/duplex.c |  172 ++++++++------------------------------------------
 1 files changed, 26 insertions(+), 146 deletions(-)

diff --git a/dlls/dsound/duplex.c b/dlls/dsound/duplex.c
index c521486..5e57bbd 100644
--- a/dlls/dsound/duplex.c
+++ b/dlls/dsound/duplex.c
@@ -46,27 +46,24 @@ typedef struct IDirectSoundFullDuplexImpl
     IDirectSoundFullDuplex IDirectSoundFullDuplex_iface;
     LONG                   ref, refdsfd, numIfaces;
     IUnknown              *ds8_unk;     /* Aggregated IDirectSound8 */
-    IDirectSoundCapture              *capture_device;
-    LPDIRECTSOUNDCAPTURE              pDSC;
+    IUnknown              *dsc8_unk;    /* Aggregated IDirectSoundCapture8 */
 } IDirectSoundFullDuplexImpl;
 
-typedef struct IDirectSoundFullDuplex_IDirectSoundCapture {
-    const IDirectSoundCaptureVtbl *lpVtbl;
-    LONG                           ref;
-    IDirectSoundFullDuplexImpl    *pdsfd;
-} IDirectSoundFullDuplex_IDirectSoundCapture;
-
 static void fullduplex_destroy(IDirectSoundFullDuplexImpl *This)
 {
     IDirectSound8 *ds8;
+    IDirectSoundCapture8 *dsc8;
 
-    if (This->capture_device)
-        IDirectSoundCapture_Release(This->capture_device);
     if (This->ds8_unk) {
         IUnknown_QueryInterface(This->ds8_unk, &IID_IDirectSound8, (void**)&ds8);
         while(IDirectSound8_Release(ds8) > 0);
         IUnknown_Release(This->ds8_unk);
     }
+    if (This->dsc8_unk) {
+        IUnknown_QueryInterface(This->dsc8_unk, &IID_IDirectSoundCapture8, (void**)&dsc8);
+        while(IDirectSoundCapture_Release(dsc8) > 0);
+        IUnknown_Release(This->dsc8_unk);
+    }
     HeapFree(GetProcessHeap(), 0, This);
     TRACE("(%p) released\n", This);
 }
@@ -117,120 +114,6 @@ static const IUnknownVtbl unk_vtbl =
     IUnknownImpl_Release
 };
 
-/*******************************************************************************
- * IDirectSoundFullDuplex_IDirectSoundCapture
- */
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_QueryInterface(
-    LPDIRECTSOUNDCAPTURE iface,
-    REFIID riid,
-    LPVOID * ppobj)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
-    TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-    return IDirectSoundFullDuplex_QueryInterface(&This->pdsfd->IDirectSoundFullDuplex_iface, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_AddRef(
-    LPDIRECTSOUNDCAPTURE iface)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
-    ULONG ref = InterlockedIncrement(&(This->ref));
-    TRACE("(%p) ref was %d\n", This, ref - 1);
-    return ref;
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_Release(
-    LPDIRECTSOUNDCAPTURE iface)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
-    ULONG ref = InterlockedDecrement(&(This->ref));
-    TRACE("(%p) ref was %d\n", This, ref + 1);
-    if (!ref) {
-        This->pdsfd->pDSC = NULL;
-        HeapFree(GetProcessHeap(), 0, This);
-        TRACE("(%p) released\n", This);
-    }
-    return ref;
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_CreateCaptureBuffer(
-    LPDIRECTSOUNDCAPTURE iface,
-    LPCDSCBUFFERDESC lpcDSCBufferDesc,
-    LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
-    LPUNKNOWN pUnk)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
-    TRACE("(%p,%p,%p,%p)\n",This,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
-    return IDirectSoundCapture_CreateCaptureBuffer(This->pdsfd->capture_device,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_GetCaps(
-    LPDIRECTSOUNDCAPTURE iface,
-    LPDSCCAPS lpDSCCaps)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
-    TRACE("(%p,%p)\n",This,lpDSCCaps);
-    return IDirectSoundCapture_GetCaps(This->pdsfd->capture_device, lpDSCCaps);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_Initialize(
-    LPDIRECTSOUNDCAPTURE iface,
-    LPCGUID lpcGUID)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
-    TRACE("(%p, %s)\n", This, debugstr_guid(lpcGUID));
-    return IDirectSoundCapture_Initialize(This->pdsfd->capture_device,lpcGUID);
-}
-
-static const IDirectSoundCaptureVtbl DirectSoundFullDuplex_DirectSoundCapture_Vtbl =
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture_QueryInterface,
-    IDirectSoundFullDuplex_IDirectSoundCapture_AddRef,
-    IDirectSoundFullDuplex_IDirectSoundCapture_Release,
-    IDirectSoundFullDuplex_IDirectSoundCapture_CreateCaptureBuffer,
-    IDirectSoundFullDuplex_IDirectSoundCapture_GetCaps,
-    IDirectSoundFullDuplex_IDirectSoundCapture_Initialize
-};
-
-static HRESULT IDirectSoundFullDuplex_IDirectSoundCapture_Create(
-    IDirectSoundFullDuplexImpl *pdsfd,
-    LPDIRECTSOUNDCAPTURE8 * ppdsc8)
-{
-    IDirectSoundFullDuplex_IDirectSoundCapture * pdsfddsc;
-    TRACE("(%p,%p)\n",pdsfd,ppdsc8);
-
-    if (pdsfd == NULL) {
-        ERR("invalid parameter: pdsfd == NULL\n");
-        return DSERR_INVALIDPARAM;
-    }
-
-    if (ppdsc8 == NULL) {
-        ERR("invalid parameter: ppdsc8 == NULL\n");
-        return DSERR_INVALIDPARAM;
-    }
-
-    if (pdsfd->capture_device == NULL) {
-        WARN("not initialized\n");
-        *ppdsc8 = NULL;
-        return DSERR_UNINITIALIZED;
-    }
-
-    pdsfddsc = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsfddsc));
-    if (pdsfddsc == NULL) {
-        WARN("out of memory\n");
-        *ppdsc8 = NULL;
-        return DSERR_OUTOFMEMORY;
-    }
-
-    pdsfddsc->lpVtbl = &DirectSoundFullDuplex_DirectSoundCapture_Vtbl;
-    pdsfddsc->ref = 0;
-    pdsfddsc->pdsfd = pdsfd;
-
-    *ppdsc8 = (LPDIRECTSOUNDCAPTURE)pdsfddsc;
-
-    return DS_OK;
-}
-
 /***************************************************************************
  * IDirectSoundFullDuplex implementation
  */
@@ -275,18 +158,8 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_QueryInterface(IDirectSoundFull
     } else if (This->ds8_unk && (IsEqualIID(riid, &IID_IDirectSound) ||
                                  IsEqualIID(riid, &IID_IDirectSound8))) {
         return IUnknown_QueryInterface(This->ds8_unk, riid, ppv);
-    } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) {
-        if (!This->pDSC) {
-            IDirectSoundFullDuplex_IDirectSoundCapture_Create(This, &This->pDSC);
-            if (!This->pDSC) {
-                WARN("IDirectSoundFullDuplex_IDirectSoundCapture_Create() failed\n");
-                *ppv = NULL;
-                return E_NOINTERFACE;
-            }
-        }
-        IDirectSoundFullDuplex_IDirectSoundCapture_AddRef(This->pDSC);
-        *ppv = This->pDSC;
-        return S_OK;
+    } else if (This->dsc8_unk && IsEqualIID(riid, &IID_IDirectSoundCapture)) {
+        return IUnknown_QueryInterface(This->dsc8_unk, riid, ppv);
     }
 
     return E_NOINTERFACE;
@@ -311,6 +184,7 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize(IDirectSoundFullDupl
 {
     IDirectSoundFullDuplexImpl *This = impl_from_IDirectSoundFullDuplex(iface);
     IDirectSound8 *ds8 = NULL;
+    IDirectSoundCapture8 *dsc8 = NULL;
     HRESULT hr;
 
     TRACE("(%p,%s,%s,%p,%p,%p,%x,%p,%p)\n", This, debugstr_guid(capture_dev),
@@ -322,7 +196,7 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize(IDirectSoundFullDupl
     *dscb8 = NULL;
     *dsb8 = NULL;
 
-    if (This->ds8_unk || This->capture_device != NULL) {
+    if (This->ds8_unk || This->dsc8_unk) {
         WARN("already initialized\n");
         return DSERR_ALREADYINITIALIZED;
     }
@@ -346,22 +220,26 @@ static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize(IDirectSoundFullDupl
         goto error;
     }
 
-    hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture8, (void**)&This->capture_device);
-    if (SUCCEEDED(hr))
-        hr = IDirectSoundCapture_Initialize(This->capture_device, capture_dev);
+    hr = IDirectSoundCaptureImpl_Create(&This->IUnknown_iface, &IID_IUnknown,
+            (void**)&This->dsc8_unk, TRUE);
+    if (SUCCEEDED(hr)) {
+        IUnknown_QueryInterface(This->dsc8_unk, &IID_IDirectSoundCapture8, (void**)&dsc8);
+        hr = IDirectSoundCapture_Initialize(dsc8, capture_dev);
+    }
     if (hr != DS_OK) {
-        WARN("DirectSoundCaptureDevice_Initialize() failed\n");
+        WARN("Creating/initializing IDirectSoundCapture8 failed\n");
         goto error;
     }
 
-    hr = IDirectSoundCapture_CreateCaptureBuffer(This->capture_device, cbufdesc,
+    hr = IDirectSoundCapture_CreateCaptureBuffer(dsc8, cbufdesc,
             (IDirectSoundCaptureBuffer**)dscb8, NULL);
     if (hr != DS_OK) {
-        WARN("IDirectSoundCaptureBufferImpl_Create() failed\n");
+        WARN("IDirectSoundCapture_CreateCaptureBuffer() failed\n");
         goto error;
     }
 
     IDirectSound8_Release(ds8);
+    IDirectSoundCapture_Release(dsc8);
     return DS_OK;
 
 error:
@@ -379,9 +257,11 @@ error:
         IDirectSoundCaptureBuffer8_Release(*dscb8);
         *dscb8 = NULL;
     }
-    if (This->capture_device) {
-        IDirectSoundCapture_Release(This->capture_device);
-        This->capture_device = NULL;
+    if (dsc8)
+        IDirectSoundCapture_Release(dsc8);
+    if (This->dsc8_unk) {
+        IUnknown_Release(This->dsc8_unk);
+        This->dsc8_unk = NULL;
     }
     return hr;
 }




More information about the wine-cvs mailing list