Handle failing openal init properly, add enable_sound and sound_volume settings
authorPerttu Ahola <celeron55@gmail.com>
Fri, 6 Apr 2012 12:30:36 +0000 (15:30 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Fri, 6 Apr 2012 12:30:36 +0000 (15:30 +0300)
minetest.conf.example
src/defaultsettings.cpp
src/game.cpp
src/sound.h
src/sound_openal.cpp

index eb0ac63d9e1f58d9c33bacba9943dac6cdf92c7c..edc2222bb143b4a49b8c0bab53059581e126b484 100644 (file)
 #console_color = (0,0,0)
 # In-game chat console background alpha (opaqueness, between 0 and 255)
 #console_alpha = 200
+# Sound settings
+#enable_sound = true
+#sound_volume = 0.7
 
 #
 # Server stuff
index 8f1b8b6f05b5306efc6ef1b1c642c647b0b8d71a..67f2e4055805b7ca383d57d55d4c532dd35ebf58 100644 (file)
@@ -98,6 +98,8 @@ void set_default_settings(Settings *settings)
        settings->setDefault("opaque_water", "false");
        settings->setDefault("console_color", "(0,0,0)");
        settings->setDefault("console_alpha", "200");
+       settings->setDefault("enable_sound", "true");
+       settings->setDefault("sound_volume", "0.8");
 
        // Server stuff
        // "map-dir" doesn't exist by default.
index ec5881d2531d6caf70fa482cb995eff5540753b2..7d049edf089428dab43efc1d6170d5d336f612d3 100644 (file)
@@ -955,10 +955,14 @@ void the_game(
        ISoundManager *sound = NULL;
        bool sound_is_dummy = false;
 #if USE_SOUND
-       infostream<<"Attempting to use OpenAL audio"<<std::endl;
-       sound = createOpenALSoundManager(&soundfetcher);
-       if(!sound)
-               infostream<<"Failed to initialize OpenAL audio"<<std::endl;
+       if(g_settings->getBool("enable_sound")){
+               infostream<<"Attempting to use OpenAL audio"<<std::endl;
+               sound = createOpenALSoundManager(&soundfetcher);
+               if(!sound)
+                       infostream<<"Failed to initialize OpenAL audio"<<std::endl;
+       } else {
+               infostream<<"Sound disabled."<<std::endl;
+       }
 #endif
        if(!sound){
                infostream<<"Using dummy audio."<<std::endl;
@@ -2082,6 +2086,7 @@ void the_game(
                                v3f(0,0,0), // velocity
                                camera.getDirection(),
                                camera.getCameraNode()->getUpVector());
+               sound->setListenerGain(g_settings->getFloat("sound_volume"));
 
                /*
                        Update sound maker
index c342f4e5ef955dbcb9eb49b877541c3c3b07b285..c267a452f932fa218c0e6a5a20e2e7f8b27cd53d 100644 (file)
@@ -58,6 +58,7 @@ public:
                        const std::string &filedata) = 0;
 
        virtual void updateListener(v3f pos, v3f vel, v3f at, v3f up) = 0;
+       virtual void setListenerGain(float gain) = 0;
 
        // playSound functions return -1 on failure, otherwise a handle to the
        // sound. If name=="", call should be ignored without error.
@@ -83,6 +84,7 @@ public:
        virtual bool loadSoundData(const std::string &name,
                        const std::string &filedata) {return true;}
        void updateListener(v3f pos, v3f vel, v3f at, v3f up) {}
+       void setListenerGain(float gain) {}
        int playSound(const std::string &name, bool loop,
                        float volume) {return 0;}
        int playSoundAt(const std::string &name, bool loop,
index 66faf40c1a9f2e2cb488a6f6659fd29a26d99f9f..c74fa276c62c08c03c522e9d75c240b3a1ff5152 100644 (file)
@@ -198,12 +198,14 @@ private:
        std::map<int, PlayingSound*> m_sounds_playing;
        v3f m_listener_pos;
 public:
+       bool m_is_initialized;
        OpenALSoundManager(OnDemandSoundFetcher *fetcher):
                m_fetcher(fetcher),
                m_device(NULL),
                m_context(NULL),
                m_can_vorbis(false),
-               m_next_id(1)
+               m_next_id(1),
+               m_is_initialized(false)
        {
                ALCenum error = ALC_NO_ERROR;
                
@@ -252,6 +254,8 @@ public:
                infostream<<"Audio: Initialized: OpenAL "<<alGetString(AL_VERSION)
                                <<", using "<<alcGetString(m_device, ALC_DEVICE_SPECIFIER)
                                <<std::endl;
+
+               m_is_initialized = true;
        }
 
        ~OpenALSoundManager()
@@ -465,6 +469,11 @@ public:
                alListenerfv(AL_ORIENTATION, f);
                warn_if_error(alGetError(), "updateListener");
        }
+       
+       void setListenerGain(float gain)
+       {
+               alListenerf(AL_GAIN, gain);
+       }
 
        int playSound(const std::string &name, bool loop, float volume)
        {
@@ -519,6 +528,10 @@ public:
 
 ISoundManager *createOpenALSoundManager(OnDemandSoundFetcher *fetcher)
 {
-       return new OpenALSoundManager(fetcher);
+       OpenALSoundManager *m = new OpenALSoundManager(fetcher);
+       if(m->m_is_initialized)
+               return m;
+       delete m;
+       return NULL;
 };