Merge pull request #688 from MihailRis/continue-audio

Continue audio
This commit is contained in:
MihailRis 2025-11-21 22:52:52 +03:00 committed by GitHub
commit 3acb9f7409
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 49 additions and 40 deletions

View File

@ -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

View File

@ -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

View File

@ -109,6 +109,7 @@ settings.Conflict=Найдены возможные конфликты
settings.Windowed=Оконный
settings.Borderless=Безрамочный
settings.Microphone=Микрофон
settings.microphone.None=Нет
# Управление
chunks.reload=Перезагрузить Чанки

View File

@ -74,8 +74,7 @@ ALInputDevice::ALInputDevice(
uint bitsPerSample,
uint sampleRate
)
: al(al),
device(device),
: device(device),
channels(channels),
bitsPerSample(bitsPerSample),
sampleRate(sampleRate) {

View File

@ -108,7 +108,6 @@ namespace audio {
size_t read(char* buffer, size_t bufferSize) override;
private:
ALAudio* al;
ALCdevice* device;
uint channels;
uint bitsPerSample;

View File

@ -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();
}
}

View File

@ -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

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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}
};

View File

@ -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 {