diff --git a/src/core/hle/DSOUND/DirectSound/DirectSound.hpp b/src/core/hle/DSOUND/DirectSound/DirectSound.hpp index 0a6cf8a19..c5f3be1cd 100644 --- a/src/core/hle/DSOUND/DirectSound/DirectSound.hpp +++ b/src/core/hle/DSOUND/DirectSound/DirectSound.hpp @@ -74,8 +74,12 @@ typedef struct _DSoundBuffer_Lock { // ****************************************************************** // * X_CDirectSoundBuffer // ****************************************************************** +struct XbHybridDSBuffer; struct EmuDirectSoundBuffer { + virtual ~EmuDirectSoundBuffer(); + XbHybridDSBuffer* pHybridThis; + union { PVOID pMpcxBuffer; @@ -118,6 +122,10 @@ struct SharedDSBuffer : DSBUFFER_S { emuDSBuffer = new EmuDirectSoundBuffer(); } EmuDirectSoundBuffer* emuDSBuffer; + + virtual ~SharedDSBuffer() { + delete emuDSBuffer; + } }; //Custom flags (4 bytes support up to 31 shifts,starting from 0) diff --git a/src/core/hle/DSOUND/DirectSound/DirectSoundBuffer.cpp b/src/core/hle/DSOUND/DirectSound/DirectSoundBuffer.cpp index 1a44f4f16..b0547dc63 100644 --- a/src/core/hle/DSOUND/DirectSound/DirectSoundBuffer.cpp +++ b/src/core/hle/DSOUND/DirectSound/DirectSoundBuffer.cpp @@ -109,6 +109,30 @@ ULONG WINAPI XTL::EMUPATCH(IDirectSoundBuffer_AddRef) return uRet; } +// ****************************************************************** +// * EmuDirectSoundBuffer destructor handler +// ****************************************************************** +XTL::EmuDirectSoundBuffer::~EmuDirectSoundBuffer() +{ + if (this->EmuDirectSound3DBuffer8 != nullptr) { + this->EmuDirectSound3DBuffer8->Release(); + } + + // remove cache entry + vector_ds_buffer::iterator ppDSBuffer = std::find(g_pDSoundBufferCache.begin(), g_pDSoundBufferCache.end(), this->pHybridThis); + if (ppDSBuffer != g_pDSoundBufferCache.end()) { + g_pDSoundBufferCache.erase(ppDSBuffer); + } + + if (this->EmuBufferDesc.lpwfxFormat != nullptr) { + free(this->EmuBufferDesc.lpwfxFormat); + } + if (this->X_BufferCache != xbnullptr && (this->EmuFlags & DSE_FLAG_BUFFER_EXTERNAL) == 0) { + free(this->X_BufferCache); + DSoundSGEMemDealloc(this->X_BufferCacheSize); + } +} + // ****************************************************************** // * patch: IDirectSoundBuffer_Release // ****************************************************************** @@ -127,27 +151,8 @@ ULONG WINAPI XTL::EMUPATCH(IDirectSoundBuffer_Release) uRet = pThis->EmuDirectSoundBuffer8->Release(); if (uRet == 0) { - if (pThis->EmuDirectSound3DBuffer8 != nullptr) { - pThis->EmuDirectSound3DBuffer8->Release(); - } - - // remove cache entry - vector_ds_buffer::iterator ppDSBuffer = std::find(g_pDSoundBufferCache.begin(), g_pDSoundBufferCache.end(), pHybridThis); - if (ppDSBuffer != g_pDSoundBufferCache.end()) { - g_pDSoundBufferCache.erase(ppDSBuffer); - } - - if (pThis->EmuBufferDesc.lpwfxFormat != nullptr) { - free(pThis->EmuBufferDesc.lpwfxFormat); - } - if (pThis->X_BufferCache != xbnullptr && (pThis->EmuFlags & DSE_FLAG_BUFFER_EXTERNAL) == 0) { - free(pThis->X_BufferCache); - DSoundSGEMemDealloc(pThis->X_BufferCacheSize); - } - size_t size = sizeof(SharedDSBuffer) - sizeof(XbHybridDSBuffer); SharedDSBuffer* pSharedThis = reinterpret_cast(reinterpret_cast(pHybridThis) - size); - delete pSharedThis->emuDSBuffer; delete pSharedThis; } //} @@ -212,6 +217,7 @@ HRESULT WINAPI XTL::EMUPATCH(DirectSoundCreateBuffer) XbHybridDSBuffer* pHybridBuffer = reinterpret_cast(&pBuffer->dsb_i); *ppBuffer = pHybridBuffer; EmuDirectSoundBuffer* pEmuBuffer = pBuffer->emuDSBuffer; + pEmuBuffer->pHybridThis = pHybridBuffer; DSoundBufferSetDefault(pEmuBuffer, 0, pdsbd->dwFlags); pEmuBuffer->Host_lock = { 0 };