#ifndef GAME_AUDIOPLAYER_H #define GAME_AUDIOPLAYER_H #include "Audio.h" #include "Music.h" #include "rad20player.h" #define AUDIO_CHANNELS 8 #define AUDIO_MAX_PRIORITY 7 #define AUDIO_PLAY_LOOP 0x01 #define AUDIO_PLAY_FIXED_PRIORITY 0x02 class AudioPlayer { public: AudioPlayer(); ~AudioPlayer(); void playMusic(Music &music); void stopMusic(); void pauseMusic(); void resumeMusic(); void playAudio(Audio &audio, int priority, int flags = 0); bool isPlaying(const Audio & audio); void stopAudio(Audio &audio); void stopAllAudio(); void generateSamples(uint8_t *buffer, size_t size); private: friend class Music; friend void radPlayerWriteReg(void *p, uint16_t reg, uint8_t data); friend void audioPlayerOnTimer(); RADPlayer _musicPlayer; Music *_currentMusic{nullptr}; bool _paused{true}; struct { Audio *audio{nullptr}; bool loop{false}; } _channels[AUDIO_CHANNELS]; [[nodiscard]] bool isPlaying(const Music &music) const; void writeOpl(uint16_t reg, uint8_t data) const; void onTimer(); void generateSamples(); void copySamples(); }; extern AudioPlayer audioPlayer; #endif //GAME_AUDIOPLAYER_H