#ifndef GAME_AUDIOPLAYER_H #define GAME_AUDIOPLAYER_H #include #include "Audio.h" #include "Music.h" #include "rad20player.h" #define SB_BUFFER_SIZE 1024 #define SB_BUFFERS 32 #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(); 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}; uint16_t _oplReg{0x388}; _go32_dpmi_seginfo _dmaBuffer{}; uint8_t (*_buffers)[SB_BUFFER_SIZE]{}; uint8_t _dmaPage{0}; uint16_t _dmaOffset{0}; unsigned _nextBufferReadIndex{0}; unsigned _nextBufferWriteIndex{0}; 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