refactor
This commit is contained in:
+24
-5
@@ -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
@@ -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
@@ -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() {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user