diff --git a/src/ChargeAudio.hpp b/src/ChargeAudio.hpp index d5a0140..418d2e2 100644 --- a/src/ChargeAudio.hpp +++ b/src/ChargeAudio.hpp @@ -27,7 +27,9 @@ public: float GetVolume(); private: - Sound(); + Sound(class Engine *engine); + static void onSoundFinish(void *customData, ma_sound *); + class Engine *baseEngine; ma_sound maSound; SoundState state = SoundState::Idle; @@ -65,6 +67,7 @@ private: ma_result maResponse; ma_uint64 listenerCounter = 0; friend class Listener; + friend class Sound; }; } // namespace ChargeAudio diff --git a/src/Engine.cpp b/src/Engine.cpp index d332b8f..e373d28 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -21,17 +21,19 @@ Engine::Engine() { Engine::~Engine() { ma_engine_uninit(&maEngine); } Containers::Pointer Engine::CreateSound(std::string filepath) { - auto sound = Containers::Pointer(new Sound()); - sound->baseEngine = this; - + auto sound = Containers::Pointer(new Sound(this)); maResponse = ma_sound_init_from_file(&maEngine, filepath.c_str(), 0, NULL, NULL, &sound->maSound); + sound->maSound.endCallback = Sound::onSoundFinish; + sound->maSound.pEndCallbackUserData = sound.get(); + if (maResponse != MA_SUCCESS) { Utility::Error{} << "Failed to create the sound from the file: " << filepath.c_str() << " (" << maResponse << ")"; throw new std::runtime_error( "Failed to create the sound from file. Check STDERR for more info."); } + return sound; } diff --git a/src/Sound.cpp b/src/Sound.cpp index 9daf8e2..9b118a9 100644 --- a/src/Sound.cpp +++ b/src/Sound.cpp @@ -3,7 +3,8 @@ #include using namespace ChargeAudio; -Sound::Sound() {} +Sound::Sound(Engine *engine) : baseEngine(engine) {} + Sound::~Sound() { ma_sound_uninit(&maSound); } Sound::SoundState Sound::GetState() { return state; } @@ -30,3 +31,9 @@ Magnum::Vector3 Sound::GetPosition() { } void Sound::SetVolume(float value) { ma_sound_set_volume(&maSound, value); } float Sound::GetVolume() { return ma_sound_get_volume(&maSound); } + +// STATICs +void Sound::onSoundFinish(void *customData, ma_sound *) { + auto sound = static_cast(customData); + sound->state = SoundState::Finished; +}