Skip to content

Commit

Permalink
Add sound volume when unfocused setting (#14083)
Browse files Browse the repository at this point in the history
This adds a new setting to set sound volume multiplier when Minetest window is unfocused/inactive (sound_volume_unfocused, located in Settings > Graphics and Audio > Audio > Volume when unfocused).

If the window is not focused, the sound volume will be multiplied by sound_volume_unfocused setting. The sound volume will be set back to sound_volume again when the window is focused.
  • Loading branch information
srifqi committed Dec 10, 2023
1 parent 321bcf5 commit 55fafb7
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 14 deletions.
3 changes: 3 additions & 0 deletions builtin/settingtypes.txt
Expand Up @@ -623,6 +623,9 @@ bloom_radius (Bloom Radius) float 1 0.1 8
# Requires the sound system to be enabled.
sound_volume (Volume) float 0.8 0.0 1.0

# Volume multiplier when the window is unfocused.
sound_volume_unfocused (Volume when unfocused) float 0.3 0.0 1.0

# Whether to mute sounds. You can unmute sounds at any time, unless the
# sound system is disabled (enable_sound=false).
# In-game, you can toggle the mute state with the mute key or by using the
Expand Down
14 changes: 1 addition & 13 deletions src/client/game.cpp
Expand Up @@ -3209,19 +3209,7 @@ void Game::updateSound(f32 dtime)
camera->getDirection(),
camera->getCameraNode()->getUpVector());

bool mute_sound = g_settings->getBool("mute_sound");
if (mute_sound) {
sound_manager->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_manager->setListenerGain(new_volume);

if (old_volume != new_volume) {
g_settings->setFloat("sound_volume", new_volume);
}
}
sound_volume_control(sound_manager.get(), device->isWindowActive());

// Tell the sound maker whether to make footstep sounds
soundmaker->makes_footstep_sound = player->makes_footstep_sound;
Expand Down
24 changes: 24 additions & 0 deletions src/client/sound.cpp
Expand Up @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "filesys.h"
#include "log.h"
#include "porting.h"
#include "settings.h"
#include "util/numeric.h"
#include <algorithm>
#include <string>
Expand Down Expand Up @@ -95,3 +96,26 @@ void ISoundManager::freeId(sound_handle_t id, u32 num_owners)
else
it->second -= num_owners;
}

void sound_volume_control(ISoundManager *sound_mgr, bool is_window_active)
{
bool mute_sound = g_settings->getBool("mute_sound");
if (mute_sound) {
sound_mgr->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);

if (old_volume != new_volume) {
g_settings->setFloat("sound_volume", new_volume);
}

if (!is_window_active) {
new_volume *= g_settings->getFloat("sound_volume_unfocused");
new_volume = rangelim(new_volume, 0.0f, 1.0f);
}

sound_mgr->setListenerGain(new_volume);
}
}
6 changes: 6 additions & 0 deletions src/client/sound.h
Expand Up @@ -184,3 +184,9 @@ class DummySoundManager final : public ISoundManager
void fadeSound(sound_handle_t sound, f32 step, f32 target_gain) override {}
void updateSoundPosVel(sound_handle_t sound, const v3f &pos, const v3f &vel) override {}
};

/**
* A helper function to control sound volume based on some values: sound volume
* settings, mute sound setting, and window activity.
*/
void sound_volume_control(ISoundManager *sound_mgr, bool is_window_active);
1 change: 1 addition & 0 deletions src/defaultsettings.cpp
Expand Up @@ -40,6 +40,7 @@ void set_default_settings()
settings->setDefault("address", "");
settings->setDefault("enable_sound", "true");
settings->setDefault("sound_volume", "0.8");
settings->setDefault("sound_volume_unfocused", "0.3");
settings->setDefault("mute_sound", "false");
settings->setDefault("enable_mesh_cache", "false");
settings->setDefault("mesh_generation_interval", "0");
Expand Down
4 changes: 3 additions & 1 deletion src/gui/guiEngine.cpp
Expand Up @@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <ICameraSceneNode.h>
#include "client/renderingengine.h"
#include "scripting_mainmenu.h"
#include "util/numeric.h"
#include "config.h"
#include "version.h"
#include "porting.h"
Expand Down Expand Up @@ -296,6 +295,7 @@ void GUIEngine::run()
driver->endScene();

IrrlichtDevice *device = m_rendering_engine->get_raw_device();

u32 frametime_min = 1000 / (device->isWindowFocused()
? g_settings->getFloat("fps_max")
: g_settings->getFloat("fps_max_unfocused"));
Expand All @@ -310,6 +310,8 @@ void GUIEngine::run()

m_script->step();

sound_volume_control(m_sound_manager.get(), device->isWindowActive());

m_sound_manager->step(dtime);

#ifdef __ANDROID__
Expand Down

1 comment on commit 55fafb7

@srifqi
Copy link
Member Author

@srifqi srifqi commented on 55fafb7 Dec 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: This commit also adds sound volume control to guiEngine.cpp which controls main menu sounds.

Please sign in to comment.