Commit b8599906 authored by David Reid's avatar David Reid

Fix some bugs when playing inlined sounds.

Public issue https://github.com/mackron/miniaudio/issues/340
parent 90c7eef4
...@@ -13397,7 +13397,7 @@ MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePa ...@@ -13397,7 +13397,7 @@ MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePa
ma_uint32 soundFlags = 0; ma_uint32 soundFlags = 0;
for (pNextSound = pEngine->pInlinedSoundHead; pNextSound != NULL; pNextSound = pNextSound->pNext) { 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 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. 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 ...@@ -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 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. 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) { if (pSound->pPrev != NULL) {
pSound->pPrev->pNext = pSound->pNext; pSound->pPrev->pNext = pSound->pNext;
} }
...@@ -13470,7 +13474,7 @@ MA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePa ...@@ -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); result = ma_sound_start(&pSound->sound);
if (result != MA_SUCCESS) { if (result != MA_SUCCESS) {
/* Failed to start the sound. We need to mark it for recycling and return an error. */ /* 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; return result;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment