Skip to content

Commit adcf69e

Browse files
authored
fix(memory): Fix audio event related memory leaks when pausing the game (TheSuperHackers#2731)
1 parent 92df977 commit adcf69e

4 files changed

Lines changed: 27 additions & 6 deletions

File tree

Core/GameEngine/Include/Common/AudioRequest.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ struct AudioRequest : public MemoryPoolObject
4545
MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( AudioRequest, "AudioRequest" )
4646

4747
public:
48+
AudioEventRTS* releasePendingEvent();
49+
4850
RequestType m_request;
4951
union
5052
{

Core/GameEngine/Source/Common/Audio/AudioRequest.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,20 @@
3030

3131
AudioRequest::~AudioRequest()
3232
{
33+
if (m_usePendingEvent)
34+
{
35+
delete m_pendingEvent;
36+
}
37+
}
3338

39+
AudioEventRTS* AudioRequest::releasePendingEvent()
40+
{
41+
if (m_usePendingEvent)
42+
{
43+
m_usePendingEvent = false;
44+
AudioEventRTS* event = m_pendingEvent;
45+
m_pendingEvent = nullptr;
46+
return event;
47+
}
48+
return nullptr;
3449
}

Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ class MilesAudioManager : public AudioManager
251251
void initSamplePools();
252252
void processRequest( AudioRequest *req );
253253

254-
void playAudioEvent( AudioEventRTS *event );
254+
void playAudioEvent( AudioRequest* req );
255255
void stopAudioEvent( AudioHandle handle );
256256
void pauseAudioEvent( AudioHandle handle );
257257

Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -652,8 +652,12 @@ void MilesAudioManager::pauseAmbient( Bool shouldPause )
652652
}
653653

654654
//-------------------------------------------------------------------------------------------------
655-
void MilesAudioManager::playAudioEvent( AudioEventRTS *event )
655+
void MilesAudioManager::playAudioEvent( AudioRequest* req )
656656
{
657+
DEBUG_ASSERTCRASH(req->m_usePendingEvent && req->m_pendingEvent, ("audio request was expected to contain a valid audio event"));
658+
659+
AudioEventRTS* event = req->m_pendingEvent;
660+
657661
#ifdef INTENSIVE_AUDIO_DEBUG
658662
DEBUG_LOG(("MILES (%d) - Processing play request: %d (%s)", TheGameLogic->getFrame(), event->getPlayingHandle(), event->getEventName().str()));
659663
#endif
@@ -709,7 +713,7 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event )
709713
}
710714

711715
// Put this on here, so that the audio event RTS will be cleaned up regardless.
712-
audio->m_audioEventRTS = event;
716+
audio->m_audioEventRTS = event = req->releasePendingEvent();
713717
audio->m_stream = stream;
714718
audio->m_type = PAT_Stream;
715719

@@ -778,7 +782,7 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event )
778782
sample3D = nullptr;
779783
}
780784
// Push it onto the list of playing things
781-
audio->m_audioEventRTS = event;
785+
audio->m_audioEventRTS = event = req->releasePendingEvent();
782786
audio->m_3DSample = sample3D;
783787
audio->m_file = nullptr;
784788
audio->m_type = PAT_3DSample;
@@ -849,7 +853,7 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event )
849853
}
850854

851855
// Push it onto the list of playing things
852-
audio->m_audioEventRTS = event;
856+
audio->m_audioEventRTS = event = req->releasePendingEvent();
853857
audio->m_sample = sample;
854858
audio->m_file = nullptr;
855859
audio->m_type = PAT_Sample;
@@ -2930,7 +2934,7 @@ void MilesAudioManager::processRequest( AudioRequest *req )
29302934
{
29312935
case AR_Play:
29322936
{
2933-
playAudioEvent(req->m_pendingEvent);
2937+
playAudioEvent(req);
29342938
break;
29352939
}
29362940
case AR_Pause:

0 commit comments

Comments
 (0)