diff --git a/src/SFML/Audio/ALCheck.cpp b/src/SFML/Audio/ALCheck.cpp index 1cd12ff5..3f009152 100644 --- a/src/SFML/Audio/ALCheck.cpp +++ b/src/SFML/Audio/ALCheck.cpp @@ -38,6 +38,15 @@ #endif #endif +namespace +{ + // A nested named namespace is used here to allow unity builds of SFML. + namespace AlCheckImpl + { + thread_local ALenum lastError(AL_NO_ERROR); + } +} + namespace sf { namespace priv @@ -50,6 +59,8 @@ void alCheckError(const std::filesystem::path& file, unsigned int line, const ch if (errorCode != AL_NO_ERROR) { + AlCheckImpl::lastError = errorCode; + std::string error = "Unknown error"; std::string description = "No description"; @@ -101,6 +112,13 @@ void alCheckError(const std::filesystem::path& file, unsigned int line, const ch } } + +//////////////////////////////////////////////////////////// +ALenum alGetLastErrorImpl() +{ + return std::exchange(AlCheckImpl::lastError, AL_NO_ERROR); +} + } // namespace priv } // namespace sf diff --git a/src/SFML/Audio/ALCheck.hpp b/src/SFML/Audio/ALCheck.hpp index f5a99ad1..6cb8cf32 100644 --- a/src/SFML/Audio/ALCheck.hpp +++ b/src/SFML/Audio/ALCheck.hpp @@ -56,11 +56,13 @@ namespace priv // If in debug mode, perform a test on every call // The do-while loop is needed so that alCheck can be used as a single statement in if/else branches #define alCheck(expr) do { expr; sf::priv::alCheckError(__FILE__, __LINE__, #expr); } while (false) + #define alGetLastError sf::priv::alGetLastErrorImpl #else // Else, we don't add any overhead #define alCheck(expr) (expr) + #define alGetLastError alGetError #endif @@ -75,6 +77,15 @@ namespace priv //////////////////////////////////////////////////////////// void alCheckError(const std::filesystem::path& file, unsigned int line, const char* expression); + +//////////////////////////////////////////////////////////// +/// Get the last OpenAL error on this thread +/// +/// \return The last OpenAL error on this thread +/// +//////////////////////////////////////////////////////////// +ALenum alGetLastErrorImpl(); + } // namespace priv } // namespace sf diff --git a/src/SFML/Audio/SoundStream.cpp b/src/SFML/Audio/SoundStream.cpp index 55b4573a..76e7d377 100644 --- a/src/SFML/Audio/SoundStream.cpp +++ b/src/SFML/Audio/SoundStream.cpp @@ -385,6 +385,15 @@ void SoundStream::streamData() } } + // Check if any error has occurred + if (alGetLastError() != AL_NO_ERROR) + { + // Abort streaming (exit main loop) + std::scoped_lock lock(m_threadMutex); + m_isStreaming = false; + break; + } + // Leave some time for the other threads if the stream is still playing if (SoundSource::getStatus() != Stopped) sleep(m_processingInterval);