commit
3acb9f7409
@ -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("<container id='tm' />")
|
||||
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("<label context='settings'>@Microphone</label>")
|
||||
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'>"
|
||||
.."<container id='input_volume_inner' color='#00FF00FF' pos='1' size='2'/>"
|
||||
.."</container>")
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -109,6 +109,7 @@ settings.Conflict=Найдены возможные конфликты
|
||||
settings.Windowed=Оконный
|
||||
settings.Borderless=Безрамочный
|
||||
settings.Microphone=Микрофон
|
||||
settings.microphone.None=Нет
|
||||
|
||||
# Управление
|
||||
chunks.reload=Перезагрузить Чанки
|
||||
|
||||
@ -74,8 +74,7 @@ ALInputDevice::ALInputDevice(
|
||||
uint bitsPerSample,
|
||||
uint sampleRate
|
||||
)
|
||||
: al(al),
|
||||
device(device),
|
||||
: device(device),
|
||||
channels(channels),
|
||||
bitsPerSample(bitsPerSample),
|
||||
sampleRate(sampleRate) {
|
||||
|
||||
@ -108,7 +108,6 @@ namespace audio {
|
||||
|
||||
size_t read(char* buffer, size_t bufferSize) override;
|
||||
private:
|
||||
ALAudio* al;
|
||||
ALCdevice* device;
|
||||
uint channels;
|
||||
uint bitsPerSample;
|
||||
|
||||
@ -23,6 +23,7 @@ namespace {
|
||||
std::unordered_map<speakerid_t, std::shared_ptr<Stream>> streams;
|
||||
std::vector<std::unique_ptr<Channel>> channels;
|
||||
util::ObjectsKeeper objects_keeper {};
|
||||
std::unique_ptr<InputDevice> input_device = nullptr;
|
||||
}
|
||||
|
||||
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) {
|
||||
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<std::string> 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -27,8 +27,7 @@ LevelController::LevelController(
|
||||
: settings(engine->getSettings()),
|
||||
level(std::move(levelPtr)),
|
||||
chunks(std::make_unique<ChunksController>(*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);
|
||||
|
||||
@ -20,7 +20,6 @@ class LevelController {
|
||||
std::unique_ptr<ChunksController> chunks;
|
||||
|
||||
util::Clock playerTickClock;
|
||||
Player* localPlayer;
|
||||
public:
|
||||
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;
|
||||
}
|
||||
|
||||
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<l_audio_count_speakers>},
|
||||
{"count_streams", lua::wrap<l_audio_count_streams>},
|
||||
{"__fetch_input", lua::wrap<l_audio_fetch_input>},
|
||||
{"get_input_devices_names", lua::wrap<l_audio_get_input_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_devices_names", lua::wrap<l_audio_get_input_devices_names>},
|
||||
{"__get_output_devices_names", lua::wrap<l_audio_get_output_devices_names>},
|
||||
{"__get_input_info", lua::wrap<l_audio_get_input_info>},
|
||||
{nullptr, nullptr}
|
||||
};
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user