create gc for EmuDirectSoundBuffer destructor
This commit is contained in:
parent
fad467196a
commit
ada86a42b5
|
@ -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)
|
||||||
|
|
|
@ -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 };
|
||||||
|
|
Loading…
Reference in New Issue