This commit is contained in:
MihailRis
2025-01-22 08:18:17 +03:00
parent da10151d5a
commit 02554e469a
6 changed files with 67 additions and 35 deletions
+24 -5
View File
@@ -9,19 +9,21 @@
#include "AL/ALAudio.hpp" #include "AL/ALAudio.hpp"
#include "NoAudio.hpp" #include "NoAudio.hpp"
#include "debug/Logger.hpp" #include "debug/Logger.hpp"
#include "util/ObjectsKeeper.hpp"
static debug::Logger logger("audio"); static debug::Logger logger("audio");
namespace audio { using namespace audio;
namespace {
static speakerid_t nextId = 1; static speakerid_t nextId = 1;
static Backend* backend; static Backend* backend;
static std::unordered_map<speakerid_t, std::unique_ptr<Speaker>> speakers; static std::unordered_map<speakerid_t, std::unique_ptr<Speaker>> speakers;
static std::unordered_map<speakerid_t, std::shared_ptr<Stream>> streams; static std::unordered_map<speakerid_t, std::shared_ptr<Stream>> streams;
static std::vector<std::unique_ptr<Channel>> channels; static std::vector<std::unique_ptr<Channel>> channels;
static util::ObjectsKeeper objects_keeper {};
} }
using namespace audio;
Channel::Channel(std::string name) : name(std::move(name)) { Channel::Channel(std::string name) : name(std::move(name)) {
} }
@@ -148,7 +150,8 @@ public:
} }
}; };
void audio::initialize(bool enabled) { void audio::initialize(bool enabled, AudioSettings& settings) {
enabled = enabled && settings.enabled.get();
if (enabled) { if (enabled) {
logger.info() << "initializing ALAudio backend"; logger.info() << "initializing ALAudio backend";
backend = ALAudio::create().release(); backend = ALAudio::create().release();
@@ -160,7 +163,22 @@ void audio::initialize(bool enabled) {
logger.info() << "initializing NoAudio backend"; logger.info() << "initializing NoAudio backend";
backend = NoAudio::create().release(); backend = NoAudio::create().release();
} }
create_channel("master"); struct {
std::string name;
NumberSetting* setting;
} builtin_channels[] {
{"master", &settings.volumeMaster},
{"regular", &settings.volumeRegular},
{"music", &settings.volumeMusic},
{"ambient", &settings.volumeAmbient},
{"ui", &settings.volumeUI}
};
for (auto& channel : builtin_channels) {
create_channel(channel.name);
objects_keeper.keepAlive(channel.setting->observe([=](auto value) {
audio::get_channel(channel.name)->setVolume(value * value);
}, true));
}
} }
std::unique_ptr<PCM> audio::load_PCM(const fs::path& file, bool headerOnly) { std::unique_ptr<PCM> audio::load_PCM(const fs::path& file, bool headerOnly) {
@@ -442,4 +460,5 @@ void audio::close() {
speakers.clear(); speakers.clear();
delete backend; delete backend;
backend = nullptr; backend = nullptr;
objects_keeper.clearKeepedObjects();
} }
+2 -1
View File
@@ -6,6 +6,7 @@
#include <vector> #include <vector>
#include "typedefs.hpp" #include "typedefs.hpp"
#include "settings.hpp"
namespace fs = std::filesystem; namespace fs = std::filesystem;
@@ -357,7 +358,7 @@ namespace audio {
/// @brief Initialize audio system or use no audio mode /// @brief Initialize audio system or use no audio mode
/// @param enabled try to initialize actual audio /// @param enabled try to initialize actual audio
void initialize(bool enabled); void initialize(bool enabled, AudioSettings& settings);
/// @brief Load audio file info and PCM data /// @brief Load audio file info and PCM data
/// @param file audio file /// @param file audio file
+25 -24
View File
@@ -52,15 +52,6 @@ static debug::Logger logger("engine");
namespace fs = std::filesystem; namespace fs = std::filesystem;
static void create_channel(Engine* engine, std::string name, NumberSetting& setting) {
if (name != "master") {
audio::create_channel(name);
}
engine->keepAlive(setting.observe([=](auto value) {
audio::get_channel(name)->setVolume(value*value);
}, true));
}
static std::unique_ptr<ImageData> load_icon(const fs::path& resdir) { static std::unique_ptr<ImageData> load_icon(const fs::path& resdir) {
try { try {
auto file = resdir / fs::u8path("textures/misc/icon.png"); auto file = resdir / fs::u8path("textures/misc/icon.png");
@@ -73,12 +64,23 @@ static std::unique_ptr<ImageData> load_icon(const fs::path& resdir) {
return nullptr; return nullptr;
} }
Engine::Engine(CoreParameters coreParameters) Engine::Engine() = default;
: params(std::move(coreParameters)),
settings(), static std::unique_ptr<Engine> engine;
settingsHandler({settings}),
interpreter(std::make_unique<cmd::CommandsInterpreter>()), Engine& Engine::getInstance() {
network(network::Network::create(settings.network)) { if (!engine) {
engine = std::make_unique<Engine>();
}
return *engine;
}
void Engine::initialize(CoreParameters coreParameters) {
params = std::move(coreParameters);
settingsHandler = std::make_unique<SettingsHandler>(settings);
interpreter = std::make_unique<cmd::CommandsInterpreter>();
network = network::Network::create(settings.network);
logger.info() << "engine version: " << ENGINE_VERSION_STRING; logger.info() << "engine version: " << ENGINE_VERSION_STRING;
if (params.headless) { if (params.headless) {
logger.info() << "headless mode is enabled"; logger.info() << "headless mode is enabled";
@@ -110,12 +112,7 @@ Engine::Engine(CoreParameters coreParameters)
menus::create_version_label(*this); menus::create_version_label(*this);
} }
} }
audio::initialize(settings.audio.enabled.get() && !params.headless); audio::initialize(!params.headless, settings.audio);
create_channel(this, "master", settings.audio.volumeMaster);
create_channel(this, "regular", settings.audio.volumeRegular);
create_channel(this, "music", settings.audio.volumeMusic);
create_channel(this, "ambient", settings.audio.volumeAmbient);
create_channel(this, "ui", settings.audio.volumeUI);
bool langNotSet = settings.ui.language.get() == "auto"; bool langNotSet = settings.ui.language.get() == "auto";
if (langNotSet) { if (langNotSet) {
@@ -140,7 +137,7 @@ void Engine::loadSettings() {
logger.info() << "loading settings"; logger.info() << "loading settings";
std::string text = files::read_string(settings_file); std::string text = files::read_string(settings_file);
try { try {
toml::parse(settingsHandler, settings_file.string(), text); toml::parse(*settingsHandler, settings_file.string(), text);
} catch (const parsing_error& err) { } catch (const parsing_error& err) {
logger.error() << err.errorLog(); logger.error() << err.errorLog();
throw; throw;
@@ -222,7 +219,7 @@ void Engine::renderFrame() {
void Engine::saveSettings() { void Engine::saveSettings() {
logger.info() << "saving settings"; logger.info() << "saving settings";
files::write_string(paths.getSettingsFile(), toml::stringify(settingsHandler)); files::write_string(paths.getSettingsFile(), toml::stringify(*settingsHandler));
if (!params.headless) { if (!params.headless) {
logger.info() << "saving bindings"; logger.info() << "saving bindings";
files::write_string(paths.getControlsFile(), Events::writeBindings()); files::write_string(paths.getControlsFile(), Events::writeBindings());
@@ -255,6 +252,10 @@ Engine::~Engine() {
logger.info() << "engine finished"; logger.info() << "engine finished";
} }
void Engine::terminate() {
engine.reset();
}
EngineController* Engine::getController() { EngineController* Engine::getController() {
return controller.get(); return controller.get();
} }
@@ -511,7 +512,7 @@ std::shared_ptr<Screen> Engine::getScreen() {
} }
SettingsHandler& Engine::getSettingsHandler() { SettingsHandler& Engine::getSettingsHandler() {
return settingsHandler; return *settingsHandler;
} }
network::Network& Engine::getNetwork() { network::Network& Engine::getNetwork() {
+8 -2
View File
@@ -58,9 +58,9 @@ using OnWorldOpen = std::function<void(std::unique_ptr<Level>, int64_t)>;
class Engine : public util::ObjectsKeeper { class Engine : public util::ObjectsKeeper {
CoreParameters params; CoreParameters params;
EngineSettings settings; EngineSettings settings;
SettingsHandler settingsHandler;
EnginePaths paths; EnginePaths paths;
std::unique_ptr<SettingsHandler> settingsHandler;
std::unique_ptr<Assets> assets; std::unique_ptr<Assets> assets;
std::shared_ptr<Screen> screen; std::shared_ptr<Screen> screen;
std::vector<ContentPack> contentPacks; std::vector<ContentPack> contentPacks;
@@ -82,9 +82,15 @@ class Engine : public util::ObjectsKeeper {
void updateHotkeys(); void updateHotkeys();
void loadAssets(); void loadAssets();
public: public:
Engine(CoreParameters coreParameters); Engine();
~Engine(); ~Engine();
static Engine& getInstance();
void initialize(CoreParameters coreParameters);
static void terminate();
/// @brief Start the engine /// @brief Start the engine
void run(); void run();
+3 -2
View File
@@ -637,8 +637,9 @@ static std::shared_ptr<UINode> readInventory(UiXmlReader& reader, const xml::xml
static std::shared_ptr<UINode> readPageBox(UiXmlReader& reader, const xml::xmlelement& element) { static std::shared_ptr<UINode> readPageBox(UiXmlReader& reader, const xml::xmlelement& element) {
auto menu = std::make_shared<Menu>(); auto menu = std::make_shared<Menu>();
// FIXME menu->setPageLoader(
menu->setPageLoader(scripting::engine->getGUI()->getMenu()->getPageLoader()); Engine::getInstance().getGUI()->getMenu()->getPageLoader()
);
_readContainer(reader, element, *menu); _readContainer(reader, element, *menu);
return menu; return menu;
+5 -1
View File
@@ -21,11 +21,15 @@ int main(int argc, char** argv) {
debug::Logger::init(coreParameters.userFolder.string()+"/latest.log"); debug::Logger::init(coreParameters.userFolder.string()+"/latest.log");
platform::configure_encoding(); platform::configure_encoding();
auto& engine = Engine::getInstance();
try { try {
Engine(std::move(coreParameters)).run(); engine.initialize(std::move(coreParameters));
engine.run();
} catch (const initialize_error& err) { } catch (const initialize_error& err) {
logger.error() << "could not to initialize engine\n" << err.what(); logger.error() << "could not to initialize engine\n" << err.what();
} }
Engine::terminate();
#if defined(NDEBUG) and defined(_WIN32) #if defined(NDEBUG) and defined(_WIN32)
catch (const std::exception& err) { catch (const std::exception& err) {
logger.error() << "uncaught exception: " << err.what(); logger.error() << "uncaught exception: " << err.what();