From 3c77edb68b705799e82c8e988b0ee9583ed41b70 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 26 May 2019 13:55:29 -0300 Subject: [PATCH] Fix modplug-decoded streaming Sources when looping repeatedly, and when stop() is called on them. Resolves issue #1493. --- src/modules/audio/openal/Source.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 87da99cfb..775a297d9 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -425,6 +425,18 @@ bool Source::update() unusedBuffers.push(buffer); } + while (!unusedBuffers.empty()) + { + ALuint b = unusedBuffers.top(); + if (streamAtomic(b, decoder.get()) > 0) + { + alSourceQueueBuffers(source, 1, &b); + unusedBuffers.pop(); + } + else + break; + } + return true; } return false; @@ -869,7 +881,8 @@ void Source::teardownAtomic() ALint queued = 0; ALuint buffers[MAX_BUFFERS]; - decoder->seek(0); + // Some decoders (e.g. ModPlug) can rewind() more reliably than seek(0). + decoder->rewind(); // Drain buffers. // NOTE: The Apple implementation of OpenAL on iOS doesn't return