From 36dcc03c112924353a309545536409b19d3c85fb Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 29 Nov 2023 23:27:42 +0100 Subject: [PATCH] Audio/OpenALDevice: Improve error when buffer/source creation fails --- include/Nazara/Audio/OpenALUtils.hpp | 24 +++++++++++++++++ src/Nazara/Audio/OpenALDevice.cpp | 15 +++++++++-- src/Nazara/Audio/OpenALUtils.cpp | 40 ++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 include/Nazara/Audio/OpenALUtils.hpp create mode 100644 src/Nazara/Audio/OpenALUtils.cpp diff --git a/include/Nazara/Audio/OpenALUtils.hpp b/include/Nazara/Audio/OpenALUtils.hpp new file mode 100644 index 000000000..53a0ed563 --- /dev/null +++ b/include/Nazara/Audio/OpenALUtils.hpp @@ -0,0 +1,24 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Audio module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_AUDIO_OPENALUTILS_HPP +#define NAZARA_AUDIO_OPENALUTILS_HPP + +#if defined(NAZARA_AUDIO_OPENAL) || defined(NAZARA_AUDIO_BUILD) + +#include +#include +#include +#include + +namespace Nz +{ + NAZARA_AUDIO_API std::string TranslateOpenALError(ALenum code); +} + +#endif // NAZARA_AUDIO_OPENAL + +#endif // NAZARA_AUDIO_OPENALUTILS_HPP diff --git a/src/Nazara/Audio/OpenALDevice.cpp b/src/Nazara/Audio/OpenALDevice.cpp index 7a85ec0df..ebf3133b4 100644 --- a/src/Nazara/Audio/OpenALDevice.cpp +++ b/src/Nazara/Audio/OpenALDevice.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -69,11 +70,16 @@ namespace Nz { MakeContextCurrent(); + m_library.alGetError(); // Clear error flags + ALuint bufferId = 0; m_library.alGenBuffers(1, &bufferId); - if (bufferId == 0) + if (ALenum lastError = m_library.alGetError(); lastError != AL_NO_ERROR) + { + NazaraErrorFmt("failed to create OpenAL buffer: {0}", TranslateOpenALError(lastError)); return {}; + } return std::make_shared(shared_from_this(), m_library, bufferId); } @@ -82,11 +88,16 @@ namespace Nz { MakeContextCurrent(); + m_library.alGetError(); // Clear error flags + ALuint sourceId = 0; m_library.alGenSources(1, &sourceId); - if (sourceId == 0) + if (ALenum lastError = m_library.alGetError(); lastError != AL_NO_ERROR) + { + NazaraErrorFmt("failed to create OpenAL source: {0}", TranslateOpenALError(lastError)); return {}; + } return std::make_shared(shared_from_this(), m_library, sourceId); } diff --git a/src/Nazara/Audio/OpenALUtils.cpp b/src/Nazara/Audio/OpenALUtils.cpp new file mode 100644 index 000000000..f031c8f9d --- /dev/null +++ b/src/Nazara/Audio/OpenALUtils.cpp @@ -0,0 +1,40 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - Audio module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include + +namespace Nz +{ + std::string TranslateOpenALError(ALenum code) + { + // From https://www.openal.org/documentation/OpenAL_Programmers_Guide.pdf + switch (code) + { + case AL_NO_ERROR: + return "No error"; + + case AL_INVALID_NAME: + return "A bad name (ID) was passed to an OpenAL function"; + + case AL_INVALID_ENUM: + return "An invalid enum value was passed to an OpenAL function"; + + case AL_INVALID_VALUE: + return "An invalid value was passed to an OpenAL function"; + + case AL_INVALID_OPERATION: + return "The requested operation is not valid"; + + case AL_OUT_OF_MEMORY: + return "The requested operation resulted in OpenAL running out of memory"; + + default: + break; + } + + return Format("Unknown OpenAL error ({0:#x})", code); + } +}