Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
Audio.cpp
Go to the documentation of this file.
1#include "audio/Audio.h"
2#include "Engine.h"
3#include <miniaudio.h>
4
5namespace eng
6{
8 {
9 if (m_sound)
10 {
11 ma_sound_uninit(m_sound.get());
12 }
13 if (m_decoder)
14 {
15 ma_decoder_uninit(m_decoder.get());
16 }
17 }
18
19 void Audio::SetPosition(const glm::vec3& position)
20 {
21 if (m_sound)
22 {
23 ma_sound_set_position(m_sound.get(), position.x, position.y, position.z);
24 }
25 }
26
27 void Audio::Play(bool loop)
28 {
29 if (m_sound)
30 {
31 ma_sound_start(m_sound.get());
32 auto looping = loop ? MA_TRUE : MA_FALSE;
33 ma_sound_set_looping(m_sound.get(), looping);
34 }
35 }
36
38 {
39 if (m_sound)
40 {
41 ma_sound_stop(m_sound.get());
42 ma_sound_seek_to_pcm_frame(m_sound.get(), 0);
43 }
44 }
45
46 bool Audio::IsPlaying() const
47 {
48 if (m_sound)
49 {
50 return ma_sound_is_playing(m_sound.get());
51 }
52 return false;
53 }
54
55 void Audio::SetVolume(float volume)
56 {
57 if (m_sound)
58 {
59 ma_sound_set_volume(m_sound.get(), std::clamp(volume, 0.0f, 1.0f));
60 }
61 }
62
63 float Audio::GetVolume() const
64 {
65 if (m_sound)
66 {
67 return ma_sound_get_volume(m_sound.get());
68 }
69 return 0.0f;
70 }
71
72 std::shared_ptr<Audio> Audio::Load(const std::string& path)
73 {
74 auto buffer = Engine::GetInstance().GetFileSystem().LoadAssetFile(path);
76
77 auto audio = std::make_shared<Audio>();
78 audio->m_sound = std::make_unique<ma_sound>();
79 audio->m_buffer = buffer;
80 audio->m_decoder = std::make_unique<ma_decoder>();
81 auto result = ma_decoder_init_memory(audio->m_buffer.data(), audio->m_buffer.size(),
82 nullptr, audio->m_decoder.get());
83 if (result != MA_SUCCESS)
84 {
85 return nullptr;
86 }
87 result = ma_sound_init_from_data_source(
88 engine,
89 audio->m_decoder.get(),
90 0,
91 NULL,
92 audio->m_sound.get()
93 );
94 if (result != MA_SUCCESS)
95 {
96 return nullptr;
97 }
98
99 ma_sound_set_spatialization_enabled(audio->m_sound.get(), MA_TRUE);
100 return audio;
101 }
102}
ma_engine * GetEngine()
static std::shared_ptr< Audio > Load(const std::string &path)
Definition Audio.cpp:72
void Play(bool loop=false)
Definition Audio.cpp:27
void SetPosition(const glm::vec3 &position)
Definition Audio.cpp:19
void SetVolume(float volume)
Definition Audio.cpp:55
float GetVolume() const
Definition Audio.cpp:63
void Stop()
Definition Audio.cpp:37
bool IsPlaying() const
Definition Audio.cpp:46
AudioManager & GetAudioManager()
Definition Engine.cpp:220
FileSystem & GetFileSystem()
Definition Engine.cpp:205
static Engine & GetInstance()
Definition Engine.cpp:50
std::vector< char > LoadAssetFile(const std::string &relativePath)