75 lines
1.5 KiB
C++
75 lines
1.5 KiB
C++
#ifndef GAME_AUDIOPLAYER_H
|
|
#define GAME_AUDIOPLAYER_H
|
|
|
|
#include <dpmi.h>
|
|
|
|
#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
|