#pragma once #include "miniaudio.h" #include #include #include #include #include #include #include "sounddevice.h" #include "samplereader.h" #include "sound.h" class Sound { public: using sndcb_func = std::function; static Sound& instance(); static void deinitInstance(); void addPlayback(const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t length = 0); void addPlayback(const std::string& audioDeviceName, const std::string& name, float volume = 1.f, uint64_t beginms = 0, uint64_t length = 0, sndcb_func callback = {}); bool addDefaultDevice(); bool addDeviceWithName(const std::string& name); void stopAll(); void reset(); SampleReader* openFile(const std::string& name); std::vector getOutputs(); void setMasterVolume(float m); float getMasterVolume() const; static std::string FOLDER; private: Sound(); ~Sound(); void deinit(); void init(); void backgroundThreadLoop(); void cleanAllDecoders(); void startBackgroundThread(); void stopBackgroundThread(); ma_context context; bool threadShouldrun = false; std::thread backgroundCleanup; std::mutex devicesMutex; std::vector devices; float masterVolume = 1.0; static Sound* inst; friend void sound_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount); };