Fix audio playback issues in some cases with XAudio backend

#675
This commit is contained in:
Wojciech Figat
2021-12-07 16:04:59 +01:00
parent b44b8955b3
commit 1b34b3b63a
2 changed files with 10 additions and 9 deletions

View File

@@ -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())
{

View File

@@ -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();