#pragma once #include "ISoundSystem.h" #include <iostream> #include <thread> #include <queue> #include <mutex> #include <list> struct Mix_Chunk; struct _Mix_Music; enum class SoundStatus { Unloaded, Loading, Loaded }; class SDLSoundSystem final : public ISoundSystem { public: SDLSoundSystem(); ~SDLSoundSystem() override; void Play(const Sound_Id soundId, const float volume) override; void PlayMusic(const Sound_Id musicId, const float volume, const int loops = -1) override; void Load(std::tuple<std::string, Mix_Chunk*, SoundStatus>& sound); void LoadingThread(); void RegisterSound(const Sound_Id soundId, const std::string& filepath) override; void RegisterMusic(const Sound_Id musicId, const std::string& filepath) override; void StopMusic() override; private: std::map<Sound_Id, std::tuple<std::string, Mix_Chunk*, SoundStatus>> m_Sounds; std::map<Sound_Id, std::pair<std::string, _Mix_Music*>> m_Music; std::thread m_Thread; bool m_IsRunning{ true }; std::queue<std::pair<Sound_Id, float>> m_LoadQueue{}; std::mutex m_LoadQueueMutex; //std::mutex m_PlayMutex; std::condition_variable m_LoadConditionVariable; std::list<Sound_Id> m_PlayAfterLoadQueue{}; };