88 lines
2.4 KiB
C++
88 lines
2.4 KiB
C++
#include <PSX/System/IOPorts/SPU_IO.hpp>
|
|
#include <PSX/System/IOPorts/DMA_IO.hpp>
|
|
|
|
namespace SPU {
|
|
using namespace Port;
|
|
using namespace DMA;
|
|
|
|
static void clear_key() {
|
|
Key::off.write(UI32_MAX);
|
|
}
|
|
|
|
static void clear_main_volume() {
|
|
static constexpr auto StartVol = SweepVolume::with(SweepVolume::VolumeEnable, SweepVolume::Volume.with(I16_MAX >> 2));
|
|
|
|
MainVolume::left.write(StartVol);
|
|
MainVolume::right.write(StartVol);
|
|
}
|
|
|
|
static void clear_cd_and_ext_audio_volume() {
|
|
CDVolume::left.write(0);
|
|
CDVolume::right.write(0);
|
|
|
|
ExternalAudioInputVolume::left.write(0);
|
|
ExternalAudioInputVolume::right.write(0);
|
|
}
|
|
|
|
static void clear_control_register() {
|
|
Control.write(ControlRegister());
|
|
}
|
|
|
|
static void clear_voice() {
|
|
for(auto& voice : Voices) {
|
|
voice.volumeLeft.write(SweepVolume());
|
|
voice.volumeRight.write(SweepVolume());
|
|
voice.sampleRate.write(SampleRate());
|
|
voice.ad.write(AD());
|
|
voice.sr.write(SR());
|
|
voice.currentVolume.write(SweepVolume());
|
|
|
|
voice.adr.write(0x200);
|
|
voice.repeatAdr.write(0x200);
|
|
}
|
|
}
|
|
|
|
static void clear_pmon() {
|
|
PMON.write(PitchModFlags());
|
|
}
|
|
|
|
static void clear_noise_and_echo() {
|
|
NON.write(NoiseGenerator());
|
|
EON.write(EchoOn());
|
|
}
|
|
|
|
static void clear_reverb() {
|
|
Reverb::Volume::left.write(0);
|
|
Reverb::Volume::right.write(0);
|
|
Reverb::work_area_adr.write(0);
|
|
}
|
|
|
|
static void setup_control_register() {
|
|
static constexpr auto SetupValue = ControlRegister::with(ControlRegister::Enable, ControlRegister::Unmute, ControlRegister::CDAudioEnable);
|
|
|
|
Control.write(SetupValue);
|
|
}
|
|
|
|
static void setup_data_transfer_control() {
|
|
static constexpr uint16_t RequiredValue = (2 << 1);
|
|
|
|
DataTransferControl.write(RequiredValue);
|
|
}
|
|
|
|
void setup() {
|
|
clear_key();
|
|
clear_main_volume();
|
|
clear_cd_and_ext_audio_volume();
|
|
clear_control_register();
|
|
clear_voice();
|
|
clear_pmon();
|
|
clear_noise_and_echo();
|
|
clear_reverb();
|
|
|
|
setup_data_transfer_control();
|
|
setup_control_register();
|
|
|
|
// Enable SPU DMA
|
|
DPCR.write(DPCR.read() | DMAControlRegister::SPUEnable);
|
|
}
|
|
} |