From b5533733c3a19a12d7ea788e0b1b2a93037fa483 Mon Sep 17 00:00:00 2001 From: jaby Date: Thu, 8 Sep 2022 20:36:54 +0200 Subject: [PATCH] Make SPU wait for boot up sound to finish --- include/PSX/System/IOPorts/SPU_IO.hpp | 30 ++++++++++--------- .../include/BootLoader/boot_loader.hpp | 1 + src/Library/src/BootLoader/spu_boot.cpp | 23 ++++++++++---- src/Library/src/BootLoader/start_boot.cpp | 6 ++++ 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/include/PSX/System/IOPorts/SPU_IO.hpp b/include/PSX/System/IOPorts/SPU_IO.hpp index 3a669cd3..b2e87f6e 100644 --- a/include/PSX/System/IOPorts/SPU_IO.hpp +++ b/include/PSX/System/IOPorts/SPU_IO.hpp @@ -25,6 +25,8 @@ namespace SPU { //0..3 = +7, +6, +5, +4 or -6, -7, -6, -5 typedef uint8_t Step; + typedef int16_t SimpleVolume; + struct __no_align SampleRate : public ComplexBitMap { __io_port_inherit_complex_bit_map(SampleRate); @@ -74,14 +76,14 @@ namespace SPU { }; struct __no_align Voice { - IOPort volumeLeft; //Offset: 0x0 - IOPort volumeRight; //Offset: 0x2 - IOPort sampleRate; //Offset: 0x4; - IOPort adr; //Offset: 0x6 - IOPort ad; //Offset: 0x8 - IOPort sr; //Offset: 0xA - IOPort currentVolume; //Offset: 0xC - IOPort repeatAdr; //Offset: 0xE + IOPort volumeLeft; //Offset: 0x0 + IOPort volumeRight; //Offset: 0x2 + IOPort sampleRate; //Offset: 0x4; + IOPort adr; //Offset: 0x6 + IOPort ad; //Offset: 0x8 + IOPort sr; //Offset: 0xA + IOPort currentVolume; //Offset: 0xC + IOPort repeatAdr; //Offset: 0xE }; struct __no_align ControlRegister : public ComplexBitMap { @@ -139,19 +141,19 @@ namespace SPU { } namespace CDVolume { - __declare_io_port_global(int16_t, left, 0x1F801DB0); - __declare_io_port_global(int16_t, right, 0x1F801DB2); + __declare_io_port_global(SimpleVolume, left, 0x1F801DB0); + __declare_io_port_global(SimpleVolume, right, 0x1F801DB2); } namespace ExternalAudioInputVolume { - __declare_io_port_global(int16_t, left, 0x1F801DB4); - __declare_io_port_global(int16_t, right, 0x1F801DB6); + __declare_io_port_global(SimpleVolume, left, 0x1F801DB4); + __declare_io_port_global(SimpleVolume, right, 0x1F801DB6); } namespace Reverb { namespace Volume { - __declare_io_port_global(int16_t, left, 0x1F801D84); - __declare_io_port_global(int16_t, right, 0x1F801D86); + __declare_io_port_global(SimpleVolume, left, 0x1F801D84); + __declare_io_port_global(SimpleVolume, right, 0x1F801D86); } __declare_io_port_global(uint16_t, work_area_adr, 0x1F801DA2); } diff --git a/src/Library/include/BootLoader/boot_loader.hpp b/src/Library/include/BootLoader/boot_loader.hpp index b4f143d3..8e161c0e 100644 --- a/src/Library/include/BootLoader/boot_loader.hpp +++ b/src/Library/include/BootLoader/boot_loader.hpp @@ -6,6 +6,7 @@ namespace GPU { } namespace SPU { + void stop_voices(); void setup(); } diff --git a/src/Library/src/BootLoader/spu_boot.cpp b/src/Library/src/BootLoader/spu_boot.cpp index 7ef4a13b..e998eee6 100644 --- a/src/Library/src/BootLoader/spu_boot.cpp +++ b/src/Library/src/BootLoader/spu_boot.cpp @@ -1,15 +1,12 @@ #include #include +#include #include namespace SPU { using namespace Port; using namespace DMA::Port; - 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)); @@ -70,8 +67,24 @@ namespace SPU { DataTransferControl.write(RequiredValue); } + static void wait_voices() { + static constexpr int16_t Treshhold = (I16_MAX*0.03); + + try_again: + for(const auto& voice : Voices) { + if(voice.currentVolume.read() > Treshhold) { + goto try_again; + } + } + } + + void stop_voices() { + Key::off.write(UI32_MAX); + } + void setup() { - clear_key(); + wait_voices(); + clear_main_volume(); clear_cd_and_ext_audio_volume(); clear_control_register(); diff --git a/src/Library/src/BootLoader/start_boot.cpp b/src/Library/src/BootLoader/start_boot.cpp index 857fa605..a62cd893 100644 --- a/src/Library/src/BootLoader/start_boot.cpp +++ b/src/Library/src/BootLoader/start_boot.cpp @@ -4,7 +4,13 @@ namespace JabyEngine { void start() { printf("Hello Planschbecken\n"); + //We key off the voices + SPU::stop_voices(); + //Load picture here + //Pause?? + + //Do the real setup GPU::setup(); SPU::setup(); printf("Setup done!\n");