From 8f9a4ef15dd00796aa4a0a931f2a7d6c44b6455b Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sun, 11 Sep 2011 22:29:37 +0200 Subject: [PATCH] Improve stop and rewind logic for openal --- src/modules/audio/openal/Pool.cpp | 1 + src/modules/audio/openal/Source.cpp | 63 ++++++++++++----------------- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index 7e9d46558..e20cbd05e 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -89,6 +89,7 @@ namespace openal if(!i->first->update()) { i->first->stopAtomic(); + i->first->rewindAtomic(); i->first->release(); available.push(i->second); playing.erase(i); diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 090472a84..399d271da 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -153,55 +153,42 @@ namespace openal alSourcei(source, AL_LOOPING, isLooping() ? AL_TRUE : AL_FALSE); return !isStopped(); } - else if (type == TYPE_STREAM) + else if (type == TYPE_STREAM && (isLooping() || !isFinished())) { - if (isLooping() || !isFinished()) + // Number of processed buffers. + ALint processed; + + alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); + + while(processed--) { - // Number of processed buffers. - ALint processed; + ALuint buffer; - alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); + float curOffsetSamples, curOffsetSecs; - while(processed--) - { - ALuint buffer; + alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples); - float curOffsetSamples, curOffsetSecs; + ALint b; + alGetSourcei(source, AL_BUFFER, &b); + int freq; + alGetBufferi(b, AL_FREQUENCY, &freq); + curOffsetSecs = curOffsetSamples / freq; - alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples); + // Get a free buffer. + alSourceUnqueueBuffers(source, 1, &buffer); - ALint b; - alGetSourcei(source, AL_BUFFER, &b); - int freq; - alGetBufferi(b, AL_FREQUENCY, &freq); - curOffsetSecs = curOffsetSamples / freq; + float newOffsetSamples, newOffsetSecs; - // Get a free buffer. - alSourceUnqueueBuffers(source, 1, &buffer); + alGetSourcef(source, AL_SAMPLE_OFFSET, &newOffsetSamples); + newOffsetSecs = newOffsetSamples / freq; - float newOffsetSamples, newOffsetSecs; + offsetSamples += (curOffsetSamples - newOffsetSamples); + offsetSeconds += (curOffsetSecs - newOffsetSecs); - alGetSourcef(source, AL_SAMPLE_OFFSET, &newOffsetSamples); - newOffsetSecs = newOffsetSamples / freq; - - offsetSamples += (curOffsetSamples - newOffsetSamples); - offsetSeconds += (curOffsetSecs - newOffsetSecs); - - streamAtomic(buffer, decoder); - alSourceQueueBuffers(source, 1, &buffer); - } - return true; - } - else - { - // Actually stop the source, - // 'just running out' is bad - // practice, and prevents - // rewinds. - stopAtomic(); - rewindAtomic(); - return false; + streamAtomic(buffer, decoder); + alSourceQueueBuffers(source, 1, &buffer); } + return true; } return false; }