diff --git a/Source/Engine/Audio/AudioSource.cpp b/Source/Engine/Audio/AudioSource.cpp index 97b991ee5..383616435 100644 --- a/Source/Engine/Audio/AudioSource.cpp +++ b/Source/Engine/Audio/AudioSource.cpp @@ -227,9 +227,11 @@ void AudioSource::Cleanup() _savedTime = GetTime(); Stop(); - AudioBackend::Source::Cleanup(this); - - SourceIDs.Clear(); + if (SourceIDs.HasItems()) + { + AudioBackend::Source::Cleanup(this); + SourceIDs.Clear(); + } } void AudioSource::OnClipChanged() @@ -239,13 +241,10 @@ void AudioSource::OnClipChanged() void AudioSource::OnClipLoaded() { - if (SourceIDs.IsEmpty()) - return; - AudioBackend::Source::ClipLoaded(this); // Start playing if source was waiting for the clip to load - if (_state == States::Playing && !_isActuallyPlayingSth) + if (SourceIDs.HasItems() && _state == States::Playing && !_isActuallyPlayingSth) { if (Clip->IsStreamable()) { diff --git a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp index a287f40f2..53a7cc3ba 100644 --- a/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp +++ b/Source/Engine/Audio/XAudio2/AudioBackendXAudio2.cpp @@ -230,6 +230,8 @@ namespace XAudio2 Source* GetSource(const AudioSource* source) { + if (source->SourceIDs.Count() == 0) + return nullptr; const AUDIO_SOURCE_ID_TYPE sourceId = source->SourceIDs[0]; // 0 is invalid ID so shift them return &Sources[sourceId - 1]; @@ -531,7 +533,7 @@ void AudioBackendXAudio2::Source_Cleanup(AudioSource* source) void AudioBackendXAudio2::Source_Play(AudioSource* source) { auto aSource = XAudio2::GetSource(source); - if (aSource && aSource->Voice) + if (aSource && aSource->Voice && !aSource->IsPlaying) { // Play aSource->Voice->Start(); @@ -542,7 +544,7 @@ void AudioBackendXAudio2::Source_Play(AudioSource* source) void AudioBackendXAudio2::Source_Pause(AudioSource* source) { auto aSource = XAudio2::GetSource(source); - if (aSource && aSource->Voice) + if (aSource && aSource->Voice && aSource->IsPlaying) { // Pause aSource->Voice->Stop();