diff --git a/Core/GameEngine/Include/Common/AudioRequest.h b/Core/GameEngine/Include/Common/AudioRequest.h index a0321fdb481..3174fe85a8a 100644 --- a/Core/GameEngine/Include/Common/AudioRequest.h +++ b/Core/GameEngine/Include/Common/AudioRequest.h @@ -45,6 +45,8 @@ struct AudioRequest : public MemoryPoolObject MEMORY_POOL_GLUE_WITH_USERLOOKUP_CREATE( AudioRequest, "AudioRequest" ) public: + AudioEventRTS* releasePendingEvent(); + RequestType m_request; union { diff --git a/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp b/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp index a3235e1b69a..36876f35449 100644 --- a/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp +++ b/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp @@ -30,5 +30,20 @@ AudioRequest::~AudioRequest() { + if (m_usePendingEvent) + { + delete m_pendingEvent; + } +} +AudioEventRTS* AudioRequest::releasePendingEvent() +{ + if (m_usePendingEvent) + { + m_usePendingEvent = false; + AudioEventRTS* event = m_pendingEvent; + m_pendingEvent = nullptr; + return event; + } + return nullptr; } diff --git a/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h b/Core/GameEngineDevice/Include/MilesAudioDevice/MilesAudioManager.h index 71707bd3054..2f4b2d7f66b 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( AudioRequest* req ); 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..d76113e8342 100644 --- a/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp +++ b/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp @@ -652,8 +652,12 @@ void MilesAudioManager::pauseAmbient( Bool shouldPause ) } //------------------------------------------------------------------------------------------------- -void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) +void MilesAudioManager::playAudioEvent( AudioRequest* req ) { + DEBUG_ASSERTCRASH(req->m_usePendingEvent && req->m_pendingEvent, ("audio request was expected to contain a valid audio event")); + + AudioEventRTS* event = req->m_pendingEvent; + #ifdef INTENSIVE_AUDIO_DEBUG DEBUG_LOG(("MILES (%d) - Processing play request: %d (%s)", TheGameLogic->getFrame(), event->getPlayingHandle(), event->getEventName().str())); #endif @@ -709,7 +713,7 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) } // Put this on here, so that the audio event RTS will be cleaned up regardless. - audio->m_audioEventRTS = event; + audio->m_audioEventRTS = event = req->releasePendingEvent(); audio->m_stream = stream; audio->m_type = PAT_Stream; @@ -778,7 +782,7 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) sample3D = nullptr; } // Push it onto the list of playing things - audio->m_audioEventRTS = event; + audio->m_audioEventRTS = event = req->releasePendingEvent(); audio->m_3DSample = sample3D; audio->m_file = nullptr; audio->m_type = PAT_3DSample; @@ -849,7 +853,7 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) } // Push it onto the list of playing things - audio->m_audioEventRTS = event; + audio->m_audioEventRTS = event = req->releasePendingEvent(); audio->m_sample = sample; audio->m_file = nullptr; audio->m_type = PAT_Sample; @@ -2930,7 +2934,7 @@ void MilesAudioManager::processRequest( AudioRequest *req ) { case AR_Play: { - playAudioEvent(req->m_pendingEvent); + playAudioEvent(req); break; } case AR_Pause: