#ifndef PS2_AUDIO_H #define PS2_AUDIO_H #include #include #include #include #include class PS2AudioBackend { public: PS2AudioBackend(); ~PS2AudioBackend(); void onVagTransfer(const uint8_t *rdram, uint32_t srcAddr, uint32_t sizeBytes); void onVagTransferFromBuffer(const uint8_t *data, uint32_t sizeBytes, uint32_t keyAddr); void onSoundCommand(uint32_t sid, uint32_t rpcNum, const uint8_t *sendBuf, uint32_t sendSize, uint8_t *recvBuf, uint32_t recvSize); void play(uint32_t sampleAddr, float pitch = 1.0f, float volume = 1.0f, uint32_t voiceIndex = 0xFFFFFFFFu); void stop(uint32_t voiceId); void stopAll(); void setAudioReady(bool ready) { m_audioReady = ready; } private: struct DecodedSample { std::vector pcm; uint32_t sampleRate = 44100; }; struct Impl; std::unique_ptr m_impl; bool m_audioReady = false; uint32_t m_mostRecentSampleKey = 0; std::vector m_loadOrderSamples; std::vector m_loadOrderSampleKeys; std::unordered_map m_sampleBank; std::mutex m_mutex; void playDecodedSample(uint32_t sampleKey, DecodedSample &sample, float pitch, float volume, bool isBgm = false); void pruneFinishedSounds(); }; #endif