6#include <brenta/sound.hpp>
7#include <brenta/drivers/miniaudio.hpp>
8#include <brenta/logger.hpp>
10using namespace brenta;
16SoundAsset::~SoundAsset()
18 SoundManager::unload(*
this);
21SoundAsset::SoundAssetId SoundAsset::get_id()
const
27&SoundAsset::Builder::path(
const std::filesystem::path& path)
33std::optional<SoundAsset> SoundAsset::Builder::build()
35 return SoundManager::load(this->_path);
44 auto maybe_stream = SoundManager::request_stream(asset);
48 this->stream = maybe_stream.value();
53 SoundManager::release_stream(this->stream);
58 SoundManager::play(*
this);
63 SoundManager::stop(*
this);
66void Sound::set_volume(
float v)
68 SoundManager::set_volume(*
this, v);
77const std::string SoundManager::subsystem_name =
"SoundManager";
78tenno::shared_ptr<SoundManager::Driver> SoundManager::driver;
79bool SoundManager::initialized =
false;
84std::expected<void, Subsystem::Error> SoundManager::initialize()
86 if (SoundManager::initialized)
89 this->driver = tenno::make_shared<MiniaudioDriver>();
90 auto ret = SoundManager::driver->initialize();
94 SoundManager::initialized =
true;
96 DEBUG(
"{}: initialized", SoundManager::subsystem_name);
101std::expected<void, Subsystem::Error> SoundManager::terminate()
103 if (!SoundManager::initialized | !SoundManager::driver)
106 auto ret = SoundManager::driver->terminate();
110 SoundManager::initialized =
false;
112 DEBUG(
"{}: terminated", SoundManager::subsystem_name);
117std::string SoundManager::name()
119 return SoundManager::subsystem_name;
122bool SoundManager::is_initialized()
124 return SoundManager::initialized;
135std::optional<Stream> SoundManager::request_stream(
const SoundAsset& asset)
137 if (!SoundManager::initialized || asset.id < 0)
139 return SoundManager::driver->request_stream(asset);
142void SoundManager::release_stream(Stream stream)
144 if (!SoundManager::initialized || stream < 0)
146 SoundManager::driver->release_stream(stream);
150std::optional<SoundAsset>
151SoundManager::load(
const std::filesystem::path& path)
153 if (!SoundManager::initialized || !SoundManager::driver)
155 return SoundManager::driver->load(path);
158void SoundManager::unload(
const SoundAsset& sound)
160 if (!SoundManager::initialized
161 || !SoundManager::driver
164 return SoundManager::driver->unload(sound);
167void SoundManager::play(
const Sound& sound)
169 if (!SoundManager::initialized || !SoundManager::driver
172 return SoundManager::driver->play(sound.stream);
175void SoundManager::stop(
const Sound& sound)
177 if (!SoundManager::initialized || !SoundManager::driver
180 return SoundManager::driver->stop(sound.stream);
183void SoundManager::set_volume(
const Sound& sound,
float volume)
185 if (!SoundManager::initialized || !SoundManager::driver
188 return SoundManager::driver->set_volume(sound.stream, volume);
197 return SoundManager::instance();