Update SPU IO way

This commit is contained in:
2024-09-22 16:10:18 +02:00
parent f138ca9a9d
commit acef4b8d68
8 changed files with 258 additions and 201 deletions

View File

@@ -26,7 +26,7 @@ namespace JabyEngine {
DMA_IO::SPU.set_adr(adr);
}
static void set_dst(SPU::SRAM_Adr adr) {
static void set_dst(SPU::SRAMAdr adr) {
SPU_IO::SRAMTransferAdr.write(adr);
SPU_IO::ControlRegister.set_transfer_mode(SPU_IO::ControlRegister::DMAWrite);
}

View File

@@ -8,7 +8,7 @@ namespace JabyEngine {
using namespace SPU_IO;
static void clear_main_volume() {
static constexpr auto StartVol = SweepVolume::from(SweepVolume::VolumeEnable, SweepVolume::Volume.with(static_cast<int16_t>(I16_MAX >> 2)));
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);
@@ -18,37 +18,37 @@ namespace JabyEngine {
CDVolume::Left.write(0.75_vol);
CDVolume::Right.write(0.75_vol);
ExternalAudioInputVolume::Left.write({0});
ExternalAudioInputVolume::Right.write({0});
ExternalAudioInputVolume::Left.write(SimpleVolume::mute());
ExternalAudioInputVolume::Right.write(SimpleVolume::mute());
}
static void clear_voice() {
for(auto& voice : SPU_IO::Voice) {
voice.volumeLeft.write({0});
voice.volumeRight.write({0});
voice.sampleRate.write({0});
voice.ad.write({0});
voice.sr.write({0});
voice.currentVolume.write({0});
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.currentVolume.write(SimpleVolume::mute());
voice.adr.write(Voice::start_adr());
voice.repeatAdr.write(Voice::start_adr());
voice.adr.write(SRAMAdr::adpcm_start());
voice.repeatAdr.write(SRAMAdr::adpcm_start());
}
}
static void clear_pmon() {
SPU_IO::PMON.write({0});
SPU_IO::PMON.write(PitchModulation::AllOff());
}
static void clear_noise_and_echo() {
SPU_IO::NON.write({0});
SPU_IO::NON.write(Noise::AllOff());
SPU_IO::EON.write(Echo::AllOff());
}
static void clear_reverb() {
Reverb::Volume::Left.write({0});
Reverb::Volume::Right.write({0});
Reverb::WorkAreaAdr.write({0});
Reverb::Volume::Left.write(SimpleVolume::mute());
Reverb::Volume::Right.write(SimpleVolume::mute());
Reverb::WorkAreaAdr.write(SRAMAdr::null());
}
static void setup_control_register() {
@@ -57,12 +57,6 @@ namespace JabyEngine {
SPU_IO::ControlRegister.write(SetupValue);
}
static void setup_data_transfer_control() {
static constexpr struct DataTransferControl RequiredValue{(2 << 1)};
DataTransferControl.write(RequiredValue);
}
static void wait_voices() {
static constexpr SimpleVolume Treshhold{static_cast<int16_t>(I16_MAX*0.03)};
@@ -75,7 +69,7 @@ namespace JabyEngine {
}
void stop_voices() {
SPU_IO::Key::Off.write({UI32_MAX});
SPU_IO::Key::Off.write(KeyOff::all());
}
void setup() {
@@ -88,7 +82,6 @@ namespace JabyEngine {
clear_noise_and_echo();
clear_reverb();
setup_data_transfer_control();
setup_control_register();
}
}

View File

@@ -31,9 +31,9 @@ namespace JabyEngine {
};
struct VAGState {
uint32_t voice_id;
size_t words_left;
SPU::SRAM_Adr adr;
uint32_t voice_id;
size_t words_left;
SPU::SRAMAdr adr;
static constexpr VAGState create(uint32_t voice_id) {
return VAGState{.voice_id = voice_id, .words_left = 0, .adr = 0};

View File

@@ -8,16 +8,16 @@
namespace JabyEngine {
namespace SPU {
SRAM_Adr Voice :: allocate(size_t size) const {
SRAMAdr Voice :: allocate(size_t size) const {
Voice::stop();
const auto voice_id = Voice::get_id();
const auto adr = SRAM_Adr{static_cast<SRAM_Adr::UnderlyingType>(reinterpret_cast<uintptr_t>(SPU_MMU::allocate(voice_id, size)))};
const auto adr = SRAMAdr{static_cast<SRAMAdr::UnderlyingType>(reinterpret_cast<uintptr_t>(SPU_MMU::allocate(voice_id, size)))};
SPU_IO::Voice[voice_id].adr.write(adr);
return adr;
}
SRAM_Adr Voice :: allocate(SPU_IO::SampleRate frequency, size_t size) const {
SRAMAdr Voice :: allocate(SPU_IO::SampleRate frequency, size_t size) const {
const auto result = Voice::allocate(size);
Voice::set_sample_rate(frequency);
return result;