commit
3acb9f7409
@ -29,7 +29,7 @@ local initialized = false
|
|||||||
function on_open()
|
function on_open()
|
||||||
if not initialized then
|
if not initialized then
|
||||||
initialized = true
|
initialized = true
|
||||||
local token = audio.input.__get_core_token()
|
local token = core.get_core_token()
|
||||||
document.root:add("<container id='tm' />")
|
document.root:add("<container id='tm' />")
|
||||||
local prev_amplitude = 0.0
|
local prev_amplitude = 0.0
|
||||||
document.tm:setInterval(16, function()
|
document.tm:setInterval(16, function()
|
||||||
@ -54,16 +54,18 @@ function on_open()
|
|||||||
create_setting("audio.volume-music", "Music", 0.01)
|
create_setting("audio.volume-music", "Music", 0.01)
|
||||||
document.root:add("<label context='settings'>@Microphone</label>")
|
document.root:add("<label context='settings'>@Microphone</label>")
|
||||||
document.root:add("<select id='input_device_select' "..
|
document.root:add("<select id='input_device_select' "..
|
||||||
"onselect='function(opt) audio.set_input_device(opt) end'/>")
|
"onselect='function(opt) core.set_setting(\"audio.input-device\", opt) end'/>")
|
||||||
document.root:add("<container id='input_volume_outer' color='#000000' size='4'>"
|
document.root:add("<container id='input_volume_outer' color='#000000' size='4'>"
|
||||||
.."<container id='input_volume_inner' color='#00FF00FF' pos='1' size='2'/>"
|
.."<container id='input_volume_inner' color='#00FF00FF' pos='1' size='2'/>"
|
||||||
.."</container>")
|
.."</container>")
|
||||||
local selectbox = document.input_device_select
|
local selectbox = document.input_device_select
|
||||||
local devices = {}
|
local devices = {
|
||||||
local names = audio.get_input_devices_names()
|
{value="none", text=gui.str("None", "settings.microphone")},
|
||||||
|
}
|
||||||
|
local names = audio.__get_input_devices_names()
|
||||||
for i, name in ipairs(names) do
|
for i, name in ipairs(names) do
|
||||||
table.insert(devices, {value=name, text=name})
|
table.insert(devices, {value=name, text=name})
|
||||||
end
|
end
|
||||||
selectbox.options = devices
|
selectbox.options = devices
|
||||||
selectbox.value = audio.get_input_info().device_specifier
|
selectbox.value = audio.__get_input_info().device_specifier
|
||||||
end
|
end
|
||||||
|
|||||||
@ -481,6 +481,7 @@ local __post_runnables = {}
|
|||||||
|
|
||||||
local fn_audio_reset_fetch_buffer = audio.__reset_fetch_buffer
|
local fn_audio_reset_fetch_buffer = audio.__reset_fetch_buffer
|
||||||
audio.__reset_fetch_buffer = nil
|
audio.__reset_fetch_buffer = nil
|
||||||
|
core.get_core_token = audio.input.__get_core_token
|
||||||
|
|
||||||
function __process_post_runnables()
|
function __process_post_runnables()
|
||||||
if #__post_runnables then
|
if #__post_runnables then
|
||||||
|
|||||||
@ -109,6 +109,7 @@ settings.Conflict=Найдены возможные конфликты
|
|||||||
settings.Windowed=Оконный
|
settings.Windowed=Оконный
|
||||||
settings.Borderless=Безрамочный
|
settings.Borderless=Безрамочный
|
||||||
settings.Microphone=Микрофон
|
settings.Microphone=Микрофон
|
||||||
|
settings.microphone.None=Нет
|
||||||
|
|
||||||
# Управление
|
# Управление
|
||||||
chunks.reload=Перезагрузить Чанки
|
chunks.reload=Перезагрузить Чанки
|
||||||
|
|||||||
@ -74,8 +74,7 @@ ALInputDevice::ALInputDevice(
|
|||||||
uint bitsPerSample,
|
uint bitsPerSample,
|
||||||
uint sampleRate
|
uint sampleRate
|
||||||
)
|
)
|
||||||
: al(al),
|
: device(device),
|
||||||
device(device),
|
|
||||||
channels(channels),
|
channels(channels),
|
||||||
bitsPerSample(bitsPerSample),
|
bitsPerSample(bitsPerSample),
|
||||||
sampleRate(sampleRate) {
|
sampleRate(sampleRate) {
|
||||||
|
|||||||
@ -108,7 +108,6 @@ namespace audio {
|
|||||||
|
|
||||||
size_t read(char* buffer, size_t bufferSize) override;
|
size_t read(char* buffer, size_t bufferSize) override;
|
||||||
private:
|
private:
|
||||||
ALAudio* al;
|
|
||||||
ALCdevice* device;
|
ALCdevice* device;
|
||||||
uint channels;
|
uint channels;
|
||||||
uint bitsPerSample;
|
uint bitsPerSample;
|
||||||
|
|||||||
@ -23,6 +23,7 @@ namespace {
|
|||||||
std::unordered_map<speakerid_t, std::shared_ptr<Stream>> streams;
|
std::unordered_map<speakerid_t, std::shared_ptr<Stream>> streams;
|
||||||
std::vector<std::unique_ptr<Channel>> channels;
|
std::vector<std::unique_ptr<Channel>> channels;
|
||||||
util::ObjectsKeeper objects_keeper {};
|
util::ObjectsKeeper objects_keeper {};
|
||||||
|
std::unique_ptr<InputDevice> input_device = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel::Channel(std::string name) : name(std::move(name)) {
|
Channel::Channel(std::string name) : name(std::move(name)) {
|
||||||
@ -151,8 +152,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::unique_ptr<InputDevice> input_device = nullptr;
|
|
||||||
|
|
||||||
void audio::initialize(bool enabled, AudioSettings& settings) {
|
void audio::initialize(bool enabled, AudioSettings& settings) {
|
||||||
enabled = enabled && settings.enabled.get();
|
enabled = enabled && settings.enabled.get();
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
@ -183,9 +182,9 @@ void audio::initialize(bool enabled, AudioSettings& settings) {
|
|||||||
}, true));
|
}, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
input_device = backend->openInputDevice("", 44100, 1, 16);
|
::input_device = backend->openInputDevice("", 44100, 1, 16);
|
||||||
if (input_device) {
|
if (::input_device) {
|
||||||
input_device->startCapture();
|
::input_device->startCapture();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,18 +269,26 @@ std::vector<std::string> audio::get_output_devices_names() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void audio::set_input_device(const std::string& deviceName) {
|
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);
|
auto newDevice = backend->openInputDevice(deviceName, 44100, 1, 16);
|
||||||
if (newDevice == nullptr) {
|
if (newDevice == nullptr) {
|
||||||
logger.error() << "could not open input device: " << deviceName;
|
logger.error() << "could not open input device: " << deviceName;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input_device) {
|
if (::input_device) {
|
||||||
input_device->stopCapture();
|
::input_device->stopCapture();
|
||||||
}
|
}
|
||||||
input_device = std::move(newDevice);
|
::input_device = std::move(newDevice);
|
||||||
if (input_device) {
|
if (::input_device) {
|
||||||
input_device->startCapture();
|
::input_device->startCapture();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,8 @@ namespace audio {
|
|||||||
|
|
||||||
constexpr inline size_t MAX_INPUT_SAMPLES = 22050;
|
constexpr inline size_t MAX_INPUT_SAMPLES = 22050;
|
||||||
|
|
||||||
|
inline std::string_view DEVICE_NONE = "none";
|
||||||
|
|
||||||
class Speaker;
|
class Speaker;
|
||||||
|
|
||||||
/// @brief Audio speaker states
|
/// @brief Audio speaker states
|
||||||
|
|||||||
@ -175,6 +175,10 @@ void Engine::initialize(CoreParameters coreParameters) {
|
|||||||
langs::setup(lang, paths->resPaths.collectRoots());
|
langs::setup(lang, paths->resPaths.collectRoots());
|
||||||
}, true));
|
}, true));
|
||||||
|
|
||||||
|
keepAlive(settings.audio.inputDevice.observe([](auto name) {
|
||||||
|
audio::set_input_device(name == "auto" ? "" : name);
|
||||||
|
}, true));
|
||||||
|
|
||||||
project->loadProjectStartScript();
|
project->loadProjectStartScript();
|
||||||
if (!params.headless) {
|
if (!params.headless) {
|
||||||
project->loadProjectClientScript();
|
project->loadProjectClientScript();
|
||||||
|
|||||||
@ -22,7 +22,7 @@ struct SectionsBuilder {
|
|||||||
: map(map), sections(sections) {
|
: map(map), sections(sections) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void section(std::string name) {
|
void addSection(std::string name) {
|
||||||
sections.push_back(Section {std::move(name), {}});
|
sections.push_back(Section {std::move(name), {}});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,15 +36,16 @@ struct SectionsBuilder {
|
|||||||
SettingsHandler::SettingsHandler(EngineSettings& settings) {
|
SettingsHandler::SettingsHandler(EngineSettings& settings) {
|
||||||
SectionsBuilder builder(map, sections);
|
SectionsBuilder builder(map, sections);
|
||||||
|
|
||||||
builder.section("audio");
|
builder.addSection("audio");
|
||||||
builder.add("enabled", &settings.audio.enabled, false);
|
builder.add("enabled", &settings.audio.enabled, false);
|
||||||
builder.add("volume-master", &settings.audio.volumeMaster);
|
builder.add("volume-master", &settings.audio.volumeMaster);
|
||||||
builder.add("volume-regular", &settings.audio.volumeRegular);
|
builder.add("volume-regular", &settings.audio.volumeRegular);
|
||||||
builder.add("volume-ui", &settings.audio.volumeUI);
|
builder.add("volume-ui", &settings.audio.volumeUI);
|
||||||
builder.add("volume-ambient", &settings.audio.volumeAmbient);
|
builder.add("volume-ambient", &settings.audio.volumeAmbient);
|
||||||
builder.add("volume-music", &settings.audio.volumeMusic);
|
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("width", &settings.display.width);
|
||||||
builder.add("height", &settings.display.height);
|
builder.add("height", &settings.display.height);
|
||||||
builder.add("samples", &settings.display.samples);
|
builder.add("samples", &settings.display.samples);
|
||||||
@ -53,19 +54,19 @@ SettingsHandler::SettingsHandler(EngineSettings& settings) {
|
|||||||
builder.add("window-mode", &settings.display.windowMode);
|
builder.add("window-mode", &settings.display.windowMode);
|
||||||
builder.add("adaptive-menu-fps", &settings.display.adaptiveFpsInMenu);
|
builder.add("adaptive-menu-fps", &settings.display.adaptiveFpsInMenu);
|
||||||
|
|
||||||
builder.section("camera");
|
builder.addSection("camera");
|
||||||
builder.add("sensitivity", &settings.camera.sensitivity);
|
builder.add("sensitivity", &settings.camera.sensitivity);
|
||||||
builder.add("fov", &settings.camera.fov);
|
builder.add("fov", &settings.camera.fov);
|
||||||
builder.add("fov-effects", &settings.camera.fovEffects);
|
builder.add("fov-effects", &settings.camera.fovEffects);
|
||||||
builder.add("shaking", &settings.camera.shaking);
|
builder.add("shaking", &settings.camera.shaking);
|
||||||
builder.add("inertia", &settings.camera.inertia);
|
builder.add("inertia", &settings.camera.inertia);
|
||||||
|
|
||||||
builder.section("chunks");
|
builder.addSection("chunks");
|
||||||
builder.add("load-distance", &settings.chunks.loadDistance);
|
builder.add("load-distance", &settings.chunks.loadDistance);
|
||||||
builder.add("load-speed", &settings.chunks.loadSpeed);
|
builder.add("load-speed", &settings.chunks.loadSpeed);
|
||||||
builder.add("padding", &settings.chunks.padding);
|
builder.add("padding", &settings.chunks.padding);
|
||||||
|
|
||||||
builder.section("graphics");
|
builder.addSection("graphics");
|
||||||
builder.add("fog-curve", &settings.graphics.fogCurve);
|
builder.add("fog-curve", &settings.graphics.fogCurve);
|
||||||
builder.add("backlight", &settings.graphics.backlight);
|
builder.add("backlight", &settings.graphics.backlight);
|
||||||
builder.add("dense-render", &settings.graphics.denseRender);
|
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("dense-render-distance", &settings.graphics.denseRenderDistance);
|
||||||
builder.add("soft-lighting", &settings.graphics.softLighting);
|
builder.add("soft-lighting", &settings.graphics.softLighting);
|
||||||
|
|
||||||
builder.section("ui");
|
builder.addSection("ui");
|
||||||
builder.add("language", &settings.ui.language);
|
builder.add("language", &settings.ui.language);
|
||||||
builder.add("world-preview-size", &settings.ui.worldPreviewSize);
|
builder.add("world-preview-size", &settings.ui.worldPreviewSize);
|
||||||
|
|
||||||
builder.section("pathfinding");
|
builder.addSection("pathfinding");
|
||||||
builder.add("steps-per-async-agent", &settings.pathfinding.stepsPerAsyncAgent);
|
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("generator-test-mode", &settings.debug.generatorTestMode);
|
||||||
builder.add("do-write-lights", &settings.debug.doWriteLights);
|
builder.add("do-write-lights", &settings.debug.doWriteLights);
|
||||||
builder.add("do-trace-shaders", &settings.debug.doTraceShaders);
|
builder.add("do-trace-shaders", &settings.debug.doTraceShaders);
|
||||||
|
|||||||
@ -27,8 +27,7 @@ LevelController::LevelController(
|
|||||||
: settings(engine->getSettings()),
|
: settings(engine->getSettings()),
|
||||||
level(std::move(levelPtr)),
|
level(std::move(levelPtr)),
|
||||||
chunks(std::make_unique<ChunksController>(*level)),
|
chunks(std::make_unique<ChunksController>(*level)),
|
||||||
playerTickClock(20, 3),
|
playerTickClock(20, 3) {
|
||||||
localPlayer(clientPlayer) {
|
|
||||||
|
|
||||||
level->events->listen(LevelEventType::CHUNK_PRESENT, [](auto, Chunk* chunk) {
|
level->events->listen(LevelEventType::CHUNK_PRESENT, [](auto, Chunk* chunk) {
|
||||||
scripting::on_chunk_present(*chunk, chunk->flags.loaded);
|
scripting::on_chunk_present(*chunk, chunk->flags.loaded);
|
||||||
|
|||||||
@ -20,7 +20,6 @@ class LevelController {
|
|||||||
std::unique_ptr<ChunksController> chunks;
|
std::unique_ptr<ChunksController> chunks;
|
||||||
|
|
||||||
util::Clock playerTickClock;
|
util::Clock playerTickClock;
|
||||||
Player* localPlayer;
|
|
||||||
public:
|
public:
|
||||||
LevelController(Engine* engine, std::unique_ptr<Level> level, Player* clientPlayer);
|
LevelController(Engine* engine, std::unique_ptr<Level> level, Player* clientPlayer);
|
||||||
|
|
||||||
|
|||||||
@ -431,12 +431,6 @@ static int l_audio_get_output_devices_names(lua::State* L) {
|
|||||||
return 1;
|
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) {
|
static int l_audio_get_input_info(lua::State* L) {
|
||||||
auto device = audio::get_input_device();
|
auto device = audio::get_input_device();
|
||||||
if (device == nullptr) {
|
if (device == nullptr) {
|
||||||
@ -480,9 +474,8 @@ const luaL_Reg audiolib[] = {
|
|||||||
{"count_speakers", lua::wrap<l_audio_count_speakers>},
|
{"count_speakers", lua::wrap<l_audio_count_speakers>},
|
||||||
{"count_streams", lua::wrap<l_audio_count_streams>},
|
{"count_streams", lua::wrap<l_audio_count_streams>},
|
||||||
{"__fetch_input", lua::wrap<l_audio_fetch_input>},
|
{"__fetch_input", lua::wrap<l_audio_fetch_input>},
|
||||||
{"get_input_devices_names", lua::wrap<l_audio_get_input_devices_names>},
|
{"__get_input_devices_names", lua::wrap<l_audio_get_input_devices_names>},
|
||||||
{"get_output_devices_names", lua::wrap<l_audio_get_output_devices_names>},
|
{"__get_output_devices_names", lua::wrap<l_audio_get_output_devices_names>},
|
||||||
{"set_input_device", lua::wrap<l_audio_set_input_device>},
|
{"__get_input_info", lua::wrap<l_audio_get_input_info>},
|
||||||
{"get_input_info", lua::wrap<l_audio_get_input_info>},
|
|
||||||
{nullptr, nullptr}
|
{nullptr, nullptr}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -16,6 +16,8 @@ struct AudioSettings {
|
|||||||
NumberSetting volumeUI {1.0f, 0.0f, 1.0f, setting_format::percent};
|
NumberSetting volumeUI {1.0f, 0.0f, 1.0f, setting_format::percent};
|
||||||
NumberSetting volumeAmbient {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};
|
NumberSetting volumeMusic {1.0f, 0.0f, 1.0f, setting_format::percent};
|
||||||
|
|
||||||
|
StringSetting inputDevice {"auto"};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DisplaySettings {
|
struct DisplaySettings {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user