create gc for EmuDirectSoundBuffer destructor

This commit is contained in:
RadWolfie 2020-05-14 18:38:05 -05:00
parent fad467196a
commit ada86a42b5
2 changed files with 33 additions and 19 deletions

View File

@ -74,8 +74,12 @@ typedef struct _DSoundBuffer_Lock {
// ****************************************************************** // ******************************************************************
// * X_CDirectSoundBuffer // * X_CDirectSoundBuffer
// ****************************************************************** // ******************************************************************
struct XbHybridDSBuffer;
struct EmuDirectSoundBuffer struct EmuDirectSoundBuffer
{ {
virtual ~EmuDirectSoundBuffer();
XbHybridDSBuffer* pHybridThis;
union union
{ {
PVOID pMpcxBuffer; PVOID pMpcxBuffer;
@ -118,6 +122,10 @@ struct SharedDSBuffer : DSBUFFER_S {
emuDSBuffer = new EmuDirectSoundBuffer(); emuDSBuffer = new EmuDirectSoundBuffer();
} }
EmuDirectSoundBuffer* emuDSBuffer; EmuDirectSoundBuffer* emuDSBuffer;
virtual ~SharedDSBuffer() {
delete emuDSBuffer;
}
}; };
//Custom flags (4 bytes support up to 31 shifts,starting from 0) //Custom flags (4 bytes support up to 31 shifts,starting from 0)

View File

@ -109,6 +109,30 @@ ULONG WINAPI XTL::EMUPATCH(IDirectSoundBuffer_AddRef)
return uRet; 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 // * patch: IDirectSoundBuffer_Release
// ****************************************************************** // ******************************************************************
@ -127,27 +151,8 @@ ULONG WINAPI XTL::EMUPATCH(IDirectSoundBuffer_Release)
uRet = pThis->EmuDirectSoundBuffer8->Release(); uRet = pThis->EmuDirectSoundBuffer8->Release();
if (uRet == 0) { 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); size_t size = sizeof(SharedDSBuffer) - sizeof(XbHybridDSBuffer);
SharedDSBuffer* pSharedThis = reinterpret_cast<SharedDSBuffer*>(reinterpret_cast<uint8_t*>(pHybridThis) - size); SharedDSBuffer* pSharedThis = reinterpret_cast<SharedDSBuffer*>(reinterpret_cast<uint8_t*>(pHybridThis) - size);
delete pSharedThis->emuDSBuffer;
delete pSharedThis; delete pSharedThis;
} }
//} //}
@ -212,6 +217,7 @@ HRESULT WINAPI XTL::EMUPATCH(DirectSoundCreateBuffer)
XbHybridDSBuffer* pHybridBuffer = reinterpret_cast<XbHybridDSBuffer*>(&pBuffer->dsb_i); XbHybridDSBuffer* pHybridBuffer = reinterpret_cast<XbHybridDSBuffer*>(&pBuffer->dsb_i);
*ppBuffer = pHybridBuffer; *ppBuffer = pHybridBuffer;
EmuDirectSoundBuffer* pEmuBuffer = pBuffer->emuDSBuffer; EmuDirectSoundBuffer* pEmuBuffer = pBuffer->emuDSBuffer;
pEmuBuffer->pHybridThis = pHybridBuffer;
DSoundBufferSetDefault(pEmuBuffer, 0, pdsbd->dwFlags); DSoundBufferSetDefault(pEmuBuffer, 0, pdsbd->dwFlags);
pEmuBuffer->Host_lock = { 0 }; pEmuBuffer->Host_lock = { 0 };