Brenta Engine 1.2
Loading...
Searching...
No Matches
sound.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/sound.hpp>
7#include <brenta/drivers/miniaudio.hpp>
8#include <brenta/logger.hpp>
9
10using namespace brenta;
11
12//
13// Sound Asset
14//
15
16SoundAsset::~SoundAsset()
17{
18 SoundManager::unload(*this);
19}
20
21SoundAsset::SoundAssetId SoundAsset::get_id() const
22{
23 return this->id;
24}
25
27&SoundAsset::Builder::path(const std::filesystem::path& path)
28{
29 this->_path = path;
30 return *this;
31}
32
33std::optional<SoundAsset> SoundAsset::Builder::build()
34{
35 return SoundManager::load(this->_path);
36}
37
38//
39// Sound
40//
41
42Sound::Sound(const SoundAsset& asset)
43{
44 auto maybe_stream = SoundManager::request_stream(asset);
45 if (!stream)
46 return;
47
48 this->stream = maybe_stream.value();
49}
50
51Sound::~Sound()
52{
53 SoundManager::release_stream(this->stream);
54}
55
56void Sound::play()
57{
58 SoundManager::play(*this);
59}
60
61void Sound::stop()
62{
63 SoundManager::stop(*this);
64}
65
66void Sound::set_volume(float v)
67{
68 SoundManager::set_volume(*this, v);
69}
70
71//
72// SoundManager
73//
74
75// Static variables
76
77const std::string SoundManager::subsystem_name = "SoundManager";
78tenno::shared_ptr<SoundManager::Driver> SoundManager::driver;
79bool SoundManager::initialized = false;
80
81
82// Subsystem interface
83
84std::expected<void, Subsystem::Error> SoundManager::initialize()
85{
86 if (SoundManager::initialized)
87 return {};
88
89 this->driver = tenno::make_shared<MiniaudioDriver>();
90 auto ret = SoundManager::driver->initialize();
91 if (!ret)
92 return ret;
93
94 SoundManager::initialized = true;
95
96 DEBUG("{}: initialized", SoundManager::subsystem_name);
97
98 return ret;
99}
100
101std::expected<void, Subsystem::Error> SoundManager::terminate()
102{
103 if (!SoundManager::initialized | !SoundManager::driver)
104 return {};
105
106 auto ret = SoundManager::driver->terminate();
107 if (!ret)
108 return ret;
109
110 SoundManager::initialized = false;
111
112 DEBUG("{}: terminated", SoundManager::subsystem_name);
113
114 return ret;
115}
116
117std::string SoundManager::name()
118{
119 return SoundManager::subsystem_name;
120}
121
122bool SoundManager::is_initialized()
123{
124 return SoundManager::initialized;
125}
126
127// Member functions
128
129SoundManager &SoundManager::instance()
130{
131 static SoundManager _instance;
132 return _instance;
133}
134
135std::optional<Stream> SoundManager::request_stream(const SoundAsset& asset)
136{
137 if (!SoundManager::initialized || asset.id < 0)
138 return {};
139 return SoundManager::driver->request_stream(asset);
140}
141
142void SoundManager::release_stream(Stream stream)
143{
144 if (!SoundManager::initialized || stream < 0)
145 return;
146 SoundManager::driver->release_stream(stream);
147 return;
148}
149
150std::optional<SoundAsset>
151SoundManager::load(const std::filesystem::path& path)
152{
153 if (!SoundManager::initialized || !SoundManager::driver)
154 return {};
155 return SoundManager::driver->load(path);
156}
157
158void SoundManager::unload(const SoundAsset& sound)
159{
160 if (!SoundManager::initialized
161 || !SoundManager::driver
162 || sound.id < 0)
163 return;
164 return SoundManager::driver->unload(sound);
165}
166
167void SoundManager::play(const Sound& sound)
168{
169 if (!SoundManager::initialized || !SoundManager::driver
170 || sound.stream < 0)
171 return;
172 return SoundManager::driver->play(sound.stream);
173}
174
175void SoundManager::stop(const Sound& sound)
176{
177 if (!SoundManager::initialized || !SoundManager::driver
178 || sound.stream < 0)
179 return;
180 return SoundManager::driver->stop(sound.stream);
181}
182
183void SoundManager::set_volume(const Sound& sound, float volume)
184{
185 if (!SoundManager::initialized || !SoundManager::driver
186 || sound.stream < 0)
187 return;
188 return SoundManager::driver->set_volume(sound.stream, volume);
189}
190
191//
192// Builder
193//
194
195Subsystem &SoundManager::Builder::build()
196{
197 return SoundManager::instance();
198}