[DSOUND] buffer patch
Robert Reif
reif at earthlink.net
Fri Jan 13 21:26:29 CST 2006
Rename some functions, make some functions global, and move some code
around.
-------------- next part --------------
Index: dlls/dsound/buffer.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/buffer.c,v
retrieving revision 1.57
diff -p -u -r1.57 buffer.c
--- dlls/dsound/buffer.c 6 Jan 2006 12:20:34 -0000 1.57
+++ dlls/dsound/buffer.c 14 Jan 2006 03:17:16 -0000
@@ -364,7 +364,7 @@ static ULONG WINAPI IDirectSoundBufferIm
TRACE("(%p) ref was %ld\n", This, ref + 1);
if (!ref) {
- DSOUND_RemoveBuffer(This->device, This);
+ DirectSoundDevice_RemoveBuffer(This->device, This);
This->lock.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&(This->lock));
@@ -1158,7 +1158,7 @@ HRESULT IDirectSoundBufferImpl_Create(
/* register buffer if not primary */
if (!(dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER)) {
- err = DSOUND_AddBuffer(device, dsb);
+ err = DirectSoundDevice_AddBuffer(device, dsb);
if (err != DS_OK) {
HeapFree(GetProcessHeap(),0,dsb->buffer->memory);
HeapFree(GetProcessHeap(),0,dsb->buffer);
@@ -1212,6 +1212,104 @@ HRESULT IDirectSoundBufferImpl_Destroy(
return S_OK;
}
+HRESULT IDirectSoundBufferImpl_Duplicate(
+ DirectSoundDevice *device,
+ IDirectSoundBufferImpl **ppdsb,
+ IDirectSoundBufferImpl *pdsb)
+{
+ IDirectSoundBufferImpl *dsb;
+ HRESULT hres = DS_OK;
+ int size;
+ TRACE("(%p,%p,%p)\n", device, pdsb, pdsb);
+
+ dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
+
+ if (dsb == NULL) {
+ WARN("out of memory\n");
+ *ppdsb = NULL;
+ return DSERR_OUTOFMEMORY;
+ }
+
+ CopyMemory(dsb, pdsb, sizeof(IDirectSoundBufferImpl));
+
+ if (pdsb->hwbuf) {
+ TRACE("duplicating hardware buffer\n");
+
+ hres = IDsDriver_DuplicateSoundBuffer(device->driver, pdsb->hwbuf,
+ (LPVOID *)&dsb->hwbuf);
+ if (hres != DS_OK) {
+ TRACE("IDsDriver_DuplicateSoundBuffer failed, falling back to "
+ "software buffer\n");
+ dsb->hwbuf = NULL;
+ /* allocate buffer */
+ if (device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) {
+ dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer)));
+ if (dsb->buffer == NULL) {
+ WARN("out of memory\n");
+ HeapFree(GetProcessHeap(),0,dsb);
+ *ppdsb = NULL;
+ return DSERR_OUTOFMEMORY;
+ }
+
+ dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
+ if (dsb->buffer->memory == NULL) {
+ WARN("out of memory\n");
+ HeapFree(GetProcessHeap(),0,dsb->buffer);
+ HeapFree(GetProcessHeap(),0,dsb);
+ *ppdsb = NULL;
+ return DSERR_OUTOFMEMORY;
+ }
+ dsb->buffer->ref = 1;
+
+ /* FIXME: copy buffer ? */
+ }
+ }
+ } else {
+ dsb->hwbuf = NULL;
+ dsb->buffer->ref++;
+ }
+
+ dsb->ref = 0;
+ dsb->state = STATE_STOPPED;
+ dsb->playpos = 0;
+ dsb->buf_mixpos = 0;
+ dsb->device = device;
+ dsb->ds3db = NULL;
+ dsb->iks = NULL; /* FIXME? */
+ dsb->secondary = NULL;
+
+ /* variable sized struct so calculate size based on format */
+ size = sizeof(WAVEFORMATEX) + pdsb->pwfx->cbSize;
+
+ dsb->pwfx = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size);
+ if (dsb->pwfx == NULL) {
+ WARN("out of memory\n");
+ HeapFree(GetProcessHeap(),0,dsb->buffer);
+ HeapFree(GetProcessHeap(),0,dsb);
+ *ppdsb = NULL;
+ return DSERR_OUTOFMEMORY;
+ }
+
+ CopyMemory(dsb->pwfx, pdsb->pwfx, size);
+
+ InitializeCriticalSection(&(dsb->lock));
+ dsb->lock.DebugInfo->Spare[0] = (DWORD_PTR)"DSOUNDBUFFER_lock";
+
+ /* register buffer */
+ hres = DirectSoundDevice_AddBuffer(device, dsb);
+ if (hres != DS_OK) {
+ dsb->lock.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection(&(dsb->lock));
+ HeapFree(GetProcessHeap(),0,dsb->buffer);
+ HeapFree(GetProcessHeap(),0,dsb->pwfx);
+ HeapFree(GetProcessHeap(),0,dsb);
+ *ppdsb = 0;
+ }
+
+ *ppdsb = dsb;
+ return hres;
+}
+
/*******************************************************************************
* SecondaryBuffer
*/
Index: dlls/dsound/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound.c,v
retrieving revision 1.45
diff -p -u -r1.45 dsound.c
--- dlls/dsound/dsound.c 6 Jan 2006 12:20:34 -0000 1.45
+++ dlls/dsound/dsound.c 14 Jan 2006 03:17:17 -0000
@@ -45,10 +45,6 @@ static ULONG WINAPI IDirectSound8_IUnkno
static ULONG WINAPI IDirectSound8_IDirectSound_AddRef(LPDIRECTSOUND iface);
static ULONG WINAPI IDirectSound8_IDirectSound8_AddRef(LPDIRECTSOUND8 iface);
-static HRESULT DirectSoundDevice_Create(DirectSoundDevice ** ppDevice);
-static ULONG DirectSoundDevice_AddRef(DirectSoundDevice * device);
-static ULONG DirectSoundDevice_Release(DirectSoundDevice * device);
-
static const char * dumpCooperativeLevel(DWORD level)
{
static char unknown[32];
@@ -440,10 +436,8 @@ static HRESULT WINAPI IDirectSoundImpl_D
LPDIRECTSOUNDBUFFER psb,
LPLPDIRECTSOUNDBUFFER ppdsb)
{
- IDirectSoundBufferImpl* pdsb;
IDirectSoundBufferImpl* dsb;
HRESULT hres = DS_OK;
- int size;
IDirectSoundImpl *This = (IDirectSoundImpl *)iface;
TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
@@ -475,90 +469,11 @@ static HRESULT WINAPI IDirectSoundImpl_D
return DSERR_INVALIDCALL;
}
- pdsb = ((SecondaryBufferImpl *)psb)->dsb;
-
- dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
-
- if (dsb == NULL) {
- WARN("out of memory\n");
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- CopyMemory(dsb, pdsb, sizeof(IDirectSoundBufferImpl));
+ /* duplicate the actual buffer implementation */
+ hres = IDirectSoundBufferImpl_Duplicate(This->device, &dsb,
+ ((SecondaryBufferImpl *)psb)->dsb);
- if (pdsb->hwbuf) {
- TRACE("duplicating hardware buffer\n");
-
- hres = IDsDriver_DuplicateSoundBuffer(This->device->driver, pdsb->hwbuf, (LPVOID *)&dsb->hwbuf);
- if (hres != DS_OK) {
- TRACE("IDsDriver_DuplicateSoundBuffer failed, falling back to software buffer\n");
- dsb->hwbuf = NULL;
- /* allocate buffer */
- if (This->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) {
- dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer)));
- if (dsb->buffer == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
- if (dsb->buffer->memory == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
- dsb->buffer->ref = 1;
-
- /* FIXME: copy buffer ? */
- }
- }
- } else {
- dsb->hwbuf = NULL;
- dsb->buffer->ref++;
- }
-
- dsb->ref = 0;
- dsb->state = STATE_STOPPED;
- dsb->playpos = 0;
- dsb->buf_mixpos = 0;
- dsb->device = This->device;
- dsb->ds3db = NULL;
- dsb->iks = NULL; /* FIXME? */
- dsb->secondary = NULL;
-
- /* variable sized struct so calculate size based on format */
- size = sizeof(WAVEFORMATEX) + pdsb->pwfx->cbSize;
-
- dsb->pwfx = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size);
- if (dsb->pwfx == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- CopyMemory(dsb->pwfx, pdsb->pwfx, size);
-
- InitializeCriticalSection(&(dsb->lock));
- dsb->lock.DebugInfo->Spare[0] = (DWORD_PTR)"DSOUNDBUFFER_lock";
-
- /* register buffer */
- hres = DSOUND_AddBuffer(This->device, dsb);
- if (hres != DS_OK) {
- IDirectSoundBuffer8_Release(psb);
- dsb->lock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&(dsb->lock));
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = 0;
- } else {
+ if (hres == DS_OK) {
hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
if (*ppdsb) {
dsb->secondary = (SecondaryBufferImpl*)*ppdsb;
@@ -867,7 +782,7 @@ static const IDirectSound8Vtbl IDirectSo
IDirectSoundImpl_VerifyCertification
};
-static HRESULT DirectSoundDevice_Create(DirectSoundDevice ** ppDevice)
+HRESULT DirectSoundDevice_Create(DirectSoundDevice ** ppDevice)
{
DirectSoundDevice * device;
TRACE("(%p)\n", ppDevice);
@@ -947,14 +862,14 @@ static HRESULT DirectSoundDevice_Create(
return DS_OK;
}
-static ULONG DirectSoundDevice_AddRef(DirectSoundDevice * device)
+ULONG DirectSoundDevice_AddRef(DirectSoundDevice * device)
{
ULONG ref = InterlockedIncrement(&(device->ref));
TRACE("(%p) ref was %ld\n", device, ref - 1);
return ref;
}
-static ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
+ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
{
HRESULT hr;
ULONG ref = InterlockedDecrement(&(device->ref));
@@ -1005,7 +920,7 @@ static ULONG DirectSoundDevice_Release(D
device->mixlock.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&device->mixlock);
HeapFree(GetProcessHeap(),0,device);
- TRACE("(%p) released\n", device);
+ TRACE("(%p) released\n", device);
}
return ref;
}
@@ -1848,7 +1763,7 @@ HRESULT WINAPI DirectSoundCreate8(
* Add secondary buffer to buffer list.
* Gets exclusive access to buffer for writing.
*/
-HRESULT DSOUND_AddBuffer(
+HRESULT DirectSoundDevice_AddBuffer(
DirectSoundDevice * device,
IDirectSoundBufferImpl * pDSB)
{
@@ -1883,7 +1798,7 @@ HRESULT DSOUND_AddBuffer(
* Remove secondary buffer from buffer list.
* Gets exclusive access to buffer for writing.
*/
-HRESULT DSOUND_RemoveBuffer(
+HRESULT DirectSoundDevice_RemoveBuffer(
DirectSoundDevice * device,
IDirectSoundBufferImpl * pDSB)
{
Index: dlls/dsound/dsound_private.h
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound_private.h,v
retrieving revision 1.37
diff -p -u -r1.37 dsound_private.h
--- dlls/dsound/dsound_private.h 6 Jan 2006 12:20:34 -0000 1.37
+++ dlls/dsound/dsound_private.h 14 Jan 2006 03:17:18 -0000
@@ -81,6 +81,12 @@ struct IDirectSoundImpl
LPDIRECTSOUND8 pDS8;
};
+HRESULT IDirectSoundImpl_Create(
+ LPDIRECTSOUND8 * ppds);
+
+/*****************************************************************************
+ * IDirectSoundDevice implementation structure
+ */
struct DirectSoundDevice
{
LONG ref;
@@ -122,16 +128,15 @@ typedef struct BufferMemory
LPBYTE memory;
} BufferMemory;
-HRESULT IDirectSoundImpl_Create(
- LPDIRECTSOUND8 * ppds);
-
-HRESULT DSOUND_Create(
- LPDIRECTSOUND *ppDS,
- IUnknown *pUnkOuter);
-
-HRESULT DSOUND_Create8(
- LPDIRECTSOUND8 *ppDS,
- IUnknown *pUnkOuter);
+HRESULT DirectSoundDevice_Create(DirectSoundDevice ** ppDevice);
+ULONG DirectSoundDevice_AddRef(DirectSoundDevice * device);
+ULONG DirectSoundDevice_Release(DirectSoundDevice * device);
+HRESULT DirectSoundDevice_AddBuffer(
+ DirectSoundDevice *device,
+ IDirectSoundBufferImpl * pDSB);
+HRESULT DirectSoundDevice_RemoveBuffer(
+ DirectSoundDevice *device,
+ IDirectSoundBufferImpl * pDSB);
/*****************************************************************************
* IDirectSound COM components
@@ -240,6 +245,10 @@ HRESULT IDirectSoundBufferImpl_Create(
LPCDSBUFFERDESC dsbd);
HRESULT IDirectSoundBufferImpl_Destroy(
IDirectSoundBufferImpl *pdsb);
+HRESULT IDirectSoundBufferImpl_Duplicate(
+ DirectSoundDevice *device,
+ IDirectSoundBufferImpl **ppdsb,
+ IDirectSoundBufferImpl *pdsb);
/*****************************************************************************
* SecondaryBuffer implementation structure
@@ -488,8 +497,8 @@ void DSOUND_RecalcFormat(IDirectSoundBuf
/* dsound.c */
-HRESULT DSOUND_AddBuffer(DirectSoundDevice *device, IDirectSoundBufferImpl * pDSB);
-HRESULT DSOUND_RemoveBuffer(DirectSoundDevice *device, IDirectSoundBufferImpl * pDSB);
+HRESULT DSOUND_Create(LPDIRECTSOUND *ppDS, IUnknown *pUnkOuter);
+HRESULT DSOUND_Create8(LPDIRECTSOUND8 *ppDS, IUnknown *pUnkOuter);
/* primary.c */
More information about the wine-patches
mailing list