diff --git a/src/audio/sfx_buffer.cpp b/src/audio/sfx_buffer.cpp index c26bce769..c020f7dac 100644 --- a/src/audio/sfx_buffer.cpp +++ b/src/audio/sfx_buffer.cpp @@ -73,6 +73,8 @@ SFXBuffer::SFXBuffer(const std::string& file, bool SFXBuffer::load() { + if (m_loaded) return false; + alGetError(); // clear errors from previously alGenBuffers(1, &m_buffer); diff --git a/src/audio/sfx_buffer.hpp b/src/audio/sfx_buffer.hpp index 0df63f4f8..fa23a959b 100644 --- a/src/audio/sfx_buffer.hpp +++ b/src/audio/sfx_buffer.hpp @@ -71,7 +71,8 @@ public: } /** - * \brief load the buffer from file into OpenAL + * \brief load the buffer from file into OpenAL. + * \note If this buffer is already loaded, this call does nothing and returns false * \return whether loading was successful */ bool load(); diff --git a/src/audio/sfx_manager.cpp b/src/audio/sfx_manager.cpp index f75db1aa5..30776efc2 100644 --- a/src/audio/sfx_manager.cpp +++ b/src/audio/sfx_manager.cpp @@ -99,6 +99,23 @@ SFXManager::~SFXManager() } // ~SFXManager //---------------------------------------------------------------------------- + +void SFXManager::soundToggled(const bool on) +{ + // When activating SFX, load all buffers + if (on) + { + std::map::iterator i = m_all_sfx_types.begin(); + for (; i != m_all_sfx_types.end(); i++) + { + SFXBuffer* buffer = (*i).second; + buffer->load(); + } + } +} + +//---------------------------------------------------------------------------- + bool SFXManager::sfxAllowed() { if(!UserConfigParams::m_sfx || !m_initialized) diff --git a/src/audio/sfx_manager.hpp b/src/audio/sfx_manager.hpp index 3c01a771f..409124dc1 100644 --- a/src/audio/sfx_manager.hpp +++ b/src/audio/sfx_manager.hpp @@ -126,6 +126,9 @@ public: void positionListener(const Vec3 &position, const Vec3 &front); void quickSound(const std::string &soundName); + + /** Called when sound was muted/unmuted */ + void soundToggled(const bool newValue); }; diff --git a/src/states_screens/options_screen_audio.cpp b/src/states_screens/options_screen_audio.cpp index 5e488fc46..144fecd41 100644 --- a/src/states_screens/options_screen_audio.cpp +++ b/src/states_screens/options_screen_audio.cpp @@ -144,6 +144,7 @@ void OptionsScreenAudio::eventCallback(Widget* widget, const std::string& name, CheckBoxWidget* w = dynamic_cast(widget); UserConfigParams::m_sfx = w->getState(); + sfx_manager->soundToggled(UserConfigParams::m_sfx); } } // eventCallback