diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua index 1ff217534..b63b06234 100644 --- a/res/layouts/pages/settings_audio.xml.lua +++ b/res/layouts/pages/settings_audio.xml.lua @@ -1,4 +1,4 @@ -function create_setting(id, name, step, postfix) +function create_trackbar_setting(id, name, step, postfix) local info = app.get_setting_info(id) postfix = postfix or "" document.root:add(gui.template("track_setting", { @@ -10,10 +10,10 @@ function create_setting(id, name, step, postfix) step=step, postfix=postfix })) - update_setting(app.get_setting(id), id, name, postfix) + update_trackbar_label(app.get_setting(id), id, name, postfix) end -function update_setting(x, id, name, postfix) +function update_trackbar_label(x, id, name, postfix) app.set_setting(id, x) -- updating label document[id..".L"].text = string.format( @@ -24,12 +24,22 @@ function update_setting(x, id, name, postfix) ) end +function update_checkbox_setting(id, value) + app.set_setting(id, value) + + local recording_enabled = app.get_setting("audio.recording-enabled") + document.input_device_select.enabled = recording_enabled + document.input_volume_inner.enabled = recording_enabled + document.input_volume_outer.enabled = recording_enabled +end + function create_checkbox(id, name, tooltip) tooltip = tooltip or '' document.root:add(string.format( - "%s", + "%s", id, app.str_setting(id), gui.str(tooltip, "settings"), gui.str(name, "settings") )) + update_checkbox_setting(id, app.get_setting(id)) end local initialized = false @@ -55,11 +65,12 @@ function on_open() prev_amplitude = amplitude end) end - create_setting("audio.volume-master", "Master Volume", 0.01) - create_setting("audio.volume-regular", "Regular Sounds", 0.01) - create_setting("audio.volume-ui", "UI Sounds", 0.01) - create_setting("audio.volume-ambient", "Ambient", 0.01) - create_setting("audio.volume-music", "Music", 0.01) + create_trackbar_setting("audio.volume-master", "Master Volume", 0.01) + create_trackbar_setting("audio.volume-regular", "Regular Sounds", 0.01) + create_trackbar_setting("audio.volume-ui", "UI Sounds", 0.01) + create_trackbar_setting("audio.volume-ambient", "Ambient", 0.01) + create_trackbar_setting("audio.volume-music", "Music", 0.01) + document.root:add("") document.root:add("".. @@ -70,5 +70,5 @@ function on_open() create_checkbox("camera.inertia", "Camera Inertia") create_checkbox("camera.fov-effects", "Camera FOV Effects") create_checkbox("display.limit-fps-iconified", "Limit Background FPS") - create_setting("graphics.gamma", "Gamma", 0.05, "", "graphics.gamma.tooltip") + create_trackbar_setting("graphics.gamma", "Gamma", 0.05, "", "graphics.gamma.tooltip") end diff --git a/res/layouts/pages/settings_graphics.xml.lua b/res/layouts/pages/settings_graphics.xml.lua index 806f48d0c..6a4596a04 100644 --- a/res/layouts/pages/settings_graphics.xml.lua +++ b/res/layouts/pages/settings_graphics.xml.lua @@ -1,4 +1,4 @@ -function create_setting(id, name, step, postfix, tooltip, changeonrelease) +function create_trackbar_setting(id, name, step, postfix, tooltip, changeonrelease) local info = app.get_setting_info(id) postfix = postfix or "" tooltip = tooltip or "" @@ -14,10 +14,10 @@ function create_setting(id, name, step, postfix, tooltip, changeonrelease) tooltip=tooltip, changeonrelease=changeonrelease })) - update_setting(app.get_setting(id), id, name, postfix) + update_trackbar_label(app.get_setting(id), id, name, postfix) end -function update_setting(x, id, name, postfix) +function update_trackbar_label(x, id, name, postfix) -- updating label document[id..".L"].text = string.format( "%s: %s%s", @@ -36,15 +36,15 @@ function create_checkbox(id, name, tooltip) end 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_trackbar_setting("chunks.load-distance", "Load Distance", 1) + create_trackbar_setting("chunks.load-speed", "Load Speed", 1) + create_trackbar_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") create_checkbox("graphics.advanced-render", "Advanced render", "graphics.advanced-render.tooltip") - create_setting("graphics.ssao", "SSAO", 1, "", "graphics.ssao.tooltip") - create_setting("graphics.shadows-quality", "Shadows quality", 1) - create_setting("graphics.clouds-quality", "Clouds quality", 1) + create_trackbar_setting("graphics.ssao", "SSAO", 1, "", "graphics.ssao.tooltip") + create_trackbar_setting("graphics.shadows-quality", "Shadows quality", 1) + create_trackbar_setting("graphics.clouds-quality", "Clouds quality", 1) end diff --git a/res/layouts/templates/track_setting.xml b/res/layouts/templates/track_setting.xml index f01b8f842..79cdb41c1 100644 --- a/res/layouts/templates/track_setting.xml +++ b/res/layouts/templates/track_setting.xml @@ -3,5 +3,5 @@ + sub-consumer='function(x) update_trackbar_label(x, "%{id}", "%{name}", "%{postfix}") end'/> diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index cfc84ce00..d6e32d089 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -190,18 +190,34 @@ void audio::initialize( audio::get_channel(channel.name)->setVolume(value * value); }, true)); } - objects_keeper.keepAlive(settings.acousticEffects.observe([=](auto value) { + objects_keeper.keepAlive(settings.acousticEffects.observe([=](bool value) { if (value) return; backend->setAcoustics(audio::Acoustics {}); }, true)); - if (inputEnabled) { - ::input_device = backend->openInputDevice("", 44100, 1, 16); - ::input_enabled = true; - } - if (::input_device) { - ::input_device->startCapture(); - } + ::input_enabled = inputEnabled; + + objects_keeper.keepAlive(settings.recordingEnabled.observe([&settings](bool enabled) { + if (!::input_enabled) { + return; + } + if (!enabled && ::input_device == nullptr) { + return; + } + if (enabled) { + logger.info() << "recording enabled; input device is " + << settings.inputDevice.get(); + ::input_device = backend->openInputDevice( + settings.inputDevice.get(), 44100, 1, 16 + ); + ::input_device->startCapture(); + } else { + if (::input_device) { + ::input_device->stopCapture(); + } + ::input_device = nullptr; + } + }, true)); } InputDevice* audio::get_input_device() { diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 89a345ff6..879d95f0b 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -189,7 +189,7 @@ void Engine::initialize(CoreParameters coreParameters) { keepAlive(settings.audio.inputDevice.observe([](auto name) { audio::set_input_device(name == "auto" ? "" : name); - }, true)); + })); project->loadProjectStartScript(); if (!params.headless) { diff --git a/src/graphics/ui/elements/CheckBox.cpp b/src/graphics/ui/elements/CheckBox.cpp index 8694dc085..fe3a342dd 100644 --- a/src/graphics/ui/elements/CheckBox.cpp +++ b/src/graphics/ui/elements/CheckBox.cpp @@ -57,6 +57,10 @@ FullCheckBox::FullCheckBox( add(checkbox); + auto& checkboxActions = actions; label->setMargin(glm::vec4(5.f, 5.f, 0.f, 0.f)); + label->listenAction(UIAction::CLICK, [&checkboxActions](auto& gui) { + checkboxActions.notify(UIAction::CLICK, gui); + }); add(label); } diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp index 5f93e5be7..8e8b0a2dc 100644 --- a/src/io/settings_io.cpp +++ b/src/io/settings_io.cpp @@ -38,6 +38,7 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) { builder.addSection("audio"); builder.add("enabled", &settings.audio.enabled, false); + builder.add("recording-enabled", &settings.audio.recordingEnabled); builder.add("volume-master", &settings.audio.volumeMaster); builder.add("volume-regular", &settings.audio.volumeRegular); builder.add("volume-ui", &settings.audio.volumeUI); diff --git a/src/settings.hpp b/src/settings.hpp index 6c3df896a..5220ca328 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -10,6 +10,7 @@ struct AudioSettings { /// @brief try to initialize AL backend FlagSetting enabled {true}; + FlagSetting recordingEnabled {false}; NumberSetting volumeMaster {1.0f, 0.0f, 1.0f, setting_format::percent}; NumberSetting volumeRegular {1.0f, 0.0f, 1.0f, setting_format::percent};