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
13 changed files with 49 additions and 40 deletions
+1 -2
View File
@@ -74,8 +74,7 @@ ALInputDevice::ALInputDevice(
uint bitsPerSample,
uint sampleRate
)
: al(al),
device(device),
: device(device),
channels(channels),
bitsPerSample(bitsPerSample),
sampleRate(sampleRate) {
-1
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;
+17 -10
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();
}
}
+2
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
+4
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();
+10 -9
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);
+1 -2
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);
-1
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);
+3 -10
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}
};
+2
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 {