Add mute setting (toggled by the mute key and in the volume menu) (#6415)
authorDTA7 <dta7e@t-online.de>
Tue, 26 Sep 2017 06:17:50 +0000 (08:17 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Tue, 26 Sep 2017 06:17:50 +0000 (08:17 +0200)
* Add mute setting (toggled by the mute key and in the volume menu)

builtin/settingtypes.txt
src/defaultsettings.cpp
src/game.cpp
src/guiVolumeChange.cpp

index 926a881fe5aa766098a7301963a11755a752c8bc..3e63aaca510d3592decb4c82fa96158242c4a4cb 100644 (file)
@@ -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]
index 5bba3bc80af07f88979e2c4f0fd77eff62bb517b..3c826dd2eba7412dcded0548aa5a75b4df22caed 100644 (file)
@@ -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");
index d85e34d35a1e1d1f8b247c9323ee4391d5645147..7d4dd0e044e8863afd5c0695c15f5b31b1674892 100644 (file)
@@ -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();
index c7868ad3554ce473aab57a8aff8eb35e6fbb00f7..8c462312bcc4c85bcaea1e99f9b3c84fadae6673 100644 (file)
@@ -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<s32> 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<s32> 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<s32> 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;
                }
-       }
-
-       if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
-               if (event.GUIEvent.Caller->getID() == ID_soundExitButton) {
-                       quitMenu();
+       } 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());
+                       }
+
+                       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;
+               if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
+                       if (event.GUIEvent.Caller->getID() == ID_soundExitButton) {
+                               quitMenu();
+                               return true;
+                       }
+                       Environment->setFocus(this);
+               }
 
-                       volume_text += core::stringw(pos) + core::stringw("%");
-                       e->setText(volume_text.c_str());
-                       return true;
+               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;