dsound: Don't delete the primary buffer if a sub iface is still in use.
This commit is contained in:
parent
ffb51208e9
commit
c0565143f9
@ -1558,10 +1558,9 @@ HRESULT DirectSoundDevice_CreateSoundBuffer(
|
|||||||
device->dsbd.dwFlags |= DSBCAPS_LOCHARDWARE;
|
device->dsbd.dwFlags |= DSBCAPS_LOCHARDWARE;
|
||||||
else device->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE;
|
else device->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE;
|
||||||
hres = primarybuffer_create(device, &(device->primary), &(device->dsbd));
|
hres = primarybuffer_create(device, &(device->primary), &(device->dsbd));
|
||||||
if (device->primary) {
|
if (device->primary)
|
||||||
IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(device->primary));
|
*ppdsb = (IDirectSoundBuffer*)&device->primary->IDirectSoundBuffer8_iface;
|
||||||
*ppdsb = (LPDIRECTSOUNDBUFFER)(device->primary);
|
else
|
||||||
} else
|
|
||||||
WARN("primarybuffer_create() failed\n");
|
WARN("primarybuffer_create() failed\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -336,6 +336,7 @@ LPWAVEFORMATEX DSOUND_CopyFormat(LPCWAVEFORMATEX wfex) DECLSPEC_HIDDEN;
|
|||||||
HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) DECLSPEC_HIDDEN;
|
HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) DECLSPEC_HIDDEN;
|
||||||
HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl **ppdsb,
|
HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl **ppdsb,
|
||||||
const DSBUFFERDESC *dsbd) DECLSPEC_HIDDEN;
|
const DSBUFFERDESC *dsbd) DECLSPEC_HIDDEN;
|
||||||
|
void primarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* duplex.c */
|
/* duplex.c */
|
||||||
|
|
||||||
|
@ -769,20 +769,26 @@ static ULONG WINAPI PrimaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER iface)
|
|||||||
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
|
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
|
||||||
ULONG ref = InterlockedIncrement(&(This->ref));
|
ULONG ref = InterlockedIncrement(&(This->ref));
|
||||||
TRACE("(%p) ref was %d\n", This, ref - 1);
|
TRACE("(%p) ref was %d\n", This, ref - 1);
|
||||||
|
if(ref == 1)
|
||||||
|
InterlockedIncrement(&This->numIfaces);
|
||||||
return ref;
|
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)
|
static ULONG WINAPI PrimaryBufferImpl_Release(LPDIRECTSOUNDBUFFER iface)
|
||||||
{
|
{
|
||||||
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
|
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
|
||||||
DWORD ref = InterlockedDecrement(&(This->ref));
|
DWORD ref = InterlockedDecrement(&(This->ref));
|
||||||
TRACE("(%p) ref was %d\n", This, ref + 1);
|
TRACE("(%p) ref was %d\n", This, ref + 1);
|
||||||
|
|
||||||
if (!ref) {
|
if (!ref && !InterlockedDecrement(&This->numIfaces))
|
||||||
This->device->primary = NULL;
|
primarybuffer_destroy(This);
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
|
||||||
TRACE("(%p) released\n", This);
|
|
||||||
}
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1248,7 +1254,8 @@ HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl *
|
|||||||
return DSERR_OUTOFMEMORY;
|
return DSERR_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
dsb->ref = 0;
|
dsb->ref = 1;
|
||||||
|
dsb->numIfaces = 1;
|
||||||
dsb->device = device;
|
dsb->device = device;
|
||||||
dsb->IDirectSoundBuffer8_iface.lpVtbl = (IDirectSoundBuffer8Vtbl *)&dspbvt;
|
dsb->IDirectSoundBuffer8_iface.lpVtbl = (IDirectSoundBuffer8Vtbl *)&dspbvt;
|
||||||
|
|
||||||
|
@ -757,14 +757,10 @@ static HRESULT WINAPI IDirectSound3DListenerImpl_QueryInterface(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
|
if ( IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
|
||||||
if (!This->device->primary)
|
*ppobj = &This->device->primary->IDirectSoundBuffer8_iface;
|
||||||
primarybuffer_create(This->device, &This->device->primary, &This->device->dsbd);
|
IDirectSoundBuffer8_AddRef(&This->device->primary->IDirectSoundBuffer8_iface);
|
||||||
if (This->device->primary) {
|
|
||||||
*ppobj = This->device->primary;
|
|
||||||
IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)*ppobj);
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
|
FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
@ -774,7 +770,12 @@ static ULONG WINAPI IDirectSound3DListenerImpl_AddRef(LPDIRECTSOUND3DLISTENER if
|
|||||||
{
|
{
|
||||||
IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
|
IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
|
||||||
ULONG ref = InterlockedIncrement(&(This->ref));
|
ULONG ref = InterlockedIncrement(&(This->ref));
|
||||||
|
|
||||||
TRACE("(%p) ref was %d\n", This, ref - 1);
|
TRACE("(%p) ref was %d\n", This, ref - 1);
|
||||||
|
|
||||||
|
if(ref == 1)
|
||||||
|
InterlockedIncrement(&This->device->primary->numIfaces);
|
||||||
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -787,6 +788,8 @@ static ULONG WINAPI IDirectSound3DListenerImpl_Release(LPDIRECTSOUND3DLISTENER i
|
|||||||
if (!ref) {
|
if (!ref) {
|
||||||
This->device->listener = 0;
|
This->device->listener = 0;
|
||||||
HeapFree(GetProcessHeap(), 0, This);
|
HeapFree(GetProcessHeap(), 0, This);
|
||||||
|
if (!InterlockedDecrement(&This->device->primary->numIfaces))
|
||||||
|
primarybuffer_destroy(This->device->primary);
|
||||||
TRACE("(%p) released\n", This);
|
TRACE("(%p) released\n", This);
|
||||||
}
|
}
|
||||||
return ref;
|
return ref;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user