Added SecondaryBuffer and DirectSoundCaptureNotify COM objects to get
reference counting right.
diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 1011917..576d60b 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -58,23 +58,12 @@
ICOM_THIS(IDirectSoundNotifyImpl,iface);
TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- if (ppobj == NULL) {
+ if (This->dsb == NULL) {
WARN("invalid parameter\n");
return E_INVALIDARG;
}
- *ppobj = NULL; /* assume error */
-
- if ( IsEqualGUID(riid, &IID_IUnknown) ||
- IsEqualGUID(riid, &IID_IDirectSoundNotify) ||
- IsEqualGUID(riid, &IID_IDirectSoundNotify8) ) {
- IDirectSoundNotify_AddRef(iface);
- *ppobj = This;
- return DS_OK;
- }
-
- FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
- return E_NOINTERFACE;
+ return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER)This->dsb, riid, ppobj);
}
static ULONG WINAPI IDirectSoundNotifyImpl_AddRef(LPDIRECTSOUNDNOTIFY iface) {
@@ -94,14 +83,11 @@
TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
ref = InterlockedDecrement(&(This->ref));
- /* FIXME: A notification should be a part of a buffer rather than pointed
- * to from a buffer. Hence the -1 ref count */
- if (ref == -1) {
- if (This->notifies != NULL)
- HeapFree(GetProcessHeap(), 0, This->notifies);
-
+ if (ref == 0) {
+ IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER)This->dsb);
+ This->dsb->notify = NULL;
HeapFree(GetProcessHeap(),0,This);
- return 0;
+ TRACE("(%p) released\n",This);
}
return ref;
}
@@ -124,23 +110,23 @@
notify[i].dwOffset,(DWORD)notify[i].hEventNotify);
}
- if (This->hwnotify) {
+ if (This->dsb->hwnotify) {
HRESULT hres;
- hres = IDsDriverNotify_SetNotificationPositions(This->hwnotify, howmuch, notify);
+ hres = IDsDriverNotify_SetNotificationPositions(This->dsb->hwnotify, howmuch, notify);
if (hres != DS_OK)
WARN("IDsDriverNotify_SetNotificationPositions failed\n");
return hres;
} else {
/* Make an internal copy of the caller-supplied array.
* Replace the existing copy if one is already present. */
- This->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- This->notifies, howmuch * sizeof(DSBPOSITIONNOTIFY));
- if (This->notifies == NULL) {
+ This->dsb->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ This->dsb->notifies, howmuch * sizeof(DSBPOSITIONNOTIFY));
+ if (This->dsb->notifies == NULL) {
WARN("out of memory\n");
return DSERR_OUTOFMEMORY;
}
- memcpy(This->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
- This->nrofnotifies = howmuch;
+ memcpy(This->dsb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
+ This->dsb->nrofnotifies = howmuch;
}
return S_OK;
@@ -148,13 +134,37 @@
ICOM_VTABLE(IDirectSoundNotify) dsnvt =
{
- ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
- IDirectSoundNotifyImpl_QueryInterface,
- IDirectSoundNotifyImpl_AddRef,
- IDirectSoundNotifyImpl_Release,
- IDirectSoundNotifyImpl_SetNotificationPositions,
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IDirectSoundNotifyImpl_QueryInterface,
+ IDirectSoundNotifyImpl_AddRef,
+ IDirectSoundNotifyImpl_Release,
+ IDirectSoundNotifyImpl_SetNotificationPositions,
};
+HRESULT WINAPI IDirectSoundNotifyImpl_Create(
+ IDirectSoundBufferImpl * dsb,
+ IDirectSoundNotifyImpl **pdsn)
+{
+ IDirectSoundNotifyImpl * dsn;
+ TRACE("(%p,%p)\n",dsb,pdsn);
+
+ dsn = (IDirectSoundNotifyImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(dsn));
+
+ if (dsn == NULL) {
+ WARN("out of memory\n");
+ return DSERR_OUTOFMEMORY;
+ }
+
+ dsn->ref = 0;
+ dsn->lpVtbl = &dsnvt;
+ dsn->dsb = dsb;
+ dsb->notify = dsn;
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb);
+
+ *pdsn = dsn;
+ return DS_OK;
+}
+
/*******************************************************************************
* IDirectSoundBuffer
*/
@@ -361,7 +371,6 @@
for (i=0;i<This->dsound->nrofbuffers;i++)
if (This->dsound->buffers[i] == This)
break;
-
if (i < This->dsound->nrofbuffers) {
/* Put the last buffer of the list in the (now empty) position */
This->dsound->buffers[i] = This->dsound->buffers[This->dsound->nrofbuffers - 1];
@@ -401,8 +410,12 @@
if (This->iks)
IKsPropertySet_Release((LPKSPROPERTYSET)This->iks);
+ if (This->notifies != NULL)
+ HeapFree(GetProcessHeap(), 0, This->notifies);
+
HeapFree(GetProcessHeap(),0,This);
+ TRACE("(%p) released\n",This);
return 0;
}
@@ -920,24 +933,24 @@
if ( IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IDirectSoundBuffer) ||
IsEqualGUID(riid, &IID_IDirectSoundBuffer8) ) {
- IDirectSoundBuffer8_AddRef((LPDIRECTSOUNDBUFFER8)This);
- *ppobj = This;
- return S_OK;
+ if (!This->dsb)
+ SecondaryBufferImpl_Create(This, &(This->dsb));
+ if (This->dsb) {
+ IDirectSoundBuffer8_AddRef((LPDIRECTSOUNDBUFFER8)This->dsb);
+ *ppobj = This->dsb;
+ return S_OK;
+ }
+ WARN("IID_IDirectSoundBuffer\n");
+ return E_NOINTERFACE;
}
if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ||
IsEqualGUID( &IID_IDirectSoundNotify8, riid ) ) {
- if (!This->notify) {
- This->notify = (IDirectSoundNotifyImpl*)HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY,sizeof(*This->notify));
- if (This->notify) {
- This->notify->ref = 0; /* release when ref == -1 */
- This->notify->lpVtbl = &dsnvt;
- }
- }
+ if (!This->notify)
+ IDirectSoundNotifyImpl_Create(This, &(This->notify));
if (This->notify) {
IDirectSoundNotify_AddRef((LPDIRECTSOUNDNOTIFY)This->notify);
- *ppobj = (LPVOID)This->notify;
+ *ppobj = This->notify;
return S_OK;
}
WARN("IID_IDirectSoundNotify\n");
@@ -946,10 +959,10 @@
if ( IsEqualGUID( &IID_IDirectSound3DBuffer, riid ) ) {
if (!This->ds3db)
- IDirectSound3DBufferImpl_Create(This, &This->ds3db);
- *ppobj = This->ds3db;
- if (*ppobj) {
- IDirectSound3DBuffer_AddRef((LPDIRECTSOUND3DBUFFER)*ppobj);
+ IDirectSound3DBufferImpl_Create(This, &(This->ds3db));
+ if (This->ds3db) {
+ IDirectSound3DBuffer_AddRef((LPDIRECTSOUND3DBUFFER)This->ds3db);
+ *ppobj = This->ds3db;
return S_OK;
}
WARN("IID_IDirectSound3DBuffer\n");
@@ -965,13 +978,12 @@
/* only supported on hardware 3D secondary buffers */
if (!(This->dsbd.dwFlags & DSBCAPS_PRIMARYBUFFER) &&
(This->dsbd.dwFlags & DSBCAPS_CTRL3D) &&
- (This->dsbd.dwFlags & DSBCAPS_LOCHARDWARE) &&
(This->hwbuf != NULL) ) {
if (!This->iks)
- IKsBufferPropertySetImpl_Create(This, &This->iks);
- *ppobj = This->iks;
- if (*ppobj) {
+ IKsBufferPropertySetImpl_Create(This, &(This->iks));
+ if (This->iks) {
IKsPropertySet_AddRef((LPKSPROPERTYSET)*ppobj);
+ *ppobj = This->iks;
return S_OK;
}
}
@@ -1013,8 +1025,8 @@
IDirectSoundBufferImpl_GetObjectInPath
};
-HRESULT WINAPI SecondaryBuffer_Create(
- IDirectSoundImpl *This,
+HRESULT WINAPI IDirectSoundBufferImpl_Create(
+ IDirectSoundImpl *ds,
IDirectSoundBufferImpl **pdsb,
LPDSBUFFERDESC dsbd)
{
@@ -1023,6 +1035,7 @@
HRESULT err = DS_OK;
DWORD capf = 0;
int use_hw;
+ TRACE("(%p,%p,%p)\n",ds,pdsb,dsbd);
if (dsbd->dwBufferBytes < DSBSIZE_MIN || dsbd->dwBufferBytes > DSBSIZE_MAX) {
WARN("invalid parameter: dsbd->dwBufferBytes = %ld\n", dsbd->dwBufferBytes);
@@ -1038,7 +1051,8 @@
return DSERR_OUTOFMEMORY;
}
dsb->ref = 0;
- dsb->dsound = This;
+ dsb->dsb = 0;
+ dsb->dsound = ds;
dsb->lpVtbl = &dsbvt;
memcpy(&dsb->dsbd, dsbd, sizeof(*dsbd));
@@ -1050,12 +1064,17 @@
dsb->buflen = dsbd->dwBufferBytes;
dsb->freq = dsbd->lpwfxFormat->nSamplesPerSec;
+ dsb->notify = NULL;
+ dsb->notifies = NULL;
+ dsb->nrofnotifies = 0;
+ dsb->hwnotify = 0;
+
/* Check necessary hardware mixing capabilities */
if (wfex->nChannels==2) capf |= DSCAPS_SECONDARYSTEREO;
else capf |= DSCAPS_SECONDARYMONO;
if (wfex->wBitsPerSample==16) capf |= DSCAPS_SECONDARY16BIT;
else capf |= DSCAPS_SECONDARY8BIT;
- use_hw = (This->drvcaps.dwFlags & capf) == capf;
+ use_hw = (ds->drvcaps.dwFlags & capf) == capf;
/* FIXME: check hardware sample rate mixing capabilities */
/* FIXME: check app hints for software/hardware buffer (STATIC, LOCHARDWARE, etc) */
@@ -1063,7 +1082,7 @@
/* FIXME: handle DSDHEAP_CREATEHEAP for hardware buffers */
/* Allocate system memory if applicable */
- if ((This->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) || !use_hw) {
+ if ((ds->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) || !use_hw) {
dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer)));
if (dsb->buffer == NULL) {
WARN("out of memory\n");
@@ -1084,7 +1103,7 @@
/* Allocate the hardware buffer */
if (use_hw) {
- err = IDsDriver_CreateSoundBuffer(This->driver,wfex,dsbd->dwFlags,0,
+ err = IDsDriver_CreateSoundBuffer(ds->driver,wfex,dsbd->dwFlags,0,
&(dsb->buflen),&(dsb->buffer->memory),
(LPVOID*)&(dsb->hwbuf));
if (err != DS_OK) {
@@ -1109,7 +1128,7 @@
dsb->state = STATE_STOPPED;
dsb->freqAdjust = (dsb->freq << DSOUND_FREQSHIFT) /
- This->wfx.nSamplesPerSec;
+ ds->wfx.nSamplesPerSec;
dsb->nAvgBytesPerSec = dsb->freq *
dsbd->lpwfxFormat->nBlockAlign;
@@ -1139,29 +1158,312 @@
InitializeCriticalSection(&(dsb->lock));
/* register buffer */
- RtlAcquireResourceExclusive(&(This->lock), TRUE);
+ RtlAcquireResourceExclusive(&(ds->lock), TRUE);
if (!(dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER)) {
- IDirectSoundBufferImpl **newbuffers = (IDirectSoundBufferImpl**)HeapReAlloc(GetProcessHeap(),0,This->buffers,sizeof(IDirectSoundBufferImpl*)*(This->nrofbuffers+1));
+ IDirectSoundBufferImpl **newbuffers = (IDirectSoundBufferImpl**)HeapReAlloc(GetProcessHeap(),0,ds->buffers,sizeof(IDirectSoundBufferImpl*)*(ds->nrofbuffers+1));
if (newbuffers) {
- This->buffers = newbuffers;
- This->buffers[This->nrofbuffers] = dsb;
- This->nrofbuffers++;
- TRACE("buffer count is now %d\n", This->nrofbuffers);
+ ds->buffers = newbuffers;
+ ds->buffers[ds->nrofbuffers] = dsb;
+ ds->nrofbuffers++;
+ TRACE("buffer count is now %d\n", ds->nrofbuffers);
} else {
- ERR("out of memory for buffer list! Current buffer count is %d\n", This->nrofbuffers);
+ ERR("out of memory for buffer list! Current buffer count is %d\n", ds->nrofbuffers);
if (dsb->buffer->memory)
HeapFree(GetProcessHeap(),0,dsb->buffer->memory);
if (dsb->buffer)
HeapFree(GetProcessHeap(),0,dsb->buffer);
DeleteCriticalSection(&(dsb->lock));
- RtlReleaseResource(&(This->lock));
+ RtlReleaseResource(&(ds->lock));
HeapFree(GetProcessHeap(),0,dsb);
*pdsb = NULL;
return DSERR_OUTOFMEMORY;
}
}
- RtlReleaseResource(&(This->lock));
- IDirectSound8_AddRef((LPDIRECTSOUND8)This);
+ RtlReleaseResource(&(ds->lock));
+ IDirectSound8_AddRef((LPDIRECTSOUND8)ds);
*pdsb = dsb;
return S_OK;
}
+
+/*******************************************************************************
+ * SecondaryBuffer
+ */
+
+static HRESULT WINAPI SecondaryBufferImpl_QueryInterface(
+ LPDIRECTSOUNDBUFFER8 iface,REFIID riid,LPVOID *ppobj)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+
+ return IDirectSoundBufferImpl_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb,riid,ppobj);
+}
+
+static DWORD WINAPI SecondaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER8 iface)
+{
+ ICOM_THIS(IDirectSoundBufferImpl,iface);
+ DWORD ref;
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
+
+ ref = InterlockedIncrement(&(This->ref));
+ if (!ref) {
+ FIXME("thread-safety alert! AddRef-ing with a zero refcount!\n");
+ }
+ return ref;
+}
+
+static DWORD WINAPI SecondaryBufferImpl_Release(LPDIRECTSOUNDBUFFER8 iface)
+{
+ ICOM_THIS(IDirectSoundBufferImpl,iface);
+ DWORD ref;
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
+
+ ref = InterlockedDecrement(&(This->ref));
+ if (!ref) {
+ This->dsb->dsb = 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)
+{
+ ICOM_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)
+{
+ ICOM_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)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%p,%ld,%p)\n",This,lpwf,wfsize,wfwritten);
+
+ return IDirectSoundBufferImpl_GetFormat((LPDIRECTSOUNDBUFFER8)This->dsb,lpwf,wfsize,wfwritten);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_GetVolume(
+ LPDIRECTSOUNDBUFFER8 iface,LPLONG vol)
+{
+ ICOM_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)
+{
+ ICOM_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)
+{
+ ICOM_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)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%p)\n",This,status);
+
+ return IDirectSoundBufferImpl_GetStatus((LPDIRECTSOUNDBUFFER8)This->dsb,status);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_Initialize(
+ LPDIRECTSOUNDBUFFER8 iface,LPDIRECTSOUND8 dsound,LPDSBUFFERDESC dbsd)
+{
+ ICOM_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 flags)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%ld,%ld,%p,%p,%p,%p,0x%08lx)\n",
+ This,writecursor,writebytes,lplpaudioptr1,audiobytes1,lplpaudioptr2,audiobytes2,flags);
+
+ return IDirectSoundBufferImpl_Lock((LPDIRECTSOUNDBUFFER8)This->dsb,writecursor,writebytes,lplpaudioptr1,audiobytes1,lplpaudioptr2,audiobytes2,flags);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_Play(
+ LPDIRECTSOUNDBUFFER8 iface,DWORD reserved1,DWORD reserved2,DWORD flags)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%08lx,%08lx,%08lx)\n",This,reserved1,reserved2,flags);
+
+ return IDirectSoundBufferImpl_Play((LPDIRECTSOUNDBUFFER8)This->dsb,reserved1,reserved2,flags);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_SetCurrentPosition(
+ LPDIRECTSOUNDBUFFER8 iface,DWORD newpos)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%ld)\n",This,newpos);
+
+ return IDirectSoundBufferImpl_SetCurrentPosition((LPDIRECTSOUNDBUFFER8)This->dsb,newpos);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_SetFormat(
+ LPDIRECTSOUNDBUFFER8 iface,LPWAVEFORMATEX wfex)
+{
+ ICOM_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)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%ld)\n",This,vol);
+
+ return IDirectSoundBufferImpl_SetVolume((LPDIRECTSOUNDBUFFER8)This->dsb,vol);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_SetPan(
+ LPDIRECTSOUNDBUFFER8 iface,LONG pan)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%ld)\n",This,pan);
+
+ return IDirectSoundBufferImpl_SetPan((LPDIRECTSOUNDBUFFER8)This->dsb,pan);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_SetFrequency(
+ LPDIRECTSOUNDBUFFER8 iface,DWORD freq)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%ld)\n",This,freq);
+
+ return IDirectSoundBufferImpl_SetFrequency((LPDIRECTSOUNDBUFFER8)This->dsb,freq);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_Stop(LPDIRECTSOUNDBUFFER8 iface)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p)\n",This);
+
+ return IDirectSoundBufferImpl_Stop((LPDIRECTSOUNDBUFFER8)This->dsb);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_Unlock(
+ LPDIRECTSOUNDBUFFER8 iface,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%p,%ld,%p,%ld)\n", This,p1,x1,p2,x2);
+
+ return IDirectSoundBufferImpl_Unlock((LPDIRECTSOUNDBUFFER8)This->dsb,p1,x1,p2,x2);
+}
+
+static HRESULT WINAPI SecondaryBufferImpl_Restore(
+ LPDIRECTSOUNDBUFFER8 iface)
+{
+ ICOM_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)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%lu,%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)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%08lu,%lu,%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)
+{
+ ICOM_THIS(SecondaryBufferImpl,iface);
+ TRACE("(%p,%s,%lu,%s,%p)\n",This,debugstr_guid(rguidObject),dwIndex,debugstr_guid(rguidInterface),ppObject);
+
+ return IDirectSoundBufferImpl_GetObjectInPath((LPDIRECTSOUNDBUFFER8)This->dsb,rguidObject,dwIndex,rguidInterface,ppObject);
+}
+
+static ICOM_VTABLE(IDirectSoundBuffer8) sbvt =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ 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 WINAPI SecondaryBufferImpl_Create(
+ IDirectSoundBufferImpl *dsb,
+ SecondaryBufferImpl **psb)
+{
+ SecondaryBufferImpl *sb;
+ TRACE("(%p,%p)\n",dsb,psb);
+
+ sb = (SecondaryBufferImpl*)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;
+}
diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
index d14b2f7..6b5707a 100644
--- a/dlls/dsound/capture.c
+++ b/dlls/dsound/capture.c
@@ -325,8 +325,8 @@
}
This->index = (This->index + 1) % This->nrofpwaves;
waveInUnprepareHeader(hwi,&(This->pwave[This->index]),sizeof(WAVEHDR));
- if (This->capture_buffer->notify && This->capture_buffer->notify->nrofnotifies)
- SetEvent(This->capture_buffer->notify->notifies[This->index].hEventNotify);
+ if (This->capture_buffer->nrofnotifies)
+ SetEvent(This->capture_buffer->notifies[This->index].hEventNotify);
if ( (This->index == 0) && !(This->capture_buffer->flags & DSCBSTART_LOOPING) ) {
TRACE("end of buffer\n");
This->state = STATE_STOPPED;
@@ -377,10 +377,9 @@
{
ULONG uRef;
ICOM_THIS(IDirectSoundCaptureImpl,iface);
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
EnterCriticalSection( &(This->lock) );
-
- TRACE( "(%p) was 0x%08lx\n", This, This->ref );
uRef = ++(This->ref);
if (This->driver)
@@ -396,10 +395,10 @@
{
ULONG uRef;
ICOM_THIS(IDirectSoundCaptureImpl,iface);
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
EnterCriticalSection( &(This->lock) );
- TRACE( "(%p) was 0x%08lx\n", This, This->ref );
uRef = --(This->ref);
LeaveCriticalSection( &(This->lock) );
@@ -418,9 +417,9 @@
DeleteCriticalSection( &(This->lock) );
HeapFree( GetProcessHeap(), 0, This );
dsound_capture = NULL;
+ TRACE("(%p) released\n",This);
}
- TRACE( "returning 0x%08lx\n", uRef );
return uRef;
}
@@ -704,6 +703,9 @@
This->ref = 1;
This->dsound = ipDSC;
This->dsound->capture_buffer = This;
+ This->notify = NULL;
+ This->nrofnotifies = 0;
+ This->hwnotify = NULL;
This->pdscbd = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
lpcDSCBufferDesc->dwSize);
@@ -765,6 +767,131 @@
return DS_OK;
}
+/*******************************************************************************
+ * IDirectSoundCaptureNotify
+ */
+static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_QueryInterface(
+ LPDIRECTSOUNDNOTIFY iface,
+ REFIID riid,
+ LPVOID *ppobj)
+{
+ ICOM_THIS(IDirectSoundCaptureNotifyImpl,iface);
+ TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
+
+ if (This->dscb == NULL) {
+ WARN("invalid parameter\n");
+ return E_INVALIDARG;
+ }
+
+ return IDirectSoundCaptureBuffer_QueryInterface((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb, riid, ppobj);
+}
+
+static ULONG WINAPI IDirectSoundCaptureNotifyImpl_AddRef(LPDIRECTSOUNDNOTIFY iface)
+{
+ ICOM_THIS(IDirectSoundCaptureNotifyImpl,iface);
+ DWORD ref;
+
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
+
+ ref = InterlockedIncrement(&(This->ref));
+ return ref;
+}
+
+static ULONG WINAPI IDirectSoundCaptureNotifyImpl_Release(LPDIRECTSOUNDNOTIFY iface)
+{
+ ICOM_THIS(IDirectSoundCaptureNotifyImpl,iface);
+ DWORD ref;
+
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
+
+ ref = InterlockedDecrement(&(This->ref));
+ if (ref == 0) {
+ This->dscb->notify=NULL;
+ IDirectSoundCaptureBuffer_Release((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb);
+ HeapFree(GetProcessHeap(),0,This);
+ TRACE("(%p) released\n",This);
+ }
+ return ref;
+}
+
+static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_SetNotificationPositions(
+ LPDIRECTSOUNDNOTIFY iface,
+ DWORD howmuch,
+ LPCDSBPOSITIONNOTIFY notify)
+{
+ ICOM_THIS(IDirectSoundCaptureNotifyImpl,iface);
+ TRACE("(%p,0x%08lx,%p)\n",This,howmuch,notify);
+
+ if (notify == NULL) {
+ WARN("invalid parameter: notify == NULL\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ if (TRACE_ON(dsound)) {
+ int i;
+ for (i=0;i<howmuch;i++)
+ TRACE("notify at %ld to 0x%08lx\n",
+ notify[i].dwOffset,(DWORD)notify[i].hEventNotify);
+ }
+
+ if (This->dscb->hwnotify) {
+ HRESULT hres;
+ hres = IDsDriverNotify_SetNotificationPositions(This->dscb->hwnotify, howmuch, notify);
+ if (hres != DS_OK)
+ WARN("IDsDriverNotify_SetNotificationPositions failed\n");
+ return hres;
+ } else {
+ /* Make an internal copy of the caller-supplied array.
+ * Replace the existing copy if one is already present. */
+ This->dscb->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ This->dscb->notifies, howmuch * sizeof(DSBPOSITIONNOTIFY));
+ if (This->dscb->notifies == NULL) {
+ WARN("out of memory\n");
+ return DSERR_OUTOFMEMORY;
+ }
+ memcpy(This->dscb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
+ This->dscb->nrofnotifies = howmuch;
+ }
+
+ return S_OK;
+}
+
+ICOM_VTABLE(IDirectSoundNotify) dscnvt =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IDirectSoundCaptureNotifyImpl_QueryInterface,
+ IDirectSoundCaptureNotifyImpl_AddRef,
+ IDirectSoundCaptureNotifyImpl_Release,
+ IDirectSoundCaptureNotifyImpl_SetNotificationPositions,
+};
+
+HRESULT WINAPI IDirectSoundCaptureNotifyImpl_Create(
+ IDirectSoundCaptureBufferImpl *dscb,
+ IDirectSoundCaptureNotifyImpl **pdscn)
+{
+ IDirectSoundCaptureNotifyImpl * dscn;
+ TRACE("(%p,%p)\n",dscb,pdscn);
+
+ dscn = (IDirectSoundCaptureNotifyImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(dscn));
+
+ if (dscn == NULL) {
+ WARN("out of memory\n");
+ return DSERR_OUTOFMEMORY;
+ }
+
+ dscn->ref = 0;
+ dscn->lpVtbl = &dscnvt;
+ dscn->dscb = dscb;
+ dscb->notify = dscn;
+ IDirectSoundCaptureBuffer_AddRef((LPDIRECTSOUNDCAPTUREBUFFER)dscb);
+
+ *pdscn = dscn;
+ return DS_OK;
+}
+
+/*******************************************************************************
+ * IDirectSoundCaptureBuffer
+ */
static HRESULT WINAPI
IDirectSoundCaptureBufferImpl_QueryInterface(
LPDIRECTSOUNDCAPTUREBUFFER8 iface,
@@ -772,6 +899,7 @@
LPVOID* ppobj )
{
ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
+ HRESULT hres;
TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
if (ppobj == NULL) {
@@ -783,24 +911,16 @@
if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ||
IsEqualGUID( &IID_IDirectSoundNotify8, riid ) ) {
- if (!This->notify) {
- This->notify = (IDirectSoundNotifyImpl*)HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, sizeof(*This->notify));
- if (This->notify) {
- This->notify->ref = 0; /* release when ref = -1 */
- This->notify->lpVtbl = &dsnvt;
- }
- }
+ if (!This->notify)
+ hres = IDirectSoundCaptureNotifyImpl_Create(This, &This->notify);
if (This->notify) {
if (This->dsound->hwbuf) {
- HRESULT err;
-
- err = IDsCaptureDriverBuffer_QueryInterface(This->dsound->hwbuf,
- &IID_IDsDriverNotify, (LPVOID*)&(This->notify->hwnotify));
- if (err != DS_OK) {
+ hres = IDsCaptureDriverBuffer_QueryInterface(This->dsound->hwbuf,
+ &IID_IDsDriverNotify, (LPVOID*)&(This->hwnotify));
+ if (hres != DS_OK) {
WARN("IDsCaptureDriverBuffer_QueryInterface failed\n");
*ppobj = 0;
- return err;
+ return hres;
}
}
@@ -809,7 +929,6 @@
return DS_OK;
}
- *ppobj = 0;
WARN("IID_IDirectSoundNotify\n");
return E_FAIL;
}
@@ -822,9 +941,6 @@
}
FIXME("(%p,%s,%p) unsupported GUID\n", This, debugstr_guid(riid), ppobj);
-
- *ppobj = 0;
-
return E_NOINTERFACE;
}
@@ -833,13 +949,12 @@
{
ULONG uRef;
ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
- TRACE( "(%p)\n", This );
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
assert(This->dsound);
EnterCriticalSection( &(This->dsound->lock) );
- TRACE( "(%p) was 0x%08lx\n", This, This->ref );
uRef = ++(This->ref);
LeaveCriticalSection( &(This->dsound->lock) );
@@ -852,13 +967,12 @@
{
ULONG uRef;
ICOM_THIS(IDirectSoundCaptureBufferImpl,iface);
- TRACE( "(%p)\n", This );
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
assert(This->dsound);
EnterCriticalSection( &(This->dsound->lock) );
- TRACE( "(%p) was 0x%08lx\n", This, This->ref );
uRef = --(This->ref);
LeaveCriticalSection( &(This->dsound->lock) );
@@ -890,10 +1004,13 @@
if (This->notify)
IDirectSoundNotify_Release((LPDIRECTSOUNDNOTIFY)This->notify);
+ if (This->notifies != NULL)
+ HeapFree(GetProcessHeap(), 0, This->notifies);
+
HeapFree( GetProcessHeap(), 0, This );
+ TRACE("(%p) released\n",This);
}
- TRACE( "returning 0x%08lx\n", uRef );
return uRef;
}
@@ -1205,10 +1322,10 @@
IDirectSoundCaptureImpl* ipDSC = This->dsound;
if (ipDSC->buffer) {
- if (This->notify && This->notify->nrofnotifies) {
+ if (This->nrofnotifies) {
unsigned c;
- ipDSC->nrofpwaves = This->notify->nrofnotifies;
+ ipDSC->nrofpwaves = This->nrofnotifies;
/* prepare headers */
ipDSC->pwave = HeapReAlloc(GetProcessHeap(),0,ipDSC->pwave,
@@ -1218,13 +1335,13 @@
if (c == 0) {
ipDSC->pwave[0].lpData = ipDSC->buffer;
ipDSC->pwave[0].dwBufferLength =
- This->notify->notifies[0].dwOffset + 1;
+ This->notifies[0].dwOffset + 1;
} else {
ipDSC->pwave[c].lpData = ipDSC->buffer +
- This->notify->notifies[c-1].dwOffset + 1;
+ This->notifies[c-1].dwOffset + 1;
ipDSC->pwave[c].dwBufferLength =
- This->notify->notifies[c].dwOffset -
- This->notify->notifies[c-1].dwOffset;
+ This->notifies[c].dwOffset -
+ This->notifies[c-1].dwOffset;
}
ipDSC->pwave[c].dwUser = (DWORD)ipDSC;
ipDSC->pwave[c].dwFlags = 0;
@@ -1604,10 +1721,10 @@
{
ULONG uRef;
ICOM_THIS(IDirectSoundFullDuplexImpl,iface);
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
EnterCriticalSection( &(This->lock) );
- TRACE( "(%p) was 0x%08lx\n", This, This->ref );
uRef = ++(This->ref);
LeaveCriticalSection( &(This->lock) );
@@ -1620,18 +1737,18 @@
{
ULONG uRef;
ICOM_THIS(IDirectSoundFullDuplexImpl,iface);
+ TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
EnterCriticalSection( &(This->lock) );
- TRACE( "(%p) was 0x%08lx\n", This, This->ref );
uRef = --(This->ref);
LeaveCriticalSection( &(This->lock) );
if ( uRef == 0 ) {
- TRACE("deleting object\n");
DeleteCriticalSection( &(This->lock) );
HeapFree( GetProcessHeap(), 0, This );
+ TRACE("(%p) released\n",This);
}
return uRef;
diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c
index 2047454..bd926c9 100644
--- a/dlls/dsound/dsound_main.c
+++ b/dlls/dsound/dsound_main.c
@@ -529,39 +529,52 @@
wfex->wBitsPerSample, wfex->cbSize);
if (dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER) {
- *ppdsb=(LPDIRECTSOUNDBUFFER8)This->primary;
- if (*ppdsb==NULL)
- WARN("PrimaryBuffer_Create failed\n");
- else {
+ if (This->primary) {
+ WARN("Primary Buffer already created\n");
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(This->primary));
+ *ppdsb = (LPDIRECTSOUNDBUFFER8)(This->primary);
+ } else {
This->dsbd = *dsbd;
- IDirectSoundBuffer_AddRef(*ppdsb);
+ hres = PrimaryBufferImpl_Create(This, (PrimaryBufferImpl**)&(This->primary), &(This->dsbd));
+ if (This->primary) {
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(This->primary));
+ *ppdsb = (LPDIRECTSOUNDBUFFER8)(This->primary);
+ } else
+ WARN("PrimaryBufferImpl_Create failed\n");
}
} else {
- hres = SecondaryBuffer_Create(This, (IDirectSoundBufferImpl**)ppdsb, dsbd);
- if (hres != DS_OK)
- WARN("SecondaryBuffer_Create failed\n");
- else
- IDirectSoundBuffer_AddRef(*ppdsb);
+ IDirectSoundBufferImpl * dsb;
+ hres = IDirectSoundBufferImpl_Create(This, (IDirectSoundBufferImpl**)&dsb, dsbd);
+ if (dsb) {
+ hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
+ if (*ppdsb) {
+ dsb->dsb = (SecondaryBufferImpl*)*ppdsb;
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)*ppdsb);
+ } else
+ WARN("SecondaryBufferImpl_Create failed\n");
+ } else
+ WARN("IDirectSoundBufferImpl_Create failed\n");
}
return hres;
}
static HRESULT WINAPI IDirectSoundImpl_DuplicateSoundBuffer(
- LPDIRECTSOUND8 iface,LPDIRECTSOUNDBUFFER8 pdsb,LPLPDIRECTSOUNDBUFFER8 ppdsb
+ LPDIRECTSOUND8 iface,LPDIRECTSOUNDBUFFER8 psb,LPLPDIRECTSOUNDBUFFER8 ppdsb
) {
ICOM_THIS(IDirectSoundImpl,iface);
- IDirectSoundBufferImpl* ipdsb=(IDirectSoundBufferImpl*)pdsb;
+ IDirectSoundBufferImpl* pdsb;
IDirectSoundBufferImpl* dsb;
- TRACE("(%p,%p,%p)\n",This,pdsb,ppdsb);
+ HRESULT hres = DS_OK;
+ TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
if (This == NULL) {
WARN("invalid parameter: This == NULL\n");
return DSERR_INVALIDPARAM;
}
- if (pdsb == NULL) {
- WARN("invalid parameter: pdsb == NULL\n");
+ if (psb == NULL) {
+ WARN("invalid parameter: psb == NULL\n");
return DSERR_INVALIDPARAM;
}
@@ -570,13 +583,16 @@
return DSERR_INVALIDPARAM;
}
- if (ipdsb->dsbd.dwFlags & DSBCAPS_PRIMARYBUFFER) {
+ /* FIXME: hack to make sure we have a secondary buffer */
+ if ((DWORD)((SecondaryBufferImpl *)psb)->dsb == (DWORD)This) {
ERR("trying to duplicate primary buffer\n");
*ppdsb = NULL;
return DSERR_INVALIDCALL;
}
- if (ipdsb->hwbuf) {
+ pdsb = ((SecondaryBufferImpl *)psb)->dsb;
+
+ if (pdsb->hwbuf) {
FIXME("need to duplicate hardware buffer\n");
*ppdsb = NULL;
return DSERR_INVALIDCALL;
@@ -590,8 +606,8 @@
return DSERR_OUTOFMEMORY;
}
- memcpy(dsb, ipdsb, sizeof(IDirectSoundBufferImpl));
- dsb->ref = 1;
+ memcpy(dsb, pdsb, sizeof(IDirectSoundBufferImpl));
+ dsb->ref = 0;
dsb->state = STATE_STOPPED;
dsb->playpos = 0;
dsb->buf_mixpos = 0;
@@ -600,7 +616,8 @@
dsb->hwbuf = NULL;
dsb->ds3db = NULL;
dsb->iks = NULL; /* FIXME? */
- memcpy(&(dsb->wfx), &(ipdsb->wfx), sizeof(dsb->wfx));
+ dsb->dsb = NULL;
+ memcpy(&(dsb->wfx), &(pdsb->wfx), sizeof(dsb->wfx));
InitializeCriticalSection(&(dsb->lock));
/* register buffer */
RtlAcquireResourceExclusive(&(This->lock), TRUE);
@@ -613,7 +630,7 @@
TRACE("buffer count is now %d\n", This->nrofbuffers);
} else {
ERR("out of memory for buffer list! Current buffer count is %d\n", This->nrofbuffers);
- IDirectSoundBuffer8_Release(pdsb);
+ IDirectSoundBuffer8_Release(psb);
DeleteCriticalSection(&(dsb->lock));
RtlReleaseResource(&(This->lock));
HeapFree(GetProcessHeap(),0,dsb);
@@ -623,10 +640,15 @@
}
RtlReleaseResource(&(This->lock));
IDirectSound_AddRef(iface);
- *ppdsb = (LPDIRECTSOUNDBUFFER8)dsb;
- return DS_OK;
-}
+ hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
+ if (*ppdsb) {
+ dsb->dsb = (SecondaryBufferImpl*)*ppdsb;
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)*ppdsb);
+ } else
+ WARN("SecondaryBufferImpl_Create failed\n");
+ return hres;
+}
static HRESULT WINAPI IDirectSoundImpl_GetCaps(LPDIRECTSOUND8 iface,LPDSCAPS lpDSCaps) {
ICOM_THIS(IDirectSoundImpl,iface);
@@ -699,7 +721,6 @@
TRACE("(%p) ref was %ld, thread is %04lx\n", This, This->ref, GetCurrentThreadId());
ulReturn = InterlockedDecrement(&This->ref);
-
if (ulReturn == 0) {
HRESULT hres;
UINT i;
@@ -718,8 +739,10 @@
RtlReleaseResource(&(This->lock));
- if (This->primary)
+ if (This->primary) {
+ WARN("primary buffer not released\n");
IDirectSoundBuffer8_Release((LPDIRECTSOUNDBUFFER8)This->primary);
+ }
hres = DSOUND_PrimaryDestroy(This);
if (hres != DS_OK)
@@ -739,8 +762,9 @@
DeleteCriticalSection(&This->ds3dl_lock);
HeapFree(GetProcessHeap(),0,This);
dsound = NULL;
- return 0;
+ TRACE("(%p) released\n",This);
}
+
return ulReturn;
}
@@ -748,7 +772,11 @@
LPDIRECTSOUND8 iface,DWORD config
) {
ICOM_THIS(IDirectSoundImpl,iface);
- FIXME("(%p,0x%08lx):stub\n",This,config);
+ TRACE("(%p,0x%08lx)\n",This,config);
+
+ This->speaker_config = config;
+
+ WARN("not fully functional\n");
return DS_OK;
}
@@ -796,7 +824,16 @@
{
ICOM_THIS(IDirectSoundImpl,iface);
TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
- *lpdwSpeakerConfig = DSSPEAKER_STEREO | (DSSPEAKER_GEOMETRY_NARROW << 16);
+
+ if (lpdwSpeakerConfig == NULL) {
+ WARN("invalid parameter\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ WARN("not fully functional\n");
+
+ *lpdwSpeakerConfig = This->speaker_config;
+
return DS_OK;
}
@@ -883,6 +920,7 @@
if (dsound) {
if (IsEqualGUID(&devGuid, &dsound->guid) ) {
+ /* FIXME: this is wrong, need to create a new instance */
ERR("dsound already opened\n");
IDirectSound_AddRef((LPDIRECTSOUND)dsound);
*ippDS = dsound;
@@ -957,6 +995,7 @@
(*ippDS)->nrofbuffers = 0;
(*ippDS)->buffers = NULL;
(*ippDS)->primary = NULL;
+ (*ippDS)->speaker_config = DSSPEAKER_STEREO | (DSSPEAKER_GEOMETRY_NARROW << 16);
/* 3D listener initial parameters */
(*ippDS)->listener = NULL;
@@ -1115,15 +1154,7 @@
(DWORD)dsound, TIME_PERIODIC | TIME_CALLBACK_FUNCTION);
}
- /* create a user accessable primary buffer */
- (*ippDS)->dsbd.dwSize = sizeof((*ippDS)->dsbd);
- err = PrimaryBuffer_Create((*ippDS), (PrimaryBufferImpl**)&((*ippDS)->primary), &((*ippDS)->dsbd));
- if ((*ippDS)->primary)
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(*ippDS)->primary);
- else
- WARN("PrimaryBuffer_Create failed\n");
-
- return err;
+ return DS_OK;
}
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index f1fe3b9..f66cb4b 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -50,11 +50,13 @@
typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl;
typedef struct IDirectSoundFullDuplexImpl IDirectSoundFullDuplexImpl;
typedef struct IDirectSoundNotifyImpl IDirectSoundNotifyImpl;
+typedef struct IDirectSoundCaptureNotifyImpl IDirectSoundCaptureNotifyImpl;
typedef struct IDirectSound3DListenerImpl IDirectSound3DListenerImpl;
typedef struct IDirectSound3DBufferImpl IDirectSound3DBufferImpl;
typedef struct IKsBufferPropertySetImpl IKsBufferPropertySetImpl;
typedef struct IKsPrivatePropertySetImpl IKsPrivatePropertySetImpl;
typedef struct PrimaryBufferImpl PrimaryBufferImpl;
+typedef struct SecondaryBufferImpl SecondaryBufferImpl;
typedef struct IClassFactoryImpl IClassFactoryImpl;
/*****************************************************************************
@@ -87,6 +89,7 @@
DSVOLUMEPAN volpan;
PrimaryBufferImpl* primary;
DSBUFFERDESC dsbd;
+ DWORD speaker_config;
/* DirectSound3DListener fields */
IDirectSound3DListenerImpl* listener;
@@ -112,9 +115,8 @@
ICOM_VFIELD(IDirectSoundBuffer8);
DWORD ref;
/* IDirectSoundBufferImpl fields */
+ SecondaryBufferImpl* dsb;
IDirectSoundImpl* dsound;
- IDirectSound3DBufferImpl* ds3db;
- IKsBufferPropertySetImpl* iks;
CRITICAL_SECTION lock;
PIDSDRIVERBUFFER hwbuf;
WAVEFORMATEX wfx;
@@ -131,30 +133,56 @@
DWORD probably_valid_to, last_playpos;
DWORD primary_mixpos, buf_mixpos;
BOOL need_remix;
+
/* IDirectSoundNotifyImpl fields */
IDirectSoundNotifyImpl* notify;
+ LPDSBPOSITIONNOTIFY notifies;
+ int nrofnotifies;
+ PIDSDRIVERNOTIFY hwnotify;
/* DirectSound3DBuffer fields */
+ IDirectSound3DBufferImpl* ds3db;
DS3DBUFFER ds3db_ds3db;
LONG ds3db_lVolume;
BOOL ds3db_need_recalc;
+
+ /* IKsPropertySet fields */
+ IKsBufferPropertySetImpl* iks;
};
-HRESULT WINAPI SecondaryBuffer_Create(
- IDirectSoundImpl *This,
- IDirectSoundBufferImpl **pdsb,
- LPDSBUFFERDESC dsbd);
+HRESULT WINAPI IDirectSoundBufferImpl_Create(
+ IDirectSoundImpl *ds,
+ IDirectSoundBufferImpl **pdsb,
+ LPDSBUFFERDESC dsbd);
-struct PrimaryBufferImpl {
+/*****************************************************************************
+ * SecondaryBuffer implementation structure
+ */
+struct SecondaryBufferImpl
+{
+ ICOM_VFIELD(IDirectSoundBuffer8);
+ DWORD ref;
+ IDirectSoundBufferImpl* dsb;
+};
+
+HRESULT WINAPI SecondaryBufferImpl_Create(
+ IDirectSoundBufferImpl *dsb,
+ SecondaryBufferImpl **pdsb);
+
+/*****************************************************************************
+ * PrimaryBuffer implementation structure
+ */
+struct PrimaryBufferImpl
+{
ICOM_VFIELD(IDirectSoundBuffer8);
DWORD ref;
IDirectSoundImpl* dsound;
};
-HRESULT WINAPI PrimaryBuffer_Create(
- IDirectSoundImpl *This,
- PrimaryBufferImpl **pdsb,
- LPDSBUFFERDESC dsbd);
+HRESULT WINAPI PrimaryBufferImpl_Create(
+ IDirectSoundImpl *ds,
+ PrimaryBufferImpl **pdsb,
+ LPDSBUFFERDESC dsbd);
/*****************************************************************************
* IDirectSoundCapture implementation structure
@@ -208,8 +236,12 @@
/* FIXME: don't need this */
LPDSCBUFFERDESC pdscbd;
DWORD flags;
- /* IDirectSoundNotifyImpl fields */
- IDirectSoundNotifyImpl* notify;
+
+ /* IDirectSoundCaptureNotifyImpl fields */
+ IDirectSoundCaptureNotifyImpl* notify;
+ LPDSBPOSITIONNOTIFY notifies;
+ int nrofnotifies;
+ PIDSDRIVERNOTIFY hwnotify;
};
/*****************************************************************************
@@ -233,13 +265,28 @@
/* IUnknown fields */
ICOM_VFIELD(IDirectSoundNotify);
DWORD ref;
- /* IDirectSoundNotifyImpl fields */
- LPDSBPOSITIONNOTIFY notifies;
- int nrofnotifies;
-
- PIDSDRIVERNOTIFY hwnotify;
+ IDirectSoundBufferImpl* dsb;
};
+HRESULT WINAPI IDirectSoundNotifyImpl_Create(
+ IDirectSoundBufferImpl *dsb,
+ IDirectSoundNotifyImpl **pdsn);
+
+/*****************************************************************************
+ * IDirectSoundCaptureNotify implementation structure
+ */
+struct IDirectSoundCaptureNotifyImpl
+{
+ /* IUnknown fields */
+ ICOM_VFIELD(IDirectSoundNotify);
+ DWORD ref;
+ IDirectSoundCaptureBufferImpl* dscb;
+};
+
+HRESULT WINAPI IDirectSoundCaptureNotifyImpl_Create(
+ IDirectSoundCaptureBufferImpl *dscb,
+ IDirectSoundCaptureNotifyImpl ** pdscn);
+
/*****************************************************************************
* IDirectSound3DListener implementation structure
*/
@@ -253,8 +300,8 @@
};
HRESULT WINAPI IDirectSound3DListenerImpl_Create(
- PrimaryBufferImpl *This,
- IDirectSound3DListenerImpl **pdsl);
+ PrimaryBufferImpl *pb,
+ IDirectSound3DListenerImpl **pdsl);
/*****************************************************************************
* IKsBufferPropertySet implementation structure
@@ -269,8 +316,8 @@
};
HRESULT WINAPI IKsBufferPropertySetImpl_Create(
- IDirectSoundBufferImpl *This,
- IKsBufferPropertySetImpl **piks);
+ IDirectSoundBufferImpl *dsb,
+ IKsBufferPropertySetImpl **piks);
/*****************************************************************************
* IKsPrivatePropertySet implementation structure
@@ -283,7 +330,7 @@
};
HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
- IKsPrivatePropertySetImpl **piks);
+ IKsPrivatePropertySetImpl **piks);
/*****************************************************************************
* IDirectSound3DBuffer implementation structure
@@ -299,8 +346,8 @@
};
HRESULT WINAPI IDirectSound3DBufferImpl_Create(
- IDirectSoundBufferImpl *This,
- IDirectSound3DBufferImpl **pds3db);
+ IDirectSoundBufferImpl *dsb,
+ IDirectSound3DBufferImpl **pds3db);
/*******************************************************************************
* DirectSound ClassFactory implementation structure
@@ -356,6 +403,5 @@
extern IDirectSoundImpl* dsound;
extern IDirectSoundCaptureImpl* dsound_capture;
-extern ICOM_VTABLE(IDirectSoundNotify) dsnvt;
extern HRESULT mmErr(UINT err);
extern void setup_dsound_options(void);
diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c
index cf927e1..64191c3 100644
--- a/dlls/dsound/mixer.c
+++ b/dlls/dsound/mixer.c
@@ -68,6 +68,7 @@
void DSOUND_RecalcFormat(IDirectSoundBufferImpl *dsb)
{
DWORD sw;
+ TRACE("(%p)\n",dsb);
sw = dsb->wfx.nChannels * (dsb->wfx.wBitsPerSample / 8);
/* calculate the 10ms write lead */
@@ -79,14 +80,15 @@
int i;
DWORD offset;
LPDSBPOSITIONNOTIFY event;
+ TRACE("(%p,%d)\n",dsb,len);
- if (!dsb->notify || dsb->notify->nrofnotifies == 0)
+ if (dsb->nrofnotifies == 0)
return;
TRACE("(%p) buflen = %ld, playpos = %ld, len = %d\n",
dsb, dsb->buflen, dsb->playpos, len);
- for (i = 0; i < dsb->notify->nrofnotifies ; i++) {
- event = dsb->notify->notifies + i;
+ for (i = 0; i < dsb->nrofnotifies ; i++) {
+ event = dsb->notifies + i;
offset = event->dwOffset;
TRACE("checking %d, position %ld, event = %p\n",
i, offset, event->hEventNotify);
@@ -354,7 +356,7 @@
BYTE *buf, *ibuf, *obuf;
INT16 *ibufs, *obufs;
- TRACE("%p,%ld,%ld)\n",dsb,writepos,fraglen);
+ TRACE("(%p,%ld,%ld)\n",dsb,writepos,fraglen);
len = fraglen;
if (!(dsb->playflags & DSBPLAY_LOOPING)) {
@@ -440,6 +442,7 @@
INT advance = dsb->dsound->wfx.wBitsPerSample >> 3;
BYTE *buf, *ibuf, *obuf;
INT16 *ibufs, *obufs;
+ TRACE("(%p,%ld,%ld)\n",dsb,writepos,len);
nBlockAlign = dsb->dsound->wfx.nBlockAlign;
len = len / nBlockAlign * nBlockAlign; /* data alignment */
@@ -552,6 +555,7 @@
void DSOUND_ForceRemix(IDirectSoundBufferImpl *dsb)
{
+ TRACE("(%p)\n",dsb);
EnterCriticalSection(&dsb->lock);
if (dsb->state == STATE_PLAYING) {
#if 0 /* this may not be quite reliable yet */
@@ -585,6 +589,7 @@
DWORD buf_left = dsb->buflen - buf_writepos;
int still_behind;
+ TRACE("(%p,%ld,%ld,%ld)\n",dsb,playpos,writepos,mixlen);
TRACE("buf_writepos=%ld, primary_writepos=%ld\n", buf_writepos, writepos);
TRACE("buf_done=%ld, primary_done=%ld\n", buf_done, primary_done);
TRACE("buf_mixpos=%ld, primary_mixpos=%ld, mixlen=%ld\n", dsb->buf_mixpos, dsb->primary_mixpos,
@@ -724,7 +729,7 @@
INT i, len, maxlen = 0;
IDirectSoundBufferImpl *dsb;
- TRACE("(%ld,%ld,%ld)\n", playpos, writepos, mixlen);
+ TRACE("(%ld,%ld,%ld,%d)\n", playpos, writepos, mixlen, recover);
for (i = dsound->nrofbuffers - 1; i >= 0; i--) {
dsb = dsound->buffers[i];
@@ -808,6 +813,7 @@
static void DSOUND_CheckReset(IDirectSoundImpl *dsound, DWORD writepos)
{
+ TRACE("(%p,%ld)\n",dsound,writepos);
if (dsound->need_remix) {
DSOUND_MixReset(writepos);
dsound->need_remix = FALSE;
@@ -827,6 +833,7 @@
void DSOUND_WaveQueue(IDirectSoundImpl *dsound, DWORD mixq)
{
+ TRACE("(%p,%ld)\n",dsound,mixq);
if (mixq + dsound->pwqueue > ds_hel_queue) mixq = ds_hel_queue - dsound->pwqueue;
TRACE("queueing %ld buffers, starting at %d\n", mixq, dsound->pwwrite);
for (; mixq; mixq--) {
@@ -1034,6 +1041,7 @@
void CALLBACK DSOUND_callback(HWAVEOUT hwo, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
IDirectSoundImpl* This = (IDirectSoundImpl*)dwUser;
+ TRACE("(%p,%x,%lx,%lx,%lx)\n",hwo,msg,dwUser,dw1,dw2);
TRACE("entering at %ld, msg=%08x(%s)\n", GetTickCount(), msg,
msg==MM_WOM_DONE ? "MM_WOM_DONE" : msg==MM_WOM_CLOSE ? "MM_WOM_CLOSE" :
msg==MM_WOM_OPEN ? "MM_WOM_OPEN" : "UNKNOWN");
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index ef394c6..4abf248 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -303,7 +303,7 @@
/*******************************************************************************
- * IDirectSoundBuffer
+ * PrimaryBuffer
*/
/* This sets this format for the <em>Primary Buffer Only</em> */
/* See file:///cdrom/sdk52/docs/worddoc/dsound.doc page 120 */
@@ -573,9 +573,11 @@
TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
ref = InterlockedDecrement(&(This->ref));
- if (ref == -1) {
+ if (ref == 0) {
This->dsound->primary = NULL;
+ IDirectSound_Release((LPDIRECTSOUND)This->dsound);
HeapFree(GetProcessHeap(),0,This);
+ TRACE("(%p) released\n",This);
}
return ref;
@@ -942,16 +944,12 @@
}
if ( IsEqualGUID( &IID_IDirectSound3DListener, riid ) ) {
- if (This->dsound->dsbd.dwFlags & DSBCAPS_CTRL3D) {
- if (!This->dsound->listener)
- IDirectSound3DListenerImpl_Create(This, &This->dsound->listener);
-
+ if (!This->dsound->listener)
+ IDirectSound3DListenerImpl_Create(This, &This->dsound->listener);
+ if (This->dsound->listener) {
*ppobj = This->dsound->listener;
-
- if (This->dsound->listener) {
- IDirectSound3DListener_AddRef((LPDIRECTSOUND3DLISTENER)*ppobj);
- return S_OK;
- }
+ IDirectSound3DListener_AddRef((LPDIRECTSOUND3DLISTENER)*ppobj);
+ return S_OK;
}
WARN("IID_IDirectSound3DListener failed\n");
@@ -996,14 +994,14 @@
PrimaryBufferImpl_GetObjectInPath
};
-HRESULT WINAPI PrimaryBuffer_Create(
- IDirectSoundImpl *This,
+HRESULT WINAPI PrimaryBufferImpl_Create(
+ IDirectSoundImpl *ds,
PrimaryBufferImpl **pdsb,
LPDSBUFFERDESC dsbd)
{
PrimaryBufferImpl *dsb;
- TRACE("%p,%p,%p)\n",This,pdsb,dsbd);
+ TRACE("%p,%p,%p)\n",ds,pdsb,dsbd);
if (dsbd->lpwfxFormat) {
WARN("invalid parameter: dsbd->lpwfxFormat != NULL\n");
@@ -1019,19 +1017,20 @@
return DSERR_OUTOFMEMORY;
}
- dsb->ref = -1;
- dsb->dsound = This;
+ dsb->ref = 0;
+ dsb->dsound = ds;
dsb->lpVtbl = &dspbvt;
- memcpy(&This->dsbd, dsbd, sizeof(*dsbd));
+ memcpy(&ds->dsbd, dsbd, sizeof(*dsbd));
TRACE("Created primary buffer at %p\n", dsb);
TRACE("(formattag=0x%04x,chans=%d,samplerate=%ld,"
"bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
- This->wfx.wFormatTag, This->wfx.nChannels, This->wfx.nSamplesPerSec,
- This->wfx.nAvgBytesPerSec, This->wfx.nBlockAlign,
- This->wfx.wBitsPerSample, This->wfx.cbSize);
+ ds->wfx.wFormatTag, ds->wfx.nChannels, ds->wfx.nSamplesPerSec,
+ ds->wfx.nAvgBytesPerSec, ds->wfx.nBlockAlign,
+ ds->wfx.wBitsPerSample, ds->wfx.cbSize);
+ IDirectSound_AddRef((LPDIRECTSOUND)ds);
*pdsb = dsb;
return S_OK;
}
diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
index 55ec348..30adad2 100644
--- a/dlls/dsound/propset.c
+++ b/dlls/dsound/propset.c
@@ -72,9 +72,7 @@
ULONG ulReturn;
TRACE("(%p) ref was %ld\n", This, This->ref);
- ulReturn = InterlockedIncrement(&This->ref);
- if (ulReturn == 1)
- IDirectSoundBuffer_AddRef((LPDIRECTSOUND3DBUFFER)This->dsb);
+ ulReturn = InterlockedIncrement(&(This->ref));
return ulReturn;
}
@@ -85,10 +83,13 @@
TRACE("(%p) ref was %ld\n", This, This->ref);
ulReturn = InterlockedDecrement(&This->ref);
- if (ulReturn)
- return ulReturn;
- IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
- return 0;
+ if (!ulReturn) {
+ This->dsb->iks = 0;
+ IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
+ HeapFree(GetProcessHeap(),0,This);
+ TRACE("(%p) released\n",This);
+ }
+ return ulReturn;
}
static HRESULT WINAPI IKsBufferPropertySetImpl_Get(
@@ -146,16 +147,19 @@
};
HRESULT WINAPI IKsBufferPropertySetImpl_Create(
- IDirectSoundBufferImpl *This,
+ IDirectSoundBufferImpl *dsb,
IKsBufferPropertySetImpl **piks)
{
IKsBufferPropertySetImpl *iks;
iks = (IKsBufferPropertySetImpl*)HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
iks->ref = 0;
- iks->dsb = This;
+ iks->dsb = dsb;
+ dsb->iks = iks;
iks->lpVtbl = &iksbvt;
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb);
+
*piks = iks;
return S_OK;
}
diff --git a/dlls/dsound/sound3d.c b/dlls/dsound/sound3d.c
index 9b36601..2105bcf 100644
--- a/dlls/dsound/sound3d.c
+++ b/dlls/dsound/sound3d.c
@@ -395,10 +395,11 @@
TRACE("(%p) ref was %ld, thread is %04lx\n",This, This->ref, GetCurrentThreadId());
ulReturn = InterlockedDecrement(&This->ref);
if (!ulReturn) {
- IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)This);
This->dsb->ds3db = NULL;
+ IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)This->dsb);
DeleteCriticalSection(&(This->lock));
HeapFree(GetProcessHeap(),0,This);
+ TRACE("(%p) released\n",This);
}
return ulReturn;
@@ -766,11 +767,11 @@
};
HRESULT WINAPI IDirectSound3DBufferImpl_Create(
- IDirectSoundBufferImpl *This,
+ IDirectSoundBufferImpl *dsb,
IDirectSound3DBufferImpl **pds3db)
{
IDirectSound3DBufferImpl *ds3db;
- TRACE("(%p,%p)\n",This,pds3db);
+ TRACE("(%p,%p)\n",dsb,pds3db);
ds3db = (IDirectSound3DBufferImpl*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*ds3db));
@@ -781,7 +782,7 @@
}
ds3db->ref = 0;
- ds3db->dsb = This;
+ ds3db->dsb = dsb;
ds3db->lpVtbl = &ds3dbvt;
ds3db->dsb->ds3db_ds3db.dwSize = sizeof(DS3DBUFFER);
@@ -805,6 +806,8 @@
InitializeCriticalSection(&(ds3db->lock));
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)dsb);
+
*pds3db = ds3db;
return S_OK;
}
@@ -836,9 +839,13 @@
}
if ( IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
- *ppobj = This->dsound->primary;
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)*ppobj);
- return S_OK;
+ if (!This->dsound->primary)
+ PrimaryBufferImpl_Create(This->dsound, &(This->dsound->primary), &(This->dsound->dsbd));
+ if (This->dsound->primary) {
+ *ppobj = This->dsound->primary;
+ IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)*ppobj);
+ return S_OK;
+ }
}
FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
@@ -873,6 +880,7 @@
IDirectSound8_Release((LPDIRECTSOUND8)This->dsound);
This->dsound->listener = 0;
HeapFree(GetProcessHeap(),0,This);
+ TRACE("(%p) released\n",This);
}
return ulReturn;