#pragma once #include #include #include #include #include #define NOMINMAX /* miniaudio includes windows.h */ #include "thirdparty/miniaudio.h" #undef NOMINMAX #include "iAudioDevice.h" #include "iClock.h" namespace gj { class AudioDevice : public iAudioDevice, public iClock { public: static constexpr auto kFormat = ma_format_f32; static constexpr auto kChannel = 2; static constexpr auto kSampleRate = 48000; AudioDevice(AudioDevice&&) = default; AudioDevice(const AudioDevice&) = default; AudioDevice& operator=(AudioDevice&&) = default; AudioDevice& operator=(const AudioDevice&) = default; AudioDevice(); ~AudioDevice(); void PlayMusic(const std::string& path) override; void StopMusic() override; uint64_t now() const override { return time_.load() * 1000 / kSampleRate; } private: std::mutex mtx_; ma_device ma_{0}; bool playing_ = false; ma_decoder dec_{0}; std::atomic time_; static void Callback_(ma_device* ma, void* out, const void* in, ma_uint32 framecnt); }; }