From 33f12a60914e980208b3427dc28ac739345fe3f7 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Wed, 29 Jan 2014 17:04:03 -0400 Subject: [PATCH] Source:play now returns false if alSourcePlay failed --- src/modules/audio/openal/Pool.cpp | 4 +--- src/modules/audio/openal/Source.cpp | 11 ++++++++++- src/modules/audio/openal/Source.h | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/modules/audio/openal/Pool.cpp b/src/modules/audio/openal/Pool.cpp index 8fde3785b..f8e613394 100644 --- a/src/modules/audio/openal/Pool.cpp +++ b/src/modules/audio/openal/Pool.cpp @@ -161,9 +161,7 @@ bool Pool::play(Source *source, ALuint &out) source->retain(); - source->playAtomic(); - - ok = true; + ok = source->playAtomic(); } else { diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 1ea4243aa..237cf02b1 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -513,7 +513,7 @@ bool Source::isLooping() const return looping; } -void Source::playAtomic() +bool Source::playAtomic() { if (type == TYPE_STATIC) { @@ -540,10 +540,19 @@ void Source::playAtomic() // of the new one. reset(); + // Clear errors. + alGetError(); + alSourcePlay(source); + // alSourcePlay may fail if the system has reached its limit of simultaneous + // playing sources. + bool success = alGetError() == AL_NO_ERROR; + valid = true; //if it fails it will be set to false again //but this prevents a horrible, horrible bug + + return success; } void Source::stopAtomic() diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index 911b57978..5591c6b85 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -118,7 +118,7 @@ public: virtual float getMaxDistance() const; virtual int getChannels() const; - void playAtomic(); + bool playAtomic(); void stopAtomic(); void pauseAtomic(); void resumeAtomic();