[PATCH 1/5] dsound: Use the same struct for the primary buffer object as for the secondary.

Michael Stefaniuc mstefani at redhat.de
Tue Aug 30 18:11:29 CDT 2011


---
 dlls/dsound/dsound.c         |    6 ++--
 dlls/dsound/dsound_private.h |   20 ++----------
 dlls/dsound/primary.c        |   72 ++++++++++++++++++++++++++----------------
 dlls/dsound/sound3d.c        |    2 +-
 4 files changed, 52 insertions(+), 48 deletions(-)

diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c
index 1c80ee3..d830c39 100644
--- a/dlls/dsound/dsound.c
+++ b/dlls/dsound/dsound.c
@@ -1557,12 +1557,12 @@ HRESULT DirectSoundDevice_CreateSoundBuffer(
            if (device->hwbuf)
                device->dsbd.dwFlags |= DSBCAPS_LOCHARDWARE;
            else device->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE;
-           hres = PrimaryBufferImpl_Create(device, &(device->primary), &(device->dsbd));
+           hres = primarybuffer_create(device, &(device->primary), &(device->dsbd));
            if (device->primary) {
                IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(device->primary));
                *ppdsb = (LPDIRECTSOUNDBUFFER)(device->primary);
            } else
-               WARN("PrimaryBufferImpl_Create failed\n");
+               WARN("primarybuffer_create() failed\n");
         }
     } else {
         IDirectSoundBufferImpl * dsb;
@@ -1664,7 +1664,7 @@ HRESULT DirectSoundDevice_DuplicateSoundBuffer(
     }
 
     /* make sure we have a secondary buffer */
-    if ((PrimaryBufferImpl *)psb == device->primary) {
+    if (psb == (IDirectSoundBuffer *)&device->primary->IDirectSoundBuffer8_iface) {
         WARN("trying to duplicate primary buffer\n");
         *ppdsb = NULL;
         return DSERR_INVALIDCALL;
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index 1410a9c..e91fc35 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -57,7 +57,6 @@ typedef struct IDirectSoundCaptureNotifyImpl IDirectSoundCaptureNotifyImpl;
 typedef struct IDirectSound3DListenerImpl    IDirectSound3DListenerImpl;
 typedef struct IDirectSound3DBufferImpl      IDirectSound3DBufferImpl;
 typedef struct IKsBufferPropertySetImpl      IKsBufferPropertySetImpl;
-typedef struct PrimaryBufferImpl             PrimaryBufferImpl;
 typedef struct DirectSoundDevice             DirectSoundDevice;
 typedef struct DirectSoundCaptureDevice      DirectSoundCaptureDevice;
 
@@ -93,7 +92,7 @@ struct DirectSoundDevice
     IDirectSoundBufferImpl**    buffers;
     RTL_RWLOCK                  buffer_list_lock;
     CRITICAL_SECTION            mixlock;
-    PrimaryBufferImpl*          primary;
+    IDirectSoundBufferImpl     *primary;
     DSBUFFERDESC                dsbd;
     DWORD                       speaker_config;
     LPBYTE                      tmp_buffer, mix_buffer;
@@ -210,21 +209,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
 void secondarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
 
 /*****************************************************************************
- * PrimaryBuffer implementation structure
- */
-struct PrimaryBufferImpl
-{
-    const IDirectSoundBufferVtbl *lpVtbl;
-    LONG                        ref;
-    DirectSoundDevice*          device;
-};
-
-HRESULT PrimaryBufferImpl_Create(
-    DirectSoundDevice * device,
-    PrimaryBufferImpl **ppdsb,
-    LPCDSBUFFERDESC dsbd) DECLSPEC_HIDDEN;
-
-/*****************************************************************************
  * DirectSoundCaptureDevice implementation structure
  */
 struct DirectSoundCaptureDevice
@@ -350,6 +334,8 @@ HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device) DECLSPEC_HIDDEN;
 HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LPDWORD writepos) DECLSPEC_HIDDEN;
 LPWAVEFORMATEX DSOUND_CopyFormat(LPCWAVEFORMATEX wfex) DECLSPEC_HIDDEN;
 HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) DECLSPEC_HIDDEN;
+HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl **ppdsb,
+    const DSBUFFERDESC *dsbd) DECLSPEC_HIDDEN;
 
 /* duplex.c */
  
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index 8a87c96..eaca2de 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -615,13 +615,20 @@ done:
 /*******************************************************************************
  *		PrimaryBuffer
  */
+static inline IDirectSoundBufferImpl *impl_from_IDirectSoundBuffer(IDirectSoundBuffer *iface)
+{
+    /* IDirectSoundBuffer and IDirectSoundBuffer8 use the same iface. */
+    return CONTAINING_RECORD(iface, IDirectSoundBufferImpl, IDirectSoundBuffer8_iface);
+}
+
 /* This sets this format for the <em>Primary Buffer Only</em> */
 /* See file:///cdrom/sdk52/docs/worddoc/dsound.doc page 120 */
 static HRESULT WINAPI PrimaryBufferImpl_SetFormat(
     LPDIRECTSOUNDBUFFER iface,
     LPCWAVEFORMATEX wfex)
 {
-    DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+    IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+    DirectSoundDevice *device = This->device;
     TRACE("(%p,%p)\n", iface, wfex);
     return DSOUND_PrimarySetFormat(device, wfex, device->priolevel == DSSCL_WRITEPRIMARY);
 }
@@ -629,7 +636,8 @@ static HRESULT WINAPI PrimaryBufferImpl_SetFormat(
 static HRESULT WINAPI PrimaryBufferImpl_SetVolume(
 	LPDIRECTSOUNDBUFFER iface,LONG vol
 ) {
-	DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	DWORD ampfactors;
         HRESULT hres = DS_OK;
 	TRACE("(%p,%d)\n", iface, vol);
@@ -673,7 +681,8 @@ static HRESULT WINAPI PrimaryBufferImpl_SetVolume(
 static HRESULT WINAPI PrimaryBufferImpl_GetVolume(
 	LPDIRECTSOUNDBUFFER iface,LPLONG vol
 ) {
-	DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	DWORD ampfactors;
 	TRACE("(%p,%p)\n", iface, vol);
 
@@ -701,7 +710,7 @@ static HRESULT WINAPI PrimaryBufferImpl_GetVolume(
 static HRESULT WINAPI PrimaryBufferImpl_SetFrequency(
 	LPDIRECTSOUNDBUFFER iface,DWORD freq
 ) {
-	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
 	TRACE("(%p,%d)\n",This,freq);
 
 	/* You cannot set the frequency of the primary buffer */
@@ -712,7 +721,8 @@ static HRESULT WINAPI PrimaryBufferImpl_SetFrequency(
 static HRESULT WINAPI PrimaryBufferImpl_Play(
 	LPDIRECTSOUNDBUFFER iface,DWORD reserved1,DWORD reserved2,DWORD flags
 ) {
-	DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p,%08x,%08x,%08x)\n", iface, reserved1, reserved2, flags);
 
 	if (!(flags & DSBPLAY_LOOPING)) {
@@ -736,7 +746,8 @@ static HRESULT WINAPI PrimaryBufferImpl_Play(
 
 static HRESULT WINAPI PrimaryBufferImpl_Stop(LPDIRECTSOUNDBUFFER iface)
 {
-	DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p)\n", iface);
 
 	/* **** */
@@ -755,7 +766,7 @@ static HRESULT WINAPI PrimaryBufferImpl_Stop(LPDIRECTSOUNDBUFFER iface)
 
 static ULONG WINAPI PrimaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER iface)
 {
-    PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+    IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
     ULONG ref = InterlockedIncrement(&(This->ref));
     TRACE("(%p) ref was %d\n", This, ref - 1);
     return ref;
@@ -763,7 +774,7 @@ static ULONG WINAPI PrimaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER iface)
 
 static ULONG WINAPI PrimaryBufferImpl_Release(LPDIRECTSOUNDBUFFER iface)
 {
-    PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+    IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
     DWORD ref = InterlockedDecrement(&(This->ref));
     TRACE("(%p) ref was %d\n", This, ref + 1);
 
@@ -779,7 +790,8 @@ static HRESULT WINAPI PrimaryBufferImpl_GetCurrentPosition(
 	LPDIRECTSOUNDBUFFER iface,LPDWORD playpos,LPDWORD writepos
 ) {
 	HRESULT	hres;
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p,%p,%p)\n", iface, playpos, writepos);
 
 	/* **** */
@@ -808,7 +820,8 @@ static HRESULT WINAPI PrimaryBufferImpl_GetCurrentPosition(
 static HRESULT WINAPI PrimaryBufferImpl_GetStatus(
 	LPDIRECTSOUNDBUFFER iface,LPDWORD status
 ) {
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p,%p)\n", iface, status);
 
 	if (status == NULL) {
@@ -833,7 +846,8 @@ static HRESULT WINAPI PrimaryBufferImpl_GetFormat(
     LPDWORD wfwritten)
 {
     DWORD size;
-    DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+    IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+    DirectSoundDevice *device = This->device;
     TRACE("(%p,%p,%d,%p)\n", iface, lpwf, wfsize, wfwritten);
 
     size = sizeof(WAVEFORMATEX) + device->pwfx->cbSize;
@@ -865,7 +879,8 @@ static HRESULT WINAPI PrimaryBufferImpl_Lock(
 	LPDIRECTSOUNDBUFFER iface,DWORD writecursor,DWORD writebytes,LPVOID *lplpaudioptr1,LPDWORD audiobytes1,LPVOID *lplpaudioptr2,LPDWORD audiobytes2,DWORD flags
 ) {
 	HRESULT hres;
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p,%d,%d,%p,%p,%p,%p,0x%08x) at %d\n",
 		iface,
 		writecursor,
@@ -947,7 +962,7 @@ static HRESULT WINAPI PrimaryBufferImpl_Lock(
 static HRESULT WINAPI PrimaryBufferImpl_SetCurrentPosition(
 	LPDIRECTSOUNDBUFFER iface,DWORD newpos
 ) {
-	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
 	TRACE("(%p,%d)\n",This,newpos);
 
 	/* You cannot set the position of the primary buffer */
@@ -958,7 +973,8 @@ static HRESULT WINAPI PrimaryBufferImpl_SetCurrentPosition(
 static HRESULT WINAPI PrimaryBufferImpl_SetPan(
 	LPDIRECTSOUNDBUFFER iface,LONG pan
 ) {
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	DWORD ampfactors;
         HRESULT hres = DS_OK;
 	TRACE("(%p,%d)\n", iface, pan);
@@ -1005,7 +1021,8 @@ static HRESULT WINAPI PrimaryBufferImpl_SetPan(
 static HRESULT WINAPI PrimaryBufferImpl_GetPan(
 	LPDIRECTSOUNDBUFFER iface,LPLONG pan
 ) {
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	DWORD ampfactors;
 	TRACE("(%p,%p)\n", iface, pan);
 
@@ -1033,7 +1050,8 @@ static HRESULT WINAPI PrimaryBufferImpl_GetPan(
 static HRESULT WINAPI PrimaryBufferImpl_Unlock(
 	LPDIRECTSOUNDBUFFER iface,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2
 ) {
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p,%p,%d,%p,%d)\n", iface, p1, x1, p2, x2);
 
 	if (device->priolevel != DSSCL_WRITEPRIMARY) {
@@ -1061,7 +1079,7 @@ static HRESULT WINAPI PrimaryBufferImpl_Unlock(
 static HRESULT WINAPI PrimaryBufferImpl_Restore(
 	LPDIRECTSOUNDBUFFER iface
 ) {
-	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
 	FIXME("(%p):stub\n",This);
 	return DS_OK;
 }
@@ -1069,7 +1087,8 @@ static HRESULT WINAPI PrimaryBufferImpl_Restore(
 static HRESULT WINAPI PrimaryBufferImpl_GetFrequency(
 	LPDIRECTSOUNDBUFFER iface,LPDWORD freq
 ) {
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
 	TRACE("(%p,%p)\n", iface, freq);
 
 	if (freq == NULL) {
@@ -1091,7 +1110,7 @@ static HRESULT WINAPI PrimaryBufferImpl_GetFrequency(
 static HRESULT WINAPI PrimaryBufferImpl_Initialize(
 	LPDIRECTSOUNDBUFFER iface,LPDIRECTSOUND dsound,LPCDSBUFFERDESC dbsd
 ) {
-	PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
 	WARN("(%p) already initialized\n", This);
 	return DSERR_ALREADYINITIALIZED;
 }
@@ -1099,7 +1118,8 @@ static HRESULT WINAPI PrimaryBufferImpl_Initialize(
 static HRESULT WINAPI PrimaryBufferImpl_GetCaps(
 	LPDIRECTSOUNDBUFFER iface,LPDSBCAPS caps
 ) {
-        DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
+        DirectSoundDevice *device = This->device;
   	TRACE("(%p,%p)\n", iface, caps);
 
 	if (caps == NULL) {
@@ -1125,7 +1145,7 @@ static HRESULT WINAPI PrimaryBufferImpl_GetCaps(
 static HRESULT WINAPI PrimaryBufferImpl_QueryInterface(
 	LPDIRECTSOUNDBUFFER iface,REFIID riid,LPVOID *ppobj
 ) {
-        PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
+        IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
         DirectSoundDevice *device = This->device;
 	TRACE("(%p,%s,%p)\n", iface, debugstr_guid(riid), ppobj);
 
@@ -1208,12 +1228,10 @@ static const IDirectSoundBufferVtbl dspbvt =
 	PrimaryBufferImpl_Restore
 };
 
-HRESULT PrimaryBufferImpl_Create(
-	DirectSoundDevice * device,
-	PrimaryBufferImpl ** ppdsb,
-	LPCDSBUFFERDESC dsbd)
+HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl **ppdsb,
+	const DSBUFFERDESC *dsbd)
 {
-	PrimaryBufferImpl *dsb;
+	IDirectSoundBufferImpl *dsb;
 	TRACE("%p,%p,%p)\n",device,ppdsb,dsbd);
 
 	if (dsbd->lpwfxFormat) {
@@ -1232,7 +1250,7 @@ HRESULT PrimaryBufferImpl_Create(
 
 	dsb->ref = 0;
 	dsb->device = device;
-	dsb->lpVtbl = &dspbvt;
+	dsb->IDirectSoundBuffer8_iface.lpVtbl = (IDirectSoundBuffer8Vtbl *)&dspbvt;
 
 	device->dsbd = *dsbd;
 
diff --git a/dlls/dsound/sound3d.c b/dlls/dsound/sound3d.c
index 48b49bc..0318420 100644
--- a/dlls/dsound/sound3d.c
+++ b/dlls/dsound/sound3d.c
@@ -758,7 +758,7 @@ static HRESULT WINAPI IDirectSound3DListenerImpl_QueryInterface(
 
 	if ( IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
 		if (!This->device->primary)
-			PrimaryBufferImpl_Create(This->device, &(This->device->primary), &(This->device->dsbd));
+			primarybuffer_create(This->device, &This->device->primary, &This->device->dsbd);
 		if (This->device->primary) {
 			*ppobj = This->device->primary;
 			IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)*ppobj);
-- 
1.7.6.1



More information about the wine-patches mailing list