121 lines
2.5 KiB
C++
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() {
|
|
|
|
}
|
|
|