diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 61aa3160f..934229746 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -919,27 +919,31 @@ bool Source::playAtomic(ALuint source) // Clear errors. alGetError(); - alSourcePlay(source); + // Seek to the current/pending offset before playing. If this call happens + // immediately after alSourcePlay it could introduce a click depending on + // the platform, because the source is asynchronously playing by then. + alSourcef(source, AL_SAMPLE_OFFSET, offsetSamples); bool success = alGetError() == AL_NO_ERROR; + alSourcePlay(source); + + success &= alGetError() == AL_NO_ERROR; + if (sourceType == TYPE_STREAM) { valid = true; //isPlaying() needs source to be valid if (!isPlaying()) success = false; } - else if (success) - { - alSourcef(source, AL_SAMPLE_OFFSET, offsetSamples); - success = alGetError() == AL_NO_ERROR; - } if (!success) { valid = true; //stop() needs source to be valid stop(); } + + // Static sources: reset the pending offset since it's not valid anymore. if (sourceType != TYPE_STREAM) offsetSamples = offsetSeconds = 0;