#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(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() { }