From b8599906b7ed7d99dce7ec0e7e5d61a0107808c4 Mon Sep 17 00:00:00 2001 From: David Reid Date: Sat, 10 Jul 2021 11:57:29 +1000 Subject: [PATCH] Fix some bugs when playing inlined sounds. Public issue https://github.com/mackron/miniaudio/issues/340 --- research/miniaudio_engine.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/research/miniaudio_engine.h b/research/miniaudio_engine.h index 0200eea9..df785622 100644 --- a/research/miniaudio_engine.h +++ b/research/miniaudio_engine.h @@ -13397,7 +13397,7 @@ MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePa ma_uint32 soundFlags = 0; for (pNextSound = pEngine->pInlinedSoundHead; pNextSound != NULL; pNextSound = pNextSound->pNext) { - if (c89atomic_load_8(&pNextSound->sound.atEnd)) { + if (ma_sound_at_end(&pNextSound->sound)) { /* The sound is at the end which means it's available for recycling. All we need to do is uninitialize it and reinitialize it. All we're doing is recycling memory. @@ -13413,6 +13413,10 @@ MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePa We actually want to detach the sound from the list here. The reason is because we want the sound to be in a consistent state at the non-recycled case to simplify the logic below. */ + if (pEngine->pInlinedSoundHead == pSound) { + pEngine->pInlinedSoundHead = pSound->pNext; + } + if (pSound->pPrev != NULL) { pSound->pPrev->pNext = pSound->pNext; } @@ -13470,7 +13474,7 @@ MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePa result = ma_sound_start(&pSound->sound); if (result != MA_SUCCESS) { /* Failed to start the sound. We need to mark it for recycling and return an error. */ - pSound->sound.atEnd = MA_TRUE; + c89atomic_exchange_8(&pSound->sound.atEnd, MA_TRUE); return result; }