diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua
index 29859819..eaa8b3fb 100644
--- a/res/layouts/pages/settings_audio.xml.lua
+++ b/res/layouts/pages/settings_audio.xml.lua
@@ -29,7 +29,7 @@ local initialized = false
function on_open()
if not initialized then
initialized = true
- local token = audio.input.__get_core_token()
+ local token = core.get_core_token()
document.root:add("")
local prev_amplitude = 0.0
document.tm:setInterval(16, function()
@@ -54,16 +54,18 @@ function on_open()
create_setting("audio.volume-music", "Music", 0.01)
document.root:add("")
document.root:add("")
+ "onselect='function(opt) core.set_setting(\"audio.input-device\", opt) end'/>")
document.root:add(""
..""
.."")
local selectbox = document.input_device_select
- local devices = {}
- local names = audio.get_input_devices_names()
+ local devices = {
+ {value="none", text=gui.str("None", "settings.microphone")},
+ }
+ local names = audio.__get_input_devices_names()
for i, name in ipairs(names) do
table.insert(devices, {value=name, text=name})
end
selectbox.options = devices
- selectbox.value = audio.get_input_info().device_specifier
+ selectbox.value = audio.__get_input_info().device_specifier
end
diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua
index b428785e..571bf32f 100644
--- a/res/scripts/stdlib.lua
+++ b/res/scripts/stdlib.lua
@@ -481,6 +481,7 @@ local __post_runnables = {}
local fn_audio_reset_fetch_buffer = audio.__reset_fetch_buffer
audio.__reset_fetch_buffer = nil
+core.get_core_token = audio.input.__get_core_token
function __process_post_runnables()
if #__post_runnables then
diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt
index 82bece38..1461f854 100644
--- a/res/texts/ru_RU.txt
+++ b/res/texts/ru_RU.txt
@@ -109,6 +109,7 @@ settings.Conflict=Найдены возможные конфликты
settings.Windowed=Оконный
settings.Borderless=Безрамочный
settings.Microphone=Микрофон
+settings.microphone.None=Нет
# Управление
chunks.reload=Перезагрузить Чанки
diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp
index e38c0f16..048a8630 100644
--- a/src/audio/AL/ALAudio.cpp
+++ b/src/audio/AL/ALAudio.cpp
@@ -74,8 +74,7 @@ ALInputDevice::ALInputDevice(
uint bitsPerSample,
uint sampleRate
)
- : al(al),
- device(device),
+ : device(device),
channels(channels),
bitsPerSample(bitsPerSample),
sampleRate(sampleRate) {
diff --git a/src/audio/AL/ALAudio.hpp b/src/audio/AL/ALAudio.hpp
index f154741f..5642f222 100644
--- a/src/audio/AL/ALAudio.hpp
+++ b/src/audio/AL/ALAudio.hpp
@@ -108,7 +108,6 @@ namespace audio {
size_t read(char* buffer, size_t bufferSize) override;
private:
- ALAudio* al;
ALCdevice* device;
uint channels;
uint bitsPerSample;
diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp
index 0069ff12..436fa1da 100644
--- a/src/audio/audio.cpp
+++ b/src/audio/audio.cpp
@@ -23,6 +23,7 @@ namespace {
std::unordered_map> streams;
std::vector> channels;
util::ObjectsKeeper objects_keeper {};
+ std::unique_ptr input_device = nullptr;
}
Channel::Channel(std::string name) : name(std::move(name)) {
@@ -151,8 +152,6 @@ public:
}
};
-static std::unique_ptr input_device = nullptr;
-
void audio::initialize(bool enabled, AudioSettings& settings) {
enabled = enabled && settings.enabled.get();
if (enabled) {
@@ -183,9 +182,9 @@ void audio::initialize(bool enabled, AudioSettings& settings) {
}, true));
}
- input_device = backend->openInputDevice("", 44100, 1, 16);
- if (input_device) {
- input_device->startCapture();
+ ::input_device = backend->openInputDevice("", 44100, 1, 16);
+ if (::input_device) {
+ ::input_device->startCapture();
}
}
@@ -270,18 +269,26 @@ std::vector audio::get_output_devices_names() {
}
void audio::set_input_device(const std::string& deviceName) {
+ logger.info() << "setting input device to " << deviceName;
+ if (deviceName == audio::DEVICE_NONE) {
+ if (::input_device) {
+ ::input_device->stopCapture();
+ }
+ ::input_device = nullptr;
+ return;
+ }
auto newDevice = backend->openInputDevice(deviceName, 44100, 1, 16);
if (newDevice == nullptr) {
logger.error() << "could not open input device: " << deviceName;
return;
}
- if (input_device) {
- input_device->stopCapture();
+ if (::input_device) {
+ ::input_device->stopCapture();
}
- input_device = std::move(newDevice);
- if (input_device) {
- input_device->startCapture();
+ ::input_device = std::move(newDevice);
+ if (::input_device) {
+ ::input_device->startCapture();
}
}
diff --git a/src/audio/audio.hpp b/src/audio/audio.hpp
index 2cd8c127..0ccd51f3 100644
--- a/src/audio/audio.hpp
+++ b/src/audio/audio.hpp
@@ -26,6 +26,8 @@ namespace audio {
constexpr inline size_t MAX_INPUT_SAMPLES = 22050;
+ inline std::string_view DEVICE_NONE = "none";
+
class Speaker;
/// @brief Audio speaker states
diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp
index 67ff6797..4239531e 100644
--- a/src/engine/Engine.cpp
+++ b/src/engine/Engine.cpp
@@ -175,6 +175,10 @@ void Engine::initialize(CoreParameters coreParameters) {
langs::setup(lang, paths->resPaths.collectRoots());
}, true));
+ keepAlive(settings.audio.inputDevice.observe([](auto name) {
+ audio::set_input_device(name == "auto" ? "" : name);
+ }, true));
+
project->loadProjectStartScript();
if (!params.headless) {
project->loadProjectClientScript();
diff --git a/src/io/settings_io.cpp b/src/io/settings_io.cpp
index 6e94db9f..bc9d3c0a 100644
--- a/src/io/settings_io.cpp
+++ b/src/io/settings_io.cpp
@@ -22,7 +22,7 @@ struct SectionsBuilder {
: map(map), sections(sections) {
}
- void section(std::string name) {
+ void addSection(std::string name) {
sections.push_back(Section {std::move(name), {}});
}
@@ -36,15 +36,16 @@ struct SectionsBuilder {
SettingsHandler::SettingsHandler(EngineSettings& settings) {
SectionsBuilder builder(map, sections);
- builder.section("audio");
+ builder.addSection("audio");
builder.add("enabled", &settings.audio.enabled, false);
builder.add("volume-master", &settings.audio.volumeMaster);
builder.add("volume-regular", &settings.audio.volumeRegular);
builder.add("volume-ui", &settings.audio.volumeUI);
builder.add("volume-ambient", &settings.audio.volumeAmbient);
builder.add("volume-music", &settings.audio.volumeMusic);
+ builder.add("input-device", &settings.audio.inputDevice);
- builder.section("display");
+ builder.addSection("display");
builder.add("width", &settings.display.width);
builder.add("height", &settings.display.height);
builder.add("samples", &settings.display.samples);
@@ -53,19 +54,19 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) {
builder.add("window-mode", &settings.display.windowMode);
builder.add("adaptive-menu-fps", &settings.display.adaptiveFpsInMenu);
- builder.section("camera");
+ builder.addSection("camera");
builder.add("sensitivity", &settings.camera.sensitivity);
builder.add("fov", &settings.camera.fov);
builder.add("fov-effects", &settings.camera.fovEffects);
builder.add("shaking", &settings.camera.shaking);
builder.add("inertia", &settings.camera.inertia);
- builder.section("chunks");
+ builder.addSection("chunks");
builder.add("load-distance", &settings.chunks.loadDistance);
builder.add("load-speed", &settings.chunks.loadSpeed);
builder.add("padding", &settings.chunks.padding);
- builder.section("graphics");
+ builder.addSection("graphics");
builder.add("fog-curve", &settings.graphics.fogCurve);
builder.add("backlight", &settings.graphics.backlight);
builder.add("dense-render", &settings.graphics.denseRender);
@@ -81,14 +82,14 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) {
builder.add("dense-render-distance", &settings.graphics.denseRenderDistance);
builder.add("soft-lighting", &settings.graphics.softLighting);
- builder.section("ui");
+ builder.addSection("ui");
builder.add("language", &settings.ui.language);
builder.add("world-preview-size", &settings.ui.worldPreviewSize);
- builder.section("pathfinding");
+ builder.addSection("pathfinding");
builder.add("steps-per-async-agent", &settings.pathfinding.stepsPerAsyncAgent);
- builder.section("debug");
+ builder.addSection("debug");
builder.add("generator-test-mode", &settings.debug.generatorTestMode);
builder.add("do-write-lights", &settings.debug.doWriteLights);
builder.add("do-trace-shaders", &settings.debug.doTraceShaders);
diff --git a/src/logic/LevelController.cpp b/src/logic/LevelController.cpp
index c8bf1a24..5851fada 100644
--- a/src/logic/LevelController.cpp
+++ b/src/logic/LevelController.cpp
@@ -27,8 +27,7 @@ LevelController::LevelController(
: settings(engine->getSettings()),
level(std::move(levelPtr)),
chunks(std::make_unique(*level)),
- playerTickClock(20, 3),
- localPlayer(clientPlayer) {
+ playerTickClock(20, 3) {
level->events->listen(LevelEventType::CHUNK_PRESENT, [](auto, Chunk* chunk) {
scripting::on_chunk_present(*chunk, chunk->flags.loaded);
diff --git a/src/logic/LevelController.hpp b/src/logic/LevelController.hpp
index c7b98623..60f50bf2 100644
--- a/src/logic/LevelController.hpp
+++ b/src/logic/LevelController.hpp
@@ -20,7 +20,6 @@ class LevelController {
std::unique_ptr chunks;
util::Clock playerTickClock;
- Player* localPlayer;
public:
LevelController(Engine* engine, std::unique_ptr level, Player* clientPlayer);
diff --git a/src/logic/scripting/lua/libs/libaudio.cpp b/src/logic/scripting/lua/libs/libaudio.cpp
index b80676c1..ba8595af 100644
--- a/src/logic/scripting/lua/libs/libaudio.cpp
+++ b/src/logic/scripting/lua/libs/libaudio.cpp
@@ -431,12 +431,6 @@ static int l_audio_get_output_devices_names(lua::State* L) {
return 1;
}
-static int l_audio_set_input_device(lua::State* L) {
- auto device_name = lua::tostring(L, 1);
- audio::set_input_device(device_name);
- return 0;
-}
-
static int l_audio_get_input_info(lua::State* L) {
auto device = audio::get_input_device();
if (device == nullptr) {
@@ -480,9 +474,8 @@ const luaL_Reg audiolib[] = {
{"count_speakers", lua::wrap},
{"count_streams", lua::wrap},
{"__fetch_input", lua::wrap},
- {"get_input_devices_names", lua::wrap},
- {"get_output_devices_names", lua::wrap},
- {"set_input_device", lua::wrap},
- {"get_input_info", lua::wrap},
+ {"__get_input_devices_names", lua::wrap},
+ {"__get_output_devices_names", lua::wrap},
+ {"__get_input_info", lua::wrap},
{nullptr, nullptr}
};
diff --git a/src/settings.hpp b/src/settings.hpp
index 9b3fa363..b47c47aa 100644
--- a/src/settings.hpp
+++ b/src/settings.hpp
@@ -16,6 +16,8 @@ struct AudioSettings {
NumberSetting volumeUI {1.0f, 0.0f, 1.0f, setting_format::percent};
NumberSetting volumeAmbient {1.0f, 0.0f, 1.0f, setting_format::percent};
NumberSetting volumeMusic {1.0f, 0.0f, 1.0f, setting_format::percent};
+
+ StringSetting inputDevice {"auto"};
};
struct DisplaySettings {