65 lines
1.3 KiB
C++
65 lines
1.3 KiB
C++
#ifndef GAME_AUDIOPLAYER_H
|
|
#define GAME_AUDIOPLAYER_H
|
|
|
|
#include <cstdint>
|
|
|
|
#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
|