]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/sound_openal.cpp
Fix broken client if openal cannot be opened (#9804)
[minetest.git] / src / client / sound_openal.cpp
index d0f935a7afd8914a36720f2a541ffb6b8637c1f8..20a651c1d4d63b024f8ff490715b911f48f44608 100644 (file)
@@ -275,25 +275,38 @@ class SoundManagerSingleton
                m_device(nullptr, delete_alcdevice),
                m_context(nullptr, delete_alccontext)
        {
-               if (!(m_device = unique_ptr_alcdevice(alcOpenDevice(nullptr), delete_alcdevice)))
-                       throw std::runtime_error("Audio: Global Initialization: Device Open");
+       }
+
+       bool init()
+       {
+               if (!(m_device = unique_ptr_alcdevice(alcOpenDevice(nullptr), delete_alcdevice))) {
+                       errorstream << "Audio: Global Initialization: Failed to open device" << std::endl;
+                       return false;
+               }
 
                if (!(m_context = unique_ptr_alccontext(
                                alcCreateContext(m_device.get(), nullptr), delete_alccontext))) {
-                       throw std::runtime_error("Audio: Global Initialization: Context Create");
+                       errorstream << "Audio: Global Initialization: Failed to create context" << std::endl;
+                       return false;
                }
 
-               if (!alcMakeContextCurrent(m_context.get()))
-                       throw std::runtime_error("Audio: Global Initialization: Context Current");
+               if (!alcMakeContextCurrent(m_context.get())) {
+                       errorstream << "Audio: Global Initialization: Failed to make current context" << std::endl;
+                       return false;
+               }
 
                alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
 
-               if (alGetError() != AL_NO_ERROR)
-                       throw std::runtime_error("Audio: Global Initialization: OpenAL Error");
+               if (alGetError() != AL_NO_ERROR) {
+                       errorstream << "Audio: Global Initialization: OpenAL Error " << alGetError() << std::endl;
+                       return false;
+               }
 
                infostream << "Audio: Global Initialized: OpenAL " << alGetString(AL_VERSION)
                        << ", using " << alcGetString(m_device.get(), ALC_DEVICE_SPECIFIER)
                        << std::endl;
+
+               return true;
        }
 
        ~SoundManagerSingleton()
@@ -682,7 +695,11 @@ class OpenALSoundManager: public ISoundManager
 
 std::shared_ptr<SoundManagerSingleton> createSoundManagerSingleton()
 {
-       return std::shared_ptr<SoundManagerSingleton>(new SoundManagerSingleton());
+       auto smg = std::make_shared<SoundManagerSingleton>();
+       if (!smg->init()) {
+               smg.reset();
+       }
+       return smg;
 }
 
 ISoundManager *createOpenALSoundManager(SoundManagerSingleton *smg, OnDemandSoundFetcher *fetcher)