[PATCH 4/4] dsound: Kill SecondaryBufferImpl with prejudice!

Michael Stefaniuc mstefani at redhat.de
Tue Aug 23 19:32:13 CDT 2011


IDirectSoundBuffer and IDirectSoundBuffer8 use the exact same
implementation and there is no need for an extra refcount.
---
 dlls/dsound/buffer.c         |  328 +-----------------------------------------
 dlls/dsound/dsound.c         |   30 ++---
 dlls/dsound/dsound_private.h |   16 --
 dlls/dsound/sound3d.c        |    2 -
 4 files changed, 14 insertions(+), 362 deletions(-)

diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 2ba8def..7399015 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -37,8 +37,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(dsound);
 
-static HRESULT SecondaryBufferImpl_Destroy(SecondaryBufferImpl *pdsb);
-
 /*******************************************************************************
  *		IDirectSoundNotify
  */
@@ -865,15 +863,9 @@ static HRESULT WINAPI IDirectSoundBufferImpl_QueryInterface(IDirectSoundBuffer8
 	if ( IsEqualGUID(riid, &IID_IUnknown) ||
 	     IsEqualGUID(riid, &IID_IDirectSoundBuffer) ||
 	     IsEqualGUID(riid, &IID_IDirectSoundBuffer8) ) {
-		if (!This->secondary)
-			SecondaryBufferImpl_Create(This, &(This->secondary));
-		if (This->secondary) {
-			IDirectSoundBuffer8_AddRef((LPDIRECTSOUNDBUFFER8)This->secondary);
-			*ppobj = This->secondary;
-			return S_OK;
-		}
-		WARN("IID_IDirectSoundBuffer\n");
-		return E_NOINTERFACE;
+                IDirectSoundBuffer8_AddRef(iface);
+                *ppobj = iface;
+                return S_OK;
 	}
 
 	if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {
@@ -978,8 +970,7 @@ HRESULT IDirectSoundBufferImpl_Create(
 
 	TRACE("Created buffer at %p\n", dsb);
 
-	dsb->ref = 0;
-	dsb->secondary = 0;
+        dsb->ref = 1;
 	dsb->device = device;
         dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt;
 	dsb->iks = NULL;
@@ -1159,12 +1150,6 @@ HRESULT IDirectSoundBufferImpl_Destroy(
         pdsb->notify = NULL;
     }
 
-    if (pdsb->secondary) {
-        WARN("dsb not NULL\n");
-        SecondaryBufferImpl_Destroy(pdsb->secondary);
-        pdsb->secondary = NULL;
-    }
-
     while (IDirectSoundBuffer8_Release(&pdsb->IDirectSoundBuffer8_iface) > 0);
 
     return S_OK;
@@ -1210,7 +1195,7 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
 
     dsb->buffer->ref++;
     list_add_head(&dsb->buffer->buffers, &dsb->entry);
-    dsb->ref = 0;
+    dsb->ref = 1;
     dsb->state = STATE_STOPPED;
     dsb->buf_mixpos = dsb->sec_mixpos = 0;
     dsb->notify = NULL;
@@ -1219,7 +1204,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
     dsb->device = device;
     dsb->ds3db = NULL;
     dsb->iks = NULL; /* FIXME? */
-    dsb->secondary = NULL;
     dsb->tmp_buffer = NULL;
     DSOUND_RecalcFormat(dsb);
     DSOUND_MixToTemporary(dsb, 0, dsb->buflen, FALSE);
@@ -1243,308 +1227,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
 }
 
 /*******************************************************************************
- *		SecondaryBuffer
- */
-
-static HRESULT WINAPI SecondaryBufferImpl_QueryInterface(
-	LPDIRECTSOUNDBUFFER8 iface,REFIID riid,LPVOID *ppobj)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
-	return IDirectSoundBufferImpl_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb,riid,ppobj);
-}
-
-static ULONG WINAPI SecondaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER8 iface)
-{
-    SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-    ULONG ref = InterlockedIncrement(&(This->ref));
-    TRACE("(%p) ref was %d\n", This, ref - 1);
-    return ref;
-}
-
-static ULONG WINAPI SecondaryBufferImpl_Release(LPDIRECTSOUNDBUFFER8 iface)
-{
-    SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-    ULONG ref;
-    TRACE("(%p)\n", This);
-    ref = InterlockedDecrement(&(This->ref));
-    TRACE("ref was %d\n", ref + 1);
-
-    if (!ref) {
-        This->dsb->secondary = NULL;
-        IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)This->dsb);
-        HeapFree(GetProcessHeap(), 0, This);
-        TRACE("(%p) released\n", This);
-    }
-    return ref;
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetCaps(
-	LPDIRECTSOUNDBUFFER8 iface,LPDSBCAPS caps)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-  	TRACE("(%p)->(%p)\n",This,caps);
-
-	return IDirectSoundBufferImpl_GetCaps((LPDIRECTSOUNDBUFFER8)This->dsb,caps);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetCurrentPosition(
-	LPDIRECTSOUNDBUFFER8 iface,LPDWORD playpos,LPDWORD writepos)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p,%p)\n",This,playpos,writepos);
-
-	return IDirectSoundBufferImpl_GetCurrentPosition((LPDIRECTSOUNDBUFFER8)This->dsb,playpos,writepos);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetFormat(
-	LPDIRECTSOUNDBUFFER8 iface,LPWAVEFORMATEX lpwf,DWORD wfsize,LPDWORD wfwritten)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p,%d,%p)\n",This,lpwf,wfsize,wfwritten);
-
-	return IDirectSoundBufferImpl_GetFormat((LPDIRECTSOUNDBUFFER8)This->dsb,lpwf,wfsize,wfwritten);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetVolume(
-	LPDIRECTSOUNDBUFFER8 iface,LPLONG vol)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p)\n",This,vol);
-
-	return IDirectSoundBufferImpl_GetVolume((LPDIRECTSOUNDBUFFER8)This->dsb,vol);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetPan(
-	LPDIRECTSOUNDBUFFER8 iface,LPLONG pan)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p)\n",This,pan);
-
-	return IDirectSoundBufferImpl_GetPan((LPDIRECTSOUNDBUFFER8)This->dsb,pan);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetFrequency(
-	LPDIRECTSOUNDBUFFER8 iface,LPDWORD freq)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p)\n",This,freq);
-
-	return IDirectSoundBufferImpl_GetFrequency((LPDIRECTSOUNDBUFFER8)This->dsb,freq);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetStatus(
-	LPDIRECTSOUNDBUFFER8 iface,LPDWORD status)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p)\n",This,status);
-
-	return IDirectSoundBufferImpl_GetStatus((LPDIRECTSOUNDBUFFER8)This->dsb,status);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Initialize(
-	LPDIRECTSOUNDBUFFER8 iface,LPDIRECTSOUND dsound,LPCDSBUFFERDESC dbsd)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p,%p)\n",This,dsound,dbsd);
-
-	return IDirectSoundBufferImpl_Initialize((LPDIRECTSOUNDBUFFER8)This->dsb,dsound,dbsd);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Lock(
-    LPDIRECTSOUNDBUFFER8 iface,
-    DWORD writecursor,
-    DWORD writebytes,
-    LPVOID *lplpaudioptr1,
-    LPDWORD audiobytes1,
-    LPVOID *lplpaudioptr2,
-    LPDWORD audiobytes2,
-    DWORD dwFlags)
-{
-    SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-    TRACE("(%p,%d,%d,%p,%p,%p,%p,0x%08x)\n",
-        This,writecursor,writebytes,lplpaudioptr1,audiobytes1,lplpaudioptr2,audiobytes2,dwFlags);
-
-    return IDirectSoundBufferImpl_Lock((LPDIRECTSOUNDBUFFER8)This->dsb,
-        writecursor,writebytes,lplpaudioptr1,audiobytes1,lplpaudioptr2,audiobytes2,dwFlags);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Play(
-	LPDIRECTSOUNDBUFFER8 iface,DWORD reserved1,DWORD reserved2,DWORD flags)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%08x,%08x,%08x)\n",This,reserved1,reserved2,flags);
-
-	return IDirectSoundBufferImpl_Play((LPDIRECTSOUNDBUFFER8)This->dsb,reserved1,reserved2,flags);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetCurrentPosition(
-	LPDIRECTSOUNDBUFFER8 iface,DWORD newpos)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%d)\n",This,newpos);
-
-	return IDirectSoundBufferImpl_SetCurrentPosition((LPDIRECTSOUNDBUFFER8)This->dsb,newpos);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetFormat(
-	LPDIRECTSOUNDBUFFER8 iface,LPCWAVEFORMATEX wfex)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%p)\n",This,wfex);
-
-	return IDirectSoundBufferImpl_SetFormat((LPDIRECTSOUNDBUFFER8)This->dsb,wfex);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetVolume(
-	LPDIRECTSOUNDBUFFER8 iface,LONG vol)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%d)\n",This,vol);
-
-	return IDirectSoundBufferImpl_SetVolume((LPDIRECTSOUNDBUFFER8)This->dsb,vol);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetPan(
-	LPDIRECTSOUNDBUFFER8 iface,LONG pan)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%d)\n",This,pan);
-
-	return IDirectSoundBufferImpl_SetPan((LPDIRECTSOUNDBUFFER8)This->dsb,pan);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetFrequency(
-	LPDIRECTSOUNDBUFFER8 iface,DWORD freq)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%d)\n",This,freq);
-
-	return IDirectSoundBufferImpl_SetFrequency((LPDIRECTSOUNDBUFFER8)This->dsb,freq);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Stop(LPDIRECTSOUNDBUFFER8 iface)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p)\n",This);
-
-	return IDirectSoundBufferImpl_Stop((LPDIRECTSOUNDBUFFER8)This->dsb);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Unlock(
-    LPDIRECTSOUNDBUFFER8 iface,
-    LPVOID lpvAudioPtr1,
-    DWORD dwAudioBytes1,
-    LPVOID lpvAudioPtr2,
-    DWORD dwAudioBytes2)
-{
-    SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-    TRACE("(%p,%p,%d,%p,%d)\n",
-        This, lpvAudioPtr1, dwAudioBytes1, lpvAudioPtr2, dwAudioBytes2);
-
-    return IDirectSoundBufferImpl_Unlock((LPDIRECTSOUNDBUFFER8)This->dsb,
-        lpvAudioPtr1,dwAudioBytes1,lpvAudioPtr2,dwAudioBytes2);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Restore(
-	LPDIRECTSOUNDBUFFER8 iface)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p)\n",This);
-
-	return IDirectSoundBufferImpl_Restore((LPDIRECTSOUNDBUFFER8)This->dsb);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetFX(
-	LPDIRECTSOUNDBUFFER8 iface,DWORD dwEffectsCount,LPDSEFFECTDESC pDSFXDesc,LPDWORD pdwResultCodes)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%u,%p,%p)\n",This,dwEffectsCount,pDSFXDesc,pdwResultCodes);
-
-	return IDirectSoundBufferImpl_SetFX((LPDIRECTSOUNDBUFFER8)This->dsb,dwEffectsCount,pDSFXDesc,pdwResultCodes);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_AcquireResources(
-	LPDIRECTSOUNDBUFFER8 iface,DWORD dwFlags,DWORD dwEffectsCount,LPDWORD pdwResultCodes)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%08u,%u,%p)\n",This,dwFlags,dwEffectsCount,pdwResultCodes);
-
-	return IDirectSoundBufferImpl_AcquireResources((LPDIRECTSOUNDBUFFER8)This->dsb,dwFlags,dwEffectsCount,pdwResultCodes);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetObjectInPath(
-	LPDIRECTSOUNDBUFFER8 iface,REFGUID rguidObject,DWORD dwIndex,REFGUID rguidInterface,LPVOID* ppObject)
-{
-	SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
-	TRACE("(%p,%s,%u,%s,%p)\n",This,debugstr_guid(rguidObject),dwIndex,debugstr_guid(rguidInterface),ppObject);
-
-	return IDirectSoundBufferImpl_GetObjectInPath((LPDIRECTSOUNDBUFFER8)This->dsb,rguidObject,dwIndex,rguidInterface,ppObject);
-}
-
-static const IDirectSoundBuffer8Vtbl sbvt =
-{
-	SecondaryBufferImpl_QueryInterface,
-	SecondaryBufferImpl_AddRef,
-	SecondaryBufferImpl_Release,
-	SecondaryBufferImpl_GetCaps,
-	SecondaryBufferImpl_GetCurrentPosition,
-	SecondaryBufferImpl_GetFormat,
-	SecondaryBufferImpl_GetVolume,
-	SecondaryBufferImpl_GetPan,
-	SecondaryBufferImpl_GetFrequency,
-	SecondaryBufferImpl_GetStatus,
-	SecondaryBufferImpl_Initialize,
-	SecondaryBufferImpl_Lock,
-	SecondaryBufferImpl_Play,
-	SecondaryBufferImpl_SetCurrentPosition,
-	SecondaryBufferImpl_SetFormat,
-	SecondaryBufferImpl_SetVolume,
-	SecondaryBufferImpl_SetPan,
-	SecondaryBufferImpl_SetFrequency,
-	SecondaryBufferImpl_Stop,
-	SecondaryBufferImpl_Unlock,
-	SecondaryBufferImpl_Restore,
-	SecondaryBufferImpl_SetFX,
-	SecondaryBufferImpl_AcquireResources,
-	SecondaryBufferImpl_GetObjectInPath
-};
-
-HRESULT SecondaryBufferImpl_Create(
-	IDirectSoundBufferImpl *dsb,
-	SecondaryBufferImpl **psb)
-{
-	SecondaryBufferImpl *sb;
-	TRACE("(%p,%p)\n",dsb,psb);
-
-	sb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*sb));
-
-	if (sb == 0) {
-		WARN("out of memory\n");
-		*psb = NULL;
-		return DSERR_OUTOFMEMORY;
-	}
-	sb->ref = 0;
-	sb->dsb = dsb;
-	sb->lpVtbl = &sbvt;
-
-	IDirectSoundBuffer8_AddRef((LPDIRECTSOUNDBUFFER8)dsb);
-	*psb = sb;
-	return S_OK;
-}
-
-static HRESULT SecondaryBufferImpl_Destroy(
-    SecondaryBufferImpl *pdsb)
-{
-    TRACE("(%p)\n",pdsb);
-
-    while (SecondaryBufferImpl_Release((LPDIRECTSOUNDBUFFER8)pdsb) > 0);
-
-    return S_OK;
-}
-
-/*******************************************************************************
  *              IKsBufferPropertySet
  */
 
diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c
index c565d98..1c80ee3 100644
--- a/dlls/dsound/dsound.c
+++ b/dlls/dsound/dsound.c
@@ -1630,15 +1630,10 @@ HRESULT DirectSoundDevice_CreateSoundBuffer(
         }
 
         hres = IDirectSoundBufferImpl_Create(device, &dsb, dsbd);
-        if (dsb) {
-            hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
-            if (*ppdsb) {
-                dsb->secondary = (SecondaryBufferImpl*)*ppdsb;
-                IDirectSoundBuffer_AddRef(*ppdsb);
-            } else
-                WARN("SecondaryBufferImpl_Create failed\n");
-        } else
-           WARN("IDirectSoundBufferImpl_Create failed\n");
+        if (dsb)
+            *ppdsb = (IDirectSoundBuffer*)&dsb->IDirectSoundBuffer8_iface;
+        else
+            WARN("IDirectSoundBufferImpl_Create failed\n");
    }
 
    return hres;
@@ -1676,18 +1671,11 @@ HRESULT DirectSoundDevice_DuplicateSoundBuffer(
     }
 
     /* duplicate the actual buffer implementation */
-    hres = IDirectSoundBufferImpl_Duplicate(device, &dsb,
-                                           ((SecondaryBufferImpl *)psb)->dsb);
-
-    if (hres == DS_OK) {
-        /* create a new secondary buffer using the new implementation */
-        hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
-        if (*ppdsb) {
-            dsb->secondary = (SecondaryBufferImpl*)*ppdsb;
-            IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)*ppdsb);
-        } else
-            WARN("SecondaryBufferImpl_Create failed\n");
-    }
+    hres = IDirectSoundBufferImpl_Duplicate(device, &dsb, (IDirectSoundBufferImpl*)psb);
+    if (hres == DS_OK)
+        *ppdsb = (IDirectSoundBuffer*)&dsb->IDirectSoundBuffer8_iface;
+    else
+        WARN("IDirectSoundBufferImpl_Duplicate failed\n");
 
     return hres;
 }
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index b552b1a..fb02495 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -58,7 +58,6 @@ typedef struct IDirectSound3DListenerImpl    IDirectSound3DListenerImpl;
 typedef struct IDirectSound3DBufferImpl      IDirectSound3DBufferImpl;
 typedef struct IKsBufferPropertySetImpl      IKsBufferPropertySetImpl;
 typedef struct PrimaryBufferImpl             PrimaryBufferImpl;
-typedef struct SecondaryBufferImpl           SecondaryBufferImpl;
 typedef struct DirectSoundDevice             DirectSoundDevice;
 typedef struct DirectSoundCaptureDevice      DirectSoundCaptureDevice;
 
@@ -162,7 +161,6 @@ struct IDirectSoundBufferImpl
     IDirectSoundBuffer8         IDirectSoundBuffer8_iface;
     LONG                        ref;
     /* IDirectSoundBufferImpl fields */
-    SecondaryBufferImpl*        secondary;
     DirectSoundDevice*          device;
     RTL_RWLOCK                  lock;
     PIDSDRIVERBUFFER            hwbuf;
@@ -210,20 +208,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
     IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
 
 /*****************************************************************************
- * SecondaryBuffer implementation structure
- */
-struct SecondaryBufferImpl
-{
-    const IDirectSoundBuffer8Vtbl *lpVtbl;
-    LONG                        ref;
-    IDirectSoundBufferImpl*     dsb;
-};
-
-HRESULT SecondaryBufferImpl_Create(
-    IDirectSoundBufferImpl *dsb,
-    SecondaryBufferImpl **pdsb) DECLSPEC_HIDDEN;
-
-/*****************************************************************************
  * PrimaryBuffer implementation structure
  */
 struct PrimaryBufferImpl
diff --git a/dlls/dsound/sound3d.c b/dlls/dsound/sound3d.c
index 5a0befd..956013d 100644
--- a/dlls/dsound/sound3d.c
+++ b/dlls/dsound/sound3d.c
@@ -710,8 +710,6 @@ HRESULT IDirectSound3DBufferImpl_Create(
 
 	ds3db->dsb->ds3db_need_recalc = TRUE;
 
-	IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)dsb);
-
 	*pds3db = ds3db;
 	return S_OK;
 }
-- 
1.7.6



More information about the wine-patches mailing list