#include #include namespace JabyEngine { namespace boot { namespace SPU { using namespace JabyEngine; using namespace SPU_IO; static void clear_main_volume() { static constexpr auto StartVol = SweepVolume::from(SweepVolume::VolumeMode::Enable, SweepVolume::VolumeMode::Volume.with(SweepVolume::VolumeMode::MaxVolume >> 1)); MainVolume::Left.write(StartVol); MainVolume::Right.write(StartVol); } static void clear_cd_and_ext_audio_volume() { CDVolume::Left.write(0.75_vol); CDVolume::Right.write(0.75_vol); ExternalAudioInputVolume::Left.write(SimpleVolume::mute()); ExternalAudioInputVolume::Right.write(SimpleVolume::mute()); } static void clear_voice() { for(auto& voice : SPU_IO::Voice) { voice.volumeLeft.write(SweepVolume::mute()); voice.volumeRight.write(SweepVolume::mute()); voice.sampleRate.write(SampleRate::stop()); voice.ad.write(AD::none()); voice.sr.write(SR::none()); voice.adsr_volume.write(SimpleVolume::mute()); voice.adr.write(SRAMAdr::adpcm_start()); voice.repeatAdr.write(SRAMAdr::adpcm_start()); } } static void clear_pmon() { SPU_IO::PMON.write(PitchModulation::AllOff()); } static void clear_noise_and_echo() { SPU_IO::NON.write(Noise::AllOff()); SPU_IO::EON.write(Echo::AllOff()); } static void clear_reverb() { Reverb::Volume::Left.write(SimpleVolume::mute()); Reverb::Volume::Right.write(SimpleVolume::mute()); Reverb::WorkAreaAdr.write(SRAMAdr::null()); } static void setup_control_register() { static constexpr auto SetupValue = ControlRegister::from(ControlRegister::Enable, ControlRegister::Unmute, ControlRegister::CDAudioEnable); SPU_IO::ControlRegister.write(SetupValue); } static void wait_voices() { static constexpr auto Treshhold = SimpleVolume::mute(); try_again: for(const auto& voice : SPU_IO::Voice) { if(voice.adsr_volume.read() > Treshhold) { goto try_again; } } } void stop_voices() { SPU_IO::Key::Off.write(KeyOff::all()); } void setup() { wait_voices(); clear_main_volume(); clear_cd_and_ext_audio_volume(); clear_voice(); clear_pmon(); clear_noise_and_echo(); clear_reverb(); setup_control_register(); } } } }