#pragma once #include #include #include #include "config.hpp" #include "helpers.hpp" #include "miniaudio.h" #include "ring_buffer.hpp" class MiniAudioDevice { using Samples = Common::RingBuffer; static constexpr ma_uint32 sampleRate = 32768; // 3DS sample rate static constexpr ma_uint32 channelCount = 2; // Audio output is stereo ma_device device; ma_context context; ma_device_config deviceConfig; Samples* samples = nullptr; const AudioDeviceConfig& audioSettings; bool initialized = false; bool running = false; // Store the last stereo sample we output. We play this when underruning to avoid pops. std::array lastStereoSample; std::vector audioDevices; public: MiniAudioDevice(const AudioDeviceConfig& audioSettings); // If safe is on, we create a null audio device void init(Samples& samples, bool safe = false); void close(); void start(); void stop(); bool isInitialized() const { return initialized; } };