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..15033c82e54 100644 --- a/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp +++ b/Core/GameEngine/Source/Common/Audio/AudioRequest.cpp @@ -30,5 +30,22 @@ AudioRequest::~AudioRequest() { + if (m_usePendingEvent) + { + delete m_pendingEvent; + } +} + +AudioEventRTS* AudioRequest::releasePendingEvent() +{ + DEBUG_ASSERTCRASH(m_usePendingEvent && m_pendingEvent, ("audio request was expected to contain valid audio event")); + 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..b06405bd791 100644 --- a/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp +++ b/Core/GameEngineDevice/Source/MilesAudioDevice/MilesAudioManager.cpp @@ -652,8 +652,10 @@ void MilesAudioManager::pauseAmbient( Bool shouldPause ) } //------------------------------------------------------------------------------------------------- -void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) +void MilesAudioManager::playAudioEvent( AudioRequest* req ) { + 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,16 +711,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; + audio->m_audioEventRTS = req->releasePendingEvent(); 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; } @@ -778,14 +780,14 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) sample3D = nullptr; } // Push it onto the list of playing things - audio->m_audioEventRTS = event; + audio->m_audioEventRTS = req->releasePendingEvent(); 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(); } @@ -849,14 +851,14 @@ void MilesAudioManager::playAudioEvent( AudioEventRTS *event ) } // Push it onto the list of playing things - audio->m_audioEventRTS = event; + audio->m_audioEventRTS = req->releasePendingEvent(); 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(); } @@ -2930,7 +2932,7 @@ void MilesAudioManager::processRequest( AudioRequest *req ) { case AR_Play: { - playAudioEvent(req->m_pendingEvent); + playAudioEvent(req); break; } case AR_Pause: