aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/defaultsettings.cpp2
-rw-r--r--src/game.cpp13
-rw-r--r--src/sound.h2
-rw-r--r--src/sound_openal.cpp17
4 files changed, 28 insertions, 6 deletions
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 8f1b8b6f0..67f2e4055 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -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.
diff --git a/src/game.cpp b/src/game.cpp
index ec5881d25..7d049edf0 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -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
diff --git a/src/sound.h b/src/sound.h
index c342f4e5e..c267a452f 100644
--- a/src/sound.h
+++ b/src/sound.h
@@ -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,
diff --git a/src/sound_openal.cpp b/src/sound_openal.cpp
index 66faf40c1..c74fa276c 100644
--- a/src/sound_openal.cpp
+++ b/src/sound_openal.cpp
@@ -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;
};