From 9eb163ab4f72fad234d47e9446f5608d1c5c02dc Mon Sep 17 00:00:00 2001 From: DTA7 Date: Tue, 26 Sep 2017 08:17:50 +0200 Subject: [PATCH] Add mute setting (toggled by the mute key and in the volume menu) (#6415) * Add mute setting (toggled by the mute key and in the volume menu) --- builtin/settingtypes.txt | 2 ++ src/defaultsettings.cpp | 1 + src/game.cpp | 31 ++++++++++-------- src/guiVolumeChange.cpp | 70 ++++++++++++++++++++++++++++------------ 4 files changed, 70 insertions(+), 34 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 926a881fe..3e63aaca5 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -763,6 +763,8 @@ enable_sound (Sound) bool true sound_volume (Volume) float 0.7 0.0 1.0 +mute_sound (Mute sound) bool false + [Client] [*Network] diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 5bba3bc80..3c826dd2e 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -37,6 +37,7 @@ void set_default_settings(Settings *settings) settings->setDefault("address", ""); settings->setDefault("enable_sound", "true"); settings->setDefault("sound_volume", "0.8"); + settings->setDefault("mute_sound", "false"); settings->setDefault("enable_mesh_cache", "false"); settings->setDefault("mesh_generation_interval", "0"); settings->setDefault("meshgen_block_cache_size", "20"); diff --git a/src/game.cpp b/src/game.cpp index d85e34d35..7d4dd0e04 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2553,14 +2553,12 @@ void Game::processKeyInput() } else if (wasKeyDown(KeyType::NOCLIP)) { toggleNoClip(); } else if (wasKeyDown(KeyType::MUTE)) { - float volume = g_settings->getFloat("sound_volume"); - if (volume < 0.001f) { - g_settings->setFloat("sound_volume", 1.0f); - showStatusTextSimple("Volume changed to 100%"); - } else { - g_settings->setFloat("sound_volume", 0.0f); - showStatusTextSimple("Volume changed to 0%"); - } + bool new_mute_sound = !g_settings->getBool("mute_sound"); + g_settings->setBool("mute_sound", new_mute_sound); + if (new_mute_sound) + showStatusTextSimple("Sound muted"); + else + showStatusTextSimple("Sound unmuted"); runData.statustext_time = 0; } else if (wasKeyDown(KeyType::INC_VOLUME)) { float new_volume = rangelim(g_settings->getFloat("sound_volume") + 0.1f, 0.0f, 1.0f); @@ -3558,13 +3556,18 @@ void Game::updateSound(f32 dtime) camera->getDirection(), camera->getCameraNode()->getUpVector()); - // Check if volume is in the proper range, else fix it. - float old_volume = g_settings->getFloat("sound_volume"); - float new_volume = rangelim(old_volume, 0.0f, 1.0f); - sound->setListenerGain(new_volume); + bool mute_sound = g_settings->getBool("mute_sound"); + if (mute_sound) { + sound->setListenerGain(0.0f); + } else { + // Check if volume is in the proper range, else fix it. + float old_volume = g_settings->getFloat("sound_volume"); + float new_volume = rangelim(old_volume, 0.0f, 1.0f); + sound->setListenerGain(new_volume); - if (old_volume != new_volume) { - g_settings->setFloat("sound_volume", new_volume); + if (old_volume != new_volume) { + g_settings->setFloat("sound_volume", new_volume); + } } LocalPlayer *player = client->getEnv().getLocalPlayer(); diff --git a/src/guiVolumeChange.cpp b/src/guiVolumeChange.cpp index c7868ad35..8c462312b 100644 --- a/src/guiVolumeChange.cpp +++ b/src/guiVolumeChange.cpp @@ -33,6 +33,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. const int ID_soundText = 263; const int ID_soundExitButton = 264; const int ID_soundSlider = 265; +const int ID_soundMuteButton = 266; GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env, gui::IGUIElement* parent, s32 id, @@ -85,7 +86,7 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize) */ { core::rect rect(0, 0, 160, 20); - rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 35); + rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 70); const wchar_t *text = wgettext("Sound Volume: "); core::stringw volume_text = text; @@ -105,12 +106,20 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize) } { core::rect rect(0, 0, 300, 20); - rect = rect + v2s32(size.X/2-150, size.Y/2); + rect = rect + v2s32(size.X / 2 - 150, size.Y / 2); gui::IGUIScrollBar *e = Environment->addScrollBar(true, rect, this, ID_soundSlider); e->setMax(100); e->setPos(volume); } + { + core::rect rect(0, 0, 160, 20); + rect = rect + v2s32(size.X / 2 - 80, size.Y / 2 - 35); + const wchar_t *text = wgettext("Muted"); + Environment->addCheckBox(g_settings->getBool("mute_sound"), rect, this, + ID_soundMuteButton, text); + delete[] text; + } } void GUIVolumeChange::drawMenu() @@ -136,29 +145,50 @@ bool GUIVolumeChange::OnEvent(const SEvent& event) quitMenu(); return true; } - } + } else if (event.EventType == EET_GUI_EVENT) { + if (event.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED) { + gui::IGUIElement *e = getElementFromId(ID_soundMuteButton); + if (e != NULL && e->getType() == gui::EGUIET_CHECK_BOX) { + g_settings->setBool("mute_sound", ((gui::IGUICheckBox*)e)->isChecked()); + } - if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) { - if (event.GUIEvent.Caller->getID() == ID_soundExitButton) { - quitMenu(); + Environment->setFocus(this); return true; } - } - if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) { - if (event.GUIEvent.Caller->getID() == ID_soundSlider) { - s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); - g_settings->setFloat("sound_volume", (float) pos / 100); - - gui::IGUIElement *e = getElementFromId(ID_soundText); - const wchar_t *text = wgettext("Sound Volume: "); - core::stringw volume_text = text; - delete [] text; - - volume_text += core::stringw(pos) + core::stringw("%"); - e->setText(volume_text.c_str()); - return true; + if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) { + if (event.GUIEvent.Caller->getID() == ID_soundExitButton) { + quitMenu(); + return true; + } + Environment->setFocus(this); } + + if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST + && isVisible()) { + if (!canTakeFocus(event.GUIEvent.Element)) { + dstream << "GUIMainMenu: Not allowing focus change." + << std::endl; + // Returning true disables focus change + return true; + } + } + if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) { + if (event.GUIEvent.Caller->getID() == ID_soundSlider) { + s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos(); + g_settings->setFloat("sound_volume", (float) pos / 100); + + gui::IGUIElement *e = getElementFromId(ID_soundText); + const wchar_t *text = wgettext("Sound Volume: "); + core::stringw volume_text = text; + delete [] text; + + volume_text += core::stringw(pos) + core::stringw("%"); + e->setText(volume_text.c_str()); + return true; + } + } + } return Parent ? Parent->OnEvent(event) : false;