BubbleBobbleRemake / DuvelEngine / SDLSoundSystem.h
SDLSoundSystem.h
Raw
#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{};
};