Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
Audio.cpp
Go to the documentation of this file.
1#include "audio/Audio.h"
2
3#include <miniaudio.h>
4
5#include "Engine.h"
6
7namespace mnd
8{
10{
11 if (m_sound)
12 {
13 ma_sound_uninit(m_sound.get());
14 }
15 if (m_decoder)
16 {
17 ma_decoder_uninit(m_decoder.get());
18 }
19}
20
21void Audio::SetPosition(const glm::vec3 &position)
22{
23 if (m_sound)
24 {
25 ma_sound_set_position(m_sound.get(), position.x, position.y, position.z);
26 }
27}
28
29void Audio::Play(bool loop)
30{
31 if (m_sound)
32 {
33 ma_sound_start(m_sound.get());
34 auto looping = loop ? MA_TRUE : MA_FALSE;
35 ma_sound_set_looping(m_sound.get(), looping);
36 }
37}
38
40{
41 if (m_sound)
42 {
43 ma_sound_stop(m_sound.get());
44 ma_sound_seek_to_pcm_frame(m_sound.get(), 0);
45 }
46}
47
48bool Audio::IsPlaying() const
49{
50 if (m_sound)
51 {
52 return ma_sound_is_playing(m_sound.get());
53 }
54 return false;
55}
56
57void Audio::SetVolume(float volume)
58{
59 if (m_sound)
60 {
61 ma_sound_set_volume(m_sound.get(), std::clamp(volume, 0.0f, 1.0f));
62 }
63}
64
65float Audio::GetVolume() const
66{
67 if (m_sound)
68 {
69 return ma_sound_get_volume(m_sound.get());
70 }
71 return 0.0f;
72}
73
74std::shared_ptr<Audio> Audio::Load(const std::string &path)
75{
76 auto buffer = Engine::GetInstance().GetFileSystem().LoadAssetFile(path);
78
79 auto audio = std::make_shared<Audio>();
80 audio->m_sound = std::make_unique<ma_sound>();
81 audio->m_buffer = buffer;
82 audio->m_decoder = std::make_unique<ma_decoder>();
83 auto result =
84 ma_decoder_init_memory(audio->m_buffer.data(), audio->m_buffer.size(), nullptr, audio->m_decoder.get());
85 if (result != MA_SUCCESS)
86 {
87 return nullptr;
88 }
89 result = ma_sound_init_from_data_source(engine, audio->m_decoder.get(), 0, NULL, audio->m_sound.get());
90 if (result != MA_SUCCESS)
91 {
92 return nullptr;
93 }
94
95 ma_sound_set_spatialization_enabled(audio->m_sound.get(), MA_TRUE);
96 return audio;
97}
98} // namespace mnd
ma_engine * GetEngine()
Underlying miniaudio engine handle (passed to clip Play()).
void Play(bool loop=false)
Start playback. Pass true to loop forever.
Definition Audio.cpp:29
float GetVolume() const
Definition Audio.cpp:65
void Stop()
Halt playback if currently playing; no-op otherwise.
Definition Audio.cpp:39
void SetPosition(const glm::vec3 &position)
Place the emitter at a world-space position (3D spatialisation).
Definition Audio.cpp:21
void SetVolume(float volume)
Linear gain in [0, 1]. Values above 1 amplify but may clip.
Definition Audio.cpp:57
bool IsPlaying() const
True between Play() and natural end / Stop().
Definition Audio.cpp:48
static std::shared_ptr< Audio > Load(const std::string &path)
Decode an audio file from disk and return a shared instance.
Definition Audio.cpp:74
FileSystem & GetFileSystem()
Returns the file system helper for asset-relative path resolution.
Definition Engine.cpp:453
AudioManager & GetAudioManager()
Definition Engine.cpp:438
static Engine & GetInstance()
Returns the single Engine instance (created on first call).
Definition Engine.cpp:59
std::vector< char > LoadAssetFile(const std::string &relativePath)
Load a file from the assets directory into a byte buffer.