dosgame1/audio/AudioPlayer.cpp

121 lines
2.5 KiB
C++

#include "AudioPlayer.h"
#include "../system/Opl.h"
#include "../system/Timer.h"
#include "../util/Log.h"
AudioPlayer audioPlayer;
void radPlayerWriteReg(void *p, uint16_t reg, uint8_t data) {
auto player = static_cast<AudioPlayer *>(p);
player->writeOpl(reg, data);
}
void audioPlayerOnTimer() {
audioPlayer.onTimer();
}
void audioPlayerOnTimerDelayed() {
DefaultLog.log("audioPlayerOnTimerDelayed()\n");
static int idle = 10;
if (--idle) return;
Timer::instance().setCallback(audioPlayerOnTimer);
}
AudioPlayer::AudioPlayer() {
Timer::instance().setCallback(audioPlayerOnTimerDelayed);
}
AudioPlayer::~AudioPlayer() {
Timer::instance().setCallback(nullptr);
}
void AudioPlayer::playMusic(Music &music) {
stopMusic();
_currentMusic = &music;
_musicPlayer.Init(_currentMusic->getData(), radPlayerWriteReg, this);
auto hz = _musicPlayer.GetHertz();
if (hz < 0) {
stopMusic();
return;
}
// Start music playback
Timer::instance().setFrequency(hz);
resumeMusic();
}
void AudioPlayer::stopMusic() {
if (!_currentMusic) return;
_musicPlayer.Stop();
_paused = true;
_currentMusic = nullptr;
}
void AudioPlayer::pauseMusic() {
_paused = true;
}
void AudioPlayer::resumeMusic() {
if (!_currentMusic) return;
_paused = false;
}
void AudioPlayer::playAudio(Audio &audio, int priority, int flags) {
if (priority > AUDIO_MAX_PRIORITY) priority = AUDIO_MAX_PRIORITY;
}
bool AudioPlayer::isPlaying(const Audio &audio) {
for (auto &channel : _channels) {
if (channel.audio == &audio) return true;
}
return false;
}
void AudioPlayer::stopAudio(Audio &audio) {
for (auto &channel : _channels) {
if (channel.audio == &audio) {
channel.audio = nullptr;
channel.loop = false;
}
}
}
void AudioPlayer::stopAllAudio() {
for (auto &channel : _channels) {
channel.audio = nullptr;
channel.loop = false;
}
}
void AudioPlayer::generateSamples(uint8_t *buffer, size_t size) {
}
bool AudioPlayer::isPlaying(const Music &music) const {
return _currentMusic == &music;
}
void AudioPlayer::writeOpl(uint16_t reg, uint8_t data) const {
Opl::write(reg, data);
}
void AudioPlayer::onTimer() {
if (_paused) return;
if (!_currentMusic) return;
_musicPlayer.Update();
}
void AudioPlayer::generateSamples() {
}