diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua index c9b4be4b6..37609a900 100644 --- a/res/layouts/pages/settings_audio.xml.lua +++ b/res/layouts/pages/settings_audio.xml.lua @@ -24,6 +24,14 @@ function update_setting(x, id, name, postfix) ) end +function create_checkbox(id, name, tooltip) + tooltip = tooltip or '' + document.root:add(string.format( + "%s", + id, app.str_setting(id), gui.str(tooltip, "settings"), gui.str(name, "settings") + )) +end + local initialized = false function on_open() @@ -71,4 +79,6 @@ function on_open() if info then selectbox.value = info.device_specifier end + + create_checkbox("audio.acoustic-effects", "Acoustic effects", "audio.acoustic-effects.tooltip") end diff --git a/res/layouts/pages/settings_graphics.xml.lua b/res/layouts/pages/settings_graphics.xml.lua index 3b7f7b13a..b8b9d5497 100644 --- a/res/layouts/pages/settings_graphics.xml.lua +++ b/res/layouts/pages/settings_graphics.xml.lua @@ -39,7 +39,7 @@ function on_open() create_setting("chunks.load-distance", "Load Distance", 1) create_setting("chunks.load-speed", "Load Speed", 1) create_setting("graphics.fog-curve", "Fog Curve", 0.1) - + create_checkbox("graphics.backlight", "Backlight", "graphics.backlight.tooltip") create_checkbox("graphics.soft-lighting", "Soft lighting", "graphics.soft-lighting.tooltip") create_checkbox("graphics.dense-render", "Dense blocks render", "graphics.dense-render.tooltip") diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index eba10df17..473e5bc49 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -481,8 +481,16 @@ bool ALSpeaker::isManuallyStopped() const { static bool alc_enumeration_ext = false; -ALAudio::ALAudio(ALCdevice* device, ALCcontext* context, bool useEffects) - : device(device), context(context), useEffects(useEffects) { +ALAudio::ALAudio( + ALCdevice* device, + ALCcontext* context, + bool useEffects, + const AudioSettings& settings +) + : device(device), + context(context), + settings(settings), + useEffects(useEffects) { ALCint size; alcGetIntegerv(device, ALC_ATTRIBUTES_SIZE, 1, &size); std::vector attrs(size); @@ -693,7 +701,7 @@ std::unique_ptr ALAudio::openInputDevice( ); } -std::unique_ptr ALAudio::create() { +std::unique_ptr ALAudio::create(const AudioSettings& settings) { alc_enumeration_ext = alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT"); ALCdevice* device = alcOpenDevice(nullptr); @@ -722,7 +730,7 @@ std::unique_ptr ALAudio::create() { logger.info() << "device supports " << sends << " aux sends per source"; logger.info() << "initialized"; - return std::make_unique(device, context, effects); + return std::make_unique(device, context, effects, settings); } uint ALAudio::getFreeSource() { @@ -787,6 +795,10 @@ void ALAudio::setAcoustics(Acoustics acoustics) { if (!useEffects) { return; } + if (!settings.acousticEffects.get()) { + alAuxiliaryEffectSloti(effectSlots[0], AL_EFFECTSLOT_EFFECT, 0); + return; + } int reverbEffect = effects[REVERB_EFFECT]; AL_CHECK(alEffectf( reverbEffect, diff --git a/src/audio/AL/ALAudio.hpp b/src/audio/AL/ALAudio.hpp index 6834db0f3..b405d1473 100644 --- a/src/audio/AL/ALAudio.hpp +++ b/src/audio/AL/ALAudio.hpp @@ -15,6 +15,8 @@ #include #include +struct AudioSettings; + namespace audio { struct ALBuffer; class ALAudio; @@ -177,6 +179,8 @@ namespace audio { uint maxSources = 256; uint maxEffectSlots = 64; + const AudioSettings& settings; + bool initEffects(); public: std::vector effectSlots; @@ -185,7 +189,12 @@ namespace audio { bool useEffects; - ALAudio(ALCdevice* device, ALCcontext* context, bool effects); + ALAudio( + ALCdevice* device, + ALCcontext* context, + bool effects, + const AudioSettings& settings + ); ~ALAudio(); uint getFreeSource(); @@ -226,6 +235,6 @@ namespace audio { return false; } - static std::unique_ptr create(); + static std::unique_ptr create(const AudioSettings& settings); }; } diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index a45a876f6..6523f76b6 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -159,7 +159,7 @@ void audio::initialize( enabled = enabled && settings.enabled.get(); if (enabled) { logger.info() << "initializing ALAudio backend"; - backend = ALAudio::create().release(); + backend = ALAudio::create(settings).release(); } if (backend == nullptr) { if (enabled) { diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index da0027c4d..8bd8402d8 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -44,6 +44,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.add("volume-ambient", &settings.audio.volumeAmbient); builder.add("volume-music", &settings.audio.volumeMusic); builder.add("input-device", &settings.audio.inputDevice); + builder.add("acoustic-effects", &settings.audio.acousticEffects); builder.addSection("display"); builder.add("width", &settings.display.width); diff --git a/src/settings.hpp b/src/settings.hpp index 0a0754235..ad597f76a 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -18,6 +18,8 @@ struct AudioSettings { NumberSetting volumeMusic {1.0f, 0.0f, 1.0f, setting_format::percent}; StringSetting inputDevice {"auto"}; + + FlagSetting acousticEffects {true}; }; struct DisplaySettings {