From afb337c336950bd6c1e57ed76d022ff10a498965 Mon Sep 17 00:00:00 2001 From: Caball009 <82909616+Caball009@users.noreply.github.com> Date: Tue, 19 May 2026 23:16:18 +0200 Subject: [PATCH] fix(memory): Fix memory leak for audio events when pausing the game. --- .../Source/Common/Audio/AudioRequest.cpp | 5 ++++- .../Include/MilesAudioDevice/MilesAudioManager.h | 2 +- .../Source/MilesAudioDevice/MilesAudioManager.cpp | 15 +++++++++------ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp b/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp index a3235e1b69a..504a6381f28 100644 --- a/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp +++ b/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp @@ -30,5 +30,8 @@ AudioRequest::~AudioRequest() { - + if (m_usePendingEvent) + { + delete m_pendingEvent; + } } diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index 71707bd3054..fcd0d5fc21b 100644 --- a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h +++ b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h @@ -251,7 +251,7 @@ class MilesAudioManager : public AudioManager void initSamplePools(); void processRequest( AudioRequest *req ); - void playAudioEvent( AudioEventRTS *event ); + void playAudioEvent( AudioEventRTS*& event ); void stopAudioEvent( AudioHandle handle ); void pauseAudioEvent( AudioHandle handle ); diff --git a/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp b/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp index 3a541494959..7584bcabe9c 100644 --- a/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp +++ b/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp @@ -652,7 +652,7 @@ void MilesAudioManager::pauseAmbient( Bool shouldPause ) } //------------------------------------------------------------------------------------------------- -void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) +void MilesAudioManager::playAudioEvent( AudioEventRTS*& event ) { #ifdef INTENSIVE_AUDIO_DEBUG DEBUG_LOG(("MILES (%d) - Processing play request: %d (%s)", TheGameLogic->getFrame(), event->getPlayingHandle(), event->getEventName().str())); @@ -710,15 +710,16 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) // Put this on here, so that the audio event RTS will be cleaned up regardless. audio->m_audioEventRTS = event; + event = nullptr; audio->m_stream = stream; audio->m_type = PAT_Stream; if (stream) { - if ((info->m_soundType == AT_Streaming) && event->getUninterruptible()) { + if ((info->m_soundType == AT_Streaming) && audio->m_audioEventRTS->getUninterruptible()) { setDisallowSpeech(TRUE); } - AIL_set_stream_volume_pan(stream, getEffectiveVolume(event), 0.5f); - playStream(event, stream); + AIL_set_stream_volume_pan(stream, getEffectiveVolume(audio->m_audioEventRTS), 0.5f); + playStream(audio->m_audioEventRTS, stream); m_playingStreams.push_back(audio); audio = nullptr; } @@ -779,13 +780,14 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) } // Push it onto the list of playing things audio->m_audioEventRTS = event; + event = nullptr; audio->m_3DSample = sample3D; audio->m_file = nullptr; audio->m_type = PAT_3DSample; m_playing3DSounds.push_back(audio); if (sample3D) { - audio->m_file = playSample3D(event, sample3D); + audio->m_file = playSample3D(audio->m_audioEventRTS, sample3D); m_sound->notifyOf3DSampleStart(); } @@ -850,13 +852,14 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) // Push it onto the list of playing things audio->m_audioEventRTS = event; + event = nullptr; audio->m_sample = sample; audio->m_file = nullptr; audio->m_type = PAT_Sample; m_playingSounds.push_back(audio); if (sample) { - audio->m_file = playSample(event, sample); + audio->m_file = playSample(audio->m_audioEventRTS, sample); m_sound->notifyOf2DSampleStart(); }