device->dsbd.dwFlags |= DSBCAPS_LOCHARDWARE;
else device->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE;
hres = primarybuffer_create(device, &(device->primary), &(device->dsbd));
- if (device->primary) {
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(device->primary));
- *ppdsb = (LPDIRECTSOUNDBUFFER)(device->primary);
- } else
+ if (device->primary)
+ *ppdsb = (IDirectSoundBuffer*)&device->primary->IDirectSoundBuffer8_iface;
+ else
WARN("primarybuffer_create() failed\n");
}
} else {
HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) DECLSPEC_HIDDEN;
HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl **ppdsb,
const DSBUFFERDESC *dsbd) DECLSPEC_HIDDEN;
+void primarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
/* duplex.c */
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
ULONG ref = InterlockedIncrement(&(This->ref));
TRACE("(%p) ref was %d\n", This, ref - 1);
+ if(ref == 1)
+ InterlockedIncrement(&This->numIfaces);
return ref;
}
+void primarybuffer_destroy(IDirectSoundBufferImpl *This)
+{
+ This->device->primary = NULL;
+ HeapFree(GetProcessHeap(), 0, This);
+ TRACE("(%p) released\n", This);
+}
+
static ULONG WINAPI PrimaryBufferImpl_Release(LPDIRECTSOUNDBUFFER iface)
{
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
DWORD ref = InterlockedDecrement(&(This->ref));
TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- This->device->primary = NULL;
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
+ if (!ref && !InterlockedDecrement(&This->numIfaces))
+ primarybuffer_destroy(This);
return ref;
}
return DSERR_OUTOFMEMORY;
}
- dsb->ref = 0;
+ dsb->ref = 1;
+ dsb->numIfaces = 1;
dsb->device = device;
dsb->IDirectSoundBuffer8_iface.lpVtbl = (IDirectSoundBuffer8Vtbl *)&dspbvt;
}
if ( IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
- if (!This->device->primary)
- primarybuffer_create(This->device, &This->device->primary, &This->device->dsbd);
- if (This->device->primary) {
- *ppobj = This->device->primary;
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)*ppobj);
- return S_OK;
- }
+ *ppobj = &This->device->primary->IDirectSoundBuffer8_iface;
+ IDirectSoundBuffer8_AddRef(&This->device->primary->IDirectSoundBuffer8_iface);
+ return S_OK;
}
FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
{
IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
ULONG ref = InterlockedIncrement(&(This->ref));
+
TRACE("(%p) ref was %d\n", This, ref - 1);
+
+ if(ref == 1)
+ InterlockedIncrement(&This->device->primary->numIfaces);
+
return ref;
}
if (!ref) {
This->device->listener = 0;
HeapFree(GetProcessHeap(), 0, This);
+ if (!InterlockedDecrement(&This->device->primary->numIfaces))
+ primarybuffer_destroy(This->device->primary);
TRACE("(%p) released\n", This);
}
return ref;