dsound: Use the same struct for the primary buffer object as for the secondary.

This commit is contained in:
Michael Stefaniuc 2011-08-31 01:11:29 +02:00 committed by Alexandre Julliard
parent ee9c027986
commit ffb51208e9
4 changed files with 52 additions and 48 deletions

View File

@ -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;

View File

@ -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;
@ -209,21 +208,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate(
IDirectSoundBufferImpl *pdsb) DECLSPEC_HIDDEN;
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
*/
@ -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 */

View File

@ -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;

View File

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