duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

spu.cpp (91951B)


      1 // SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <stenzek@gmail.com>
      2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0)
      3 
      4 #include "spu.h"
      5 #include "cdrom.h"
      6 #include "dma.h"
      7 #include "host.h"
      8 #include "imgui.h"
      9 #include "interrupt_controller.h"
     10 #include "system.h"
     11 #include "timing_event.h"
     12 
     13 #include "util/audio_stream.h"
     14 #include "util/imgui_manager.h"
     15 #include "util/media_capture.h"
     16 #include "util/state_wrapper.h"
     17 #include "util/wav_writer.h"
     18 
     19 #include "common/bitfield.h"
     20 #include "common/bitutils.h"
     21 #include "common/error.h"
     22 #include "common/fifo_queue.h"
     23 #include "common/log.h"
     24 #include "common/path.h"
     25 
     26 #include <memory>
     27 
     28 Log_SetChannel(SPU);
     29 
     30 // Enable to dump all voices of the SPU audio individually.
     31 // #define SPU_DUMP_ALL_VOICES 1
     32 
     33 ALWAYS_INLINE static constexpr s32 Clamp16(s32 value)
     34 {
     35   return (value < -0x8000) ? -0x8000 : (value > 0x7FFF) ? 0x7FFF : value;
     36 }
     37 
     38 ALWAYS_INLINE static constexpr s32 ApplyVolume(s32 sample, s16 volume)
     39 {
     40   return (sample * s32(volume)) >> 15;
     41 }
     42 
     43 namespace SPU {
     44 namespace {
     45 
     46 enum : u32
     47 {
     48   SPU_BASE = 0x1F801C00,
     49   NUM_VOICES = 24,
     50   NUM_VOICE_REGISTERS = 8,
     51   VOICE_ADDRESS_SHIFT = 3,
     52   NUM_SAMPLES_PER_ADPCM_BLOCK = 28,
     53   NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK = 3,
     54   SYSCLK_TICKS_PER_SPU_TICK = static_cast<u32>(System::MASTER_CLOCK) / static_cast<u32>(SAMPLE_RATE), // 0x300
     55   CAPTURE_BUFFER_SIZE_PER_CHANNEL = 0x400,
     56   MINIMUM_TICKS_BETWEEN_KEY_ON_OFF = 2,
     57   NUM_REVERB_REGS = 32,
     58   FIFO_SIZE_IN_HALFWORDS = 32
     59 };
     60 enum : TickCount
     61 {
     62   TRANSFER_TICKS_PER_HALFWORD = 16
     63 };
     64 
     65 enum class RAMTransferMode : u8
     66 {
     67   Stopped = 0,
     68   ManualWrite = 1,
     69   DMAWrite = 2,
     70   DMARead = 3
     71 };
     72 
     73 union SPUCNTRegister
     74 {
     75   u16 bits;
     76 
     77   BitField<u16, bool, 15, 1> enable;
     78   BitField<u16, bool, 14, 1> mute_n;
     79   BitField<u16, u8, 8, 6> noise_clock;
     80   BitField<u16, bool, 7, 1> reverb_master_enable;
     81   BitField<u16, bool, 6, 1> irq9_enable;
     82   BitField<u16, RAMTransferMode, 4, 2> ram_transfer_mode;
     83   BitField<u16, bool, 3, 1> external_audio_reverb;
     84   BitField<u16, bool, 2, 1> cd_audio_reverb;
     85   BitField<u16, bool, 1, 1> external_audio_enable;
     86   BitField<u16, bool, 0, 1> cd_audio_enable;
     87 
     88   BitField<u16, u8, 0, 6> mode;
     89 };
     90 
     91 union SPUSTATRegister
     92 {
     93   u16 bits;
     94 
     95   BitField<u16, bool, 11, 1> second_half_capture_buffer;
     96   BitField<u16, bool, 10, 1> transfer_busy;
     97   BitField<u16, bool, 9, 1> dma_write_request;
     98   BitField<u16, bool, 8, 1> dma_read_request;
     99   BitField<u16, bool, 7, 1> dma_request;
    100   BitField<u16, bool, 6, 1> irq9_flag;
    101   BitField<u16, u8, 0, 6> mode;
    102 };
    103 
    104 union TransferControl
    105 {
    106   u16 bits;
    107 
    108   BitField<u8, u8, 1, 3> mode;
    109 };
    110 
    111 union ADSRRegister
    112 {
    113   u32 bits;
    114   struct
    115   {
    116     u16 bits_low;
    117     u16 bits_high;
    118   };
    119 
    120   BitField<u32, u8, 0, 4> sustain_level;
    121   BitField<u32, u8, 4, 4> decay_rate_shr2;
    122   BitField<u32, u8, 8, 7> attack_rate;
    123   BitField<u32, bool, 15, 1> attack_exponential;
    124 
    125   BitField<u32, u8, 16, 5> release_rate_shr2;
    126   BitField<u32, bool, 21, 1> release_exponential;
    127   BitField<u32, u8, 22, 7> sustain_rate;
    128   BitField<u32, bool, 30, 1> sustain_direction_decrease;
    129   BitField<u32, bool, 31, 1> sustain_exponential;
    130 };
    131 
    132 union VolumeRegister
    133 {
    134   u16 bits;
    135 
    136   BitField<u16, bool, 15, 1> sweep_mode;
    137   BitField<u16, s16, 0, 15> fixed_volume_shr1; // divided by 2
    138 
    139   BitField<u16, bool, 14, 1> sweep_exponential;
    140   BitField<u16, bool, 13, 1> sweep_direction_decrease;
    141   BitField<u16, bool, 12, 1> sweep_phase_negative;
    142   BitField<u16, u8, 0, 7> sweep_rate;
    143 };
    144 
    145 // organized so we can replace this with a u16 array in the future
    146 union VoiceRegisters
    147 {
    148   u16 index[NUM_VOICE_REGISTERS];
    149 
    150   struct
    151   {
    152     VolumeRegister volume_left;
    153     VolumeRegister volume_right;
    154 
    155     u16 adpcm_sample_rate;   // VxPitch
    156     u16 adpcm_start_address; // multiply by 8
    157 
    158     ADSRRegister adsr;
    159     s16 adsr_volume;
    160 
    161     u16 adpcm_repeat_address; // multiply by 8
    162   };
    163 };
    164 
    165 union VoiceCounter
    166 {
    167   // promoted to u32 because of overflow
    168   u32 bits;
    169 
    170   BitField<u32, u8, 4, 8> interpolation_index;
    171   BitField<u32, u8, 12, 5> sample_index;
    172 };
    173 
    174 union ADPCMFlags
    175 {
    176   u8 bits;
    177 
    178   BitField<u8, bool, 0, 1> loop_end;
    179   BitField<u8, bool, 1, 1> loop_repeat;
    180   BitField<u8, bool, 2, 1> loop_start;
    181 };
    182 
    183 struct ADPCMBlock
    184 {
    185   union
    186   {
    187     u8 bits;
    188 
    189     BitField<u8, u8, 0, 4> shift;
    190     BitField<u8, u8, 4, 3> filter;
    191   } shift_filter;
    192   ADPCMFlags flags;
    193   u8 data[NUM_SAMPLES_PER_ADPCM_BLOCK / 2];
    194 
    195   // For both 4bit and 8bit ADPCM, reserved shift values 13..15 will act same as shift=9).
    196   u8 GetShift() const
    197   {
    198     const u8 shift = shift_filter.shift;
    199     return (shift > 12) ? 9 : shift;
    200   }
    201 
    202   u8 GetFilter() const { return std::min<u8>(shift_filter.filter, 4); }
    203 
    204   u8 GetNibble(u32 index) const { return (data[index / 2] >> ((index % 2) * 4)) & 0x0F; }
    205 };
    206 
    207 struct VolumeEnvelope
    208 {
    209   static constexpr s32 MIN_VOLUME = -32768;
    210   static constexpr s32 MAX_VOLUME = 32767;
    211 
    212   u32 counter;
    213   u16 counter_increment;
    214   s16 step;
    215   u8 rate;
    216   bool decreasing;
    217   bool exponential;
    218   bool phase_invert;
    219 
    220   void Reset(u8 rate_, u8 rate_mask_, bool decreasing_, bool exponential_, bool phase_invert_);
    221   bool Tick(s16& current_level);
    222 };
    223 
    224 struct VolumeSweep
    225 {
    226   VolumeEnvelope envelope;
    227   s16 current_level;
    228   bool envelope_active;
    229 
    230   void Reset(VolumeRegister reg);
    231   void Tick();
    232 };
    233 
    234 enum class ADSRPhase : u8
    235 {
    236   Off = 0,
    237   Attack = 1,
    238   Decay = 2,
    239   Sustain = 3,
    240   Release = 4
    241 };
    242 
    243 struct Voice
    244 {
    245   u16 current_address;
    246   VoiceRegisters regs;
    247   VoiceCounter counter;
    248   ADPCMFlags current_block_flags;
    249   bool is_first_block;
    250   std::array<s16, NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK + NUM_SAMPLES_PER_ADPCM_BLOCK> current_block_samples;
    251   std::array<s16, 2> adpcm_last_samples;
    252   s32 last_volume;
    253 
    254   VolumeSweep left_volume;
    255   VolumeSweep right_volume;
    256 
    257   VolumeEnvelope adsr_envelope;
    258   ADSRPhase adsr_phase;
    259   s16 adsr_target;
    260   bool has_samples;
    261   bool ignore_loop_address;
    262 
    263   bool IsOn() const { return adsr_phase != ADSRPhase::Off; }
    264 
    265   void KeyOn();
    266   void KeyOff();
    267   void ForceOff();
    268 
    269   void DecodeBlock(const ADPCMBlock& block);
    270   s32 Interpolate() const;
    271 
    272   // Switches to the specified phase, filling in target.
    273   void UpdateADSREnvelope();
    274 
    275   // Updates the ADSR volume/phase.
    276   void TickADSR();
    277 };
    278 
    279 struct ReverbRegisters
    280 {
    281   s16 vLOUT;
    282   s16 vROUT;
    283   u16 mBASE;
    284 
    285   union
    286   {
    287     struct
    288     {
    289       u16 FB_SRC_A;
    290       u16 FB_SRC_B;
    291       s16 IIR_ALPHA;
    292       s16 ACC_COEF_A;
    293       s16 ACC_COEF_B;
    294       s16 ACC_COEF_C;
    295       s16 ACC_COEF_D;
    296       s16 IIR_COEF;
    297       s16 FB_ALPHA;
    298       s16 FB_X;
    299       u16 IIR_DEST_A[2];
    300       u16 ACC_SRC_A[2];
    301       u16 ACC_SRC_B[2];
    302       u16 IIR_SRC_A[2];
    303       u16 IIR_DEST_B[2];
    304       u16 ACC_SRC_C[2];
    305       u16 ACC_SRC_D[2];
    306       u16 IIR_SRC_B[2];
    307       u16 MIX_DEST_A[2];
    308       u16 MIX_DEST_B[2];
    309       s16 IN_COEF[2];
    310     };
    311 
    312     u16 rev[NUM_REVERB_REGS];
    313   };
    314 };
    315 } // namespace
    316 
    317 template<bool COMPATIBILITY>
    318 static bool DoCompatibleState(StateWrapper& sw);
    319 
    320 static ADSRPhase GetNextADSRPhase(ADSRPhase phase);
    321 
    322 static bool IsVoiceReverbEnabled(u32 i);
    323 static bool IsVoiceNoiseEnabled(u32 i);
    324 static bool IsPitchModulationEnabled(u32 i);
    325 static s16 GetVoiceNoiseLevel();
    326 
    327 static u16 ReadVoiceRegister(u32 offset);
    328 static void WriteVoiceRegister(u32 offset, u16 value);
    329 
    330 static bool IsRAMIRQTriggerable();
    331 static bool CheckRAMIRQ(u32 address);
    332 static void TriggerRAMIRQ();
    333 static void CheckForLateRAMIRQs();
    334 
    335 static void WriteToCaptureBuffer(u32 index, s16 value);
    336 static void IncrementCaptureBufferPosition();
    337 
    338 static void ReadADPCMBlock(u16 address, ADPCMBlock* block);
    339 static std::tuple<s32, s32> SampleVoice(u32 voice_index);
    340 
    341 static void UpdateNoise();
    342 
    343 static u32 ReverbMemoryAddress(u32 address);
    344 static s16 ReverbRead(u32 address, s32 offset = 0);
    345 static void ReverbWrite(u32 address, s16 data);
    346 static void ProcessReverb(s32 left_in, s32 right_in, s32* left_out, s32* right_out);
    347 
    348 static void InternalGeneratePendingSamples();
    349 static void Execute(void* param, TickCount ticks, TickCount ticks_late);
    350 static void UpdateEventInterval();
    351 
    352 static void ExecuteFIFOWriteToRAM(TickCount& ticks);
    353 static void ExecuteFIFOReadFromRAM(TickCount& ticks);
    354 static void ExecuteTransfer(void* param, TickCount ticks, TickCount ticks_late);
    355 static void ManualTransferWrite(u16 value);
    356 static void UpdateTransferEvent();
    357 static void UpdateDMARequest();
    358 
    359 static void CreateOutputStream();
    360 
    361 namespace {
    362 struct SPUState
    363 {
    364   TimingEvent transfer_event{"SPU Transfer", TRANSFER_TICKS_PER_HALFWORD, TRANSFER_TICKS_PER_HALFWORD,
    365                              &SPU::ExecuteTransfer, nullptr};
    366   TimingEvent tick_event{"SPU Sample", SYSCLK_TICKS_PER_SPU_TICK, SYSCLK_TICKS_PER_SPU_TICK, &SPU::Execute, nullptr};
    367 
    368   TickCount ticks_carry = 0;
    369   TickCount cpu_ticks_per_spu_tick = 0;
    370   TickCount cpu_tick_divider = 0;
    371 
    372   SPUCNTRegister SPUCNT = {};
    373   SPUSTATRegister SPUSTAT = {};
    374 
    375   TransferControl transfer_control = {};
    376   u16 transfer_address_reg = 0;
    377   u32 transfer_address = 0;
    378 
    379   u16 irq_address = 0;
    380   u16 capture_buffer_position = 0;
    381 
    382   VolumeRegister main_volume_left_reg = {};
    383   VolumeRegister main_volume_right_reg = {};
    384   VolumeSweep main_volume_left = {};
    385   VolumeSweep main_volume_right = {};
    386 
    387   s16 cd_audio_volume_left = 0;
    388   s16 cd_audio_volume_right = 0;
    389 
    390   s16 external_volume_left = 0;
    391   s16 external_volume_right = 0;
    392 
    393   u32 key_on_register = 0;
    394   u32 key_off_register = 0;
    395   u32 endx_register = 0;
    396   u32 pitch_modulation_enable_register = 0;
    397 
    398   u32 noise_mode_register = 0;
    399   u32 noise_count = 0;
    400   u32 noise_level = 0;
    401 
    402   u32 reverb_on_register = 0;
    403   u32 reverb_base_address = 0;
    404   u32 reverb_current_address = 0;
    405   ReverbRegisters reverb_registers{};
    406   std::array<std::array<s16, 128>, 2> reverb_downsample_buffer;
    407   std::array<std::array<s16, 64>, 2> reverb_upsample_buffer;
    408   s32 reverb_resample_buffer_position = 0;
    409 
    410   ALIGN_TO_CACHE_LINE std::array<Voice, NUM_VOICES> voices{};
    411 
    412   InlineFIFOQueue<u16, FIFO_SIZE_IN_HALFWORDS> transfer_fifo;
    413 
    414   std::unique_ptr<AudioStream> audio_stream;
    415   std::unique_ptr<AudioStream> null_audio_stream;
    416 
    417   s16 last_reverb_input[2];
    418   s32 last_reverb_output[2];
    419   bool audio_output_muted = false;
    420 
    421 #ifdef SPU_DUMP_ALL_VOICES
    422   // +1 for reverb output
    423   std::array<std::unique_ptr<WAVWriter>, NUM_VOICES + 1> s_voice_dump_writers;
    424 #endif
    425 };
    426 } // namespace
    427 
    428 ALIGN_TO_CACHE_LINE static SPUState s_state;
    429 ALIGN_TO_CACHE_LINE static std::array<u8, RAM_SIZE> s_ram{};
    430 
    431 } // namespace SPU
    432 
    433 void SPU::Initialize()
    434 {
    435   // (X * D) / N / 768 -> (X * D) / (N * 768)
    436   s_state.cpu_ticks_per_spu_tick = System::ScaleTicksToOverclock(SYSCLK_TICKS_PER_SPU_TICK);
    437   s_state.cpu_tick_divider = static_cast<TickCount>(g_settings.cpu_overclock_numerator * SYSCLK_TICKS_PER_SPU_TICK);
    438   s_state.tick_event.SetInterval(s_state.cpu_ticks_per_spu_tick);
    439   s_state.tick_event.SetPeriod(s_state.cpu_ticks_per_spu_tick);
    440   s_state.null_audio_stream = AudioStream::CreateNullStream(SAMPLE_RATE, g_settings.audio_stream_parameters.buffer_ms);
    441 
    442   CreateOutputStream();
    443   Reset();
    444 
    445 #ifdef SPU_DUMP_ALL_VOICES
    446   {
    447     const std::string base_path = System::GetNewMediaCapturePath(System::GetGameTitle(), "wav");
    448     for (size_t i = 0; i < s_state.s_voice_dump_writers.size(); i++)
    449     {
    450       s_state.s_voice_dump_writers[i].reset();
    451       s_state.s_voice_dump_writers[i] = std::make_unique<WAVWriter>();
    452 
    453       TinyString new_suffix;
    454       if (i == NUM_VOICES)
    455         new_suffix.assign("reverb.wav");
    456       else
    457         new_suffix.format("voice{}.wav", i);
    458 
    459       const std::string voice_filename = Path::ReplaceExtension(base_path, new_suffix);
    460       if (!s_state.s_voice_dump_writers[i]->Open(voice_filename.c_str(), SAMPLE_RATE, 2))
    461       {
    462         ERROR_LOG("Failed to open voice dump filename '{}'", voice_filename.c_str());
    463         s_state.s_voice_dump_writers[i].reset();
    464       }
    465     }
    466   }
    467 #endif
    468 }
    469 
    470 void SPU::CreateOutputStream()
    471 {
    472   INFO_LOG("Creating '{}' audio stream, sample rate = {}, expansion = {}, buffer = {}, latency = {}{}, stretching = {}",
    473            AudioStream::GetBackendName(g_settings.audio_backend), static_cast<u32>(SAMPLE_RATE),
    474            AudioStream::GetExpansionModeName(g_settings.audio_stream_parameters.expansion_mode),
    475            g_settings.audio_stream_parameters.buffer_ms, g_settings.audio_stream_parameters.output_latency_ms,
    476            g_settings.audio_stream_parameters.output_latency_minimal ? " (or minimal)" : "",
    477            AudioStream::GetStretchModeName(g_settings.audio_stream_parameters.stretch_mode));
    478 
    479   Error error;
    480   s_state.audio_stream =
    481     AudioStream::CreateStream(g_settings.audio_backend, SAMPLE_RATE, g_settings.audio_stream_parameters,
    482                               g_settings.audio_driver.c_str(), g_settings.audio_output_device.c_str(), &error);
    483   if (!s_state.audio_stream)
    484   {
    485     Host::ReportErrorAsync(
    486       "Error",
    487       fmt::format("Failed to create or configure audio stream, falling back to null output. The error was:\n{}",
    488                   error.GetDescription()));
    489     s_state.audio_stream.reset();
    490     s_state.audio_stream = AudioStream::CreateNullStream(SAMPLE_RATE, g_settings.audio_stream_parameters.buffer_ms);
    491   }
    492 
    493   s_state.audio_stream->SetOutputVolume(System::GetAudioOutputVolume());
    494   s_state.audio_stream->SetNominalRate(System::GetAudioNominalRate());
    495   s_state.audio_stream->SetPaused(System::IsPaused());
    496 }
    497 
    498 void SPU::RecreateOutputStream()
    499 {
    500   s_state.audio_stream.reset();
    501   CreateOutputStream();
    502 }
    503 
    504 void SPU::CPUClockChanged()
    505 {
    506   // (X * D) / N / 768 -> (X * D) / (N * 768)
    507   s_state.cpu_ticks_per_spu_tick = System::ScaleTicksToOverclock(SYSCLK_TICKS_PER_SPU_TICK);
    508   s_state.cpu_tick_divider = static_cast<TickCount>(g_settings.cpu_overclock_numerator * SYSCLK_TICKS_PER_SPU_TICK);
    509   s_state.ticks_carry = 0;
    510   UpdateEventInterval();
    511 }
    512 
    513 void SPU::Shutdown()
    514 {
    515 #ifdef SPU_DUMP_ALL_VOICES
    516   for (size_t i = 0; i < s_state.s_voice_dump_writers.size(); i++)
    517     s_state.s_voice_dump_writers[i].reset();
    518 #endif
    519 
    520   s_state.tick_event.Deactivate();
    521   s_state.transfer_event.Deactivate();
    522   s_state.audio_stream.reset();
    523 }
    524 
    525 void SPU::Reset()
    526 {
    527   s_state.ticks_carry = 0;
    528 
    529   s_state.SPUCNT.bits = 0;
    530   s_state.SPUSTAT.bits = 0;
    531   s_state.transfer_address = 0;
    532   s_state.transfer_address_reg = 0;
    533   s_state.irq_address = 0;
    534   s_state.capture_buffer_position = 0;
    535   s_state.main_volume_left_reg.bits = 0;
    536   s_state.main_volume_right_reg.bits = 0;
    537   s_state.main_volume_left = {};
    538   s_state.main_volume_right = {};
    539   s_state.cd_audio_volume_left = 0;
    540   s_state.cd_audio_volume_right = 0;
    541   s_state.external_volume_left = 0;
    542   s_state.external_volume_right = 0;
    543   s_state.key_on_register = 0;
    544   s_state.key_off_register = 0;
    545   s_state.endx_register = 0;
    546   s_state.pitch_modulation_enable_register = 0;
    547 
    548   s_state.noise_mode_register = 0;
    549   s_state.noise_count = 0;
    550   s_state.noise_level = 1;
    551 
    552   s_state.reverb_on_register = 0;
    553   s_state.reverb_registers = {};
    554   s_state.reverb_registers.mBASE = 0;
    555   s_state.reverb_base_address = s_state.reverb_current_address = ZeroExtend32(s_state.reverb_registers.mBASE) << 2;
    556   s_state.reverb_downsample_buffer = {};
    557   s_state.reverb_upsample_buffer = {};
    558   s_state.reverb_resample_buffer_position = 0;
    559 
    560   for (u32 i = 0; i < NUM_VOICES; i++)
    561   {
    562     Voice& v = s_state.voices[i];
    563     v.current_address = 0;
    564     std::fill_n(v.regs.index, NUM_VOICE_REGISTERS, u16(0));
    565     v.counter.bits = 0;
    566     v.current_block_flags.bits = 0;
    567     v.is_first_block = 0;
    568     v.current_block_samples.fill(s16(0));
    569     v.adpcm_last_samples.fill(s32(0));
    570     v.adsr_envelope.Reset(0, 0, false, false, false);
    571     v.adsr_phase = ADSRPhase::Off;
    572     v.adsr_target = 0;
    573     v.has_samples = false;
    574     v.ignore_loop_address = false;
    575   }
    576 
    577   s_state.tick_event.Deactivate();
    578   s_state.transfer_event.Deactivate();
    579   s_state.transfer_fifo.Clear();
    580   s_ram.fill(0);
    581   UpdateEventInterval();
    582 }
    583 
    584 template<bool COMPATIBILITY>
    585 bool SPU::DoCompatibleState(StateWrapper& sw)
    586 {
    587   struct OldEnvelope
    588   {
    589     s32 counter;
    590     u8 rate;
    591     bool decreasing;
    592     bool exponential;
    593     bool phase_invert;
    594   };
    595   struct OldSweep
    596   {
    597     OldEnvelope env;
    598     bool envelope_active;
    599     s16 current_level;
    600   };
    601 
    602   static constexpr const auto do_compatible_volume_envelope = [](StateWrapper& sw, VolumeEnvelope* env) {
    603     if constexpr (COMPATIBILITY)
    604     {
    605       if (sw.GetVersion() < 70) [[unlikely]]
    606       {
    607         OldEnvelope oenv;
    608         sw.DoPOD(&oenv);
    609         env->Reset(oenv.rate, 0x7f, oenv.decreasing, oenv.exponential, oenv.phase_invert);
    610         env->counter = oenv.counter; // wrong
    611         return;
    612       }
    613     }
    614 
    615     sw.DoPOD(env);
    616   };
    617   static constexpr const auto do_compatible_volume_sweep = [](StateWrapper& sw, VolumeSweep* sweep) {
    618     if constexpr (COMPATIBILITY)
    619     {
    620       if (sw.GetVersion() < 70) [[unlikely]]
    621       {
    622         OldSweep osweep;
    623         sw.DoPOD(&osweep);
    624         sweep->envelope.Reset(osweep.env.rate, 0x7f, osweep.env.decreasing, osweep.env.exponential,
    625                               osweep.env.phase_invert);
    626         sweep->envelope.counter = osweep.env.counter; // wrong
    627         sweep->envelope_active = osweep.envelope_active;
    628         sweep->current_level = osweep.current_level;
    629         return;
    630       }
    631     }
    632 
    633     sw.DoPOD(sweep);
    634   };
    635 
    636   sw.Do(&s_state.ticks_carry);
    637   sw.Do(&s_state.SPUCNT.bits);
    638   sw.Do(&s_state.SPUSTAT.bits);
    639   sw.Do(&s_state.transfer_control.bits);
    640   sw.Do(&s_state.transfer_address);
    641   sw.Do(&s_state.transfer_address_reg);
    642   sw.Do(&s_state.irq_address);
    643   sw.Do(&s_state.capture_buffer_position);
    644   sw.Do(&s_state.main_volume_left_reg.bits);
    645   sw.Do(&s_state.main_volume_right_reg.bits);
    646   do_compatible_volume_sweep(sw, &s_state.main_volume_left);
    647   do_compatible_volume_sweep(sw, &s_state.main_volume_right);
    648   sw.Do(&s_state.cd_audio_volume_left);
    649   sw.Do(&s_state.cd_audio_volume_right);
    650   sw.Do(&s_state.external_volume_left);
    651   sw.Do(&s_state.external_volume_right);
    652   sw.Do(&s_state.key_on_register);
    653   sw.Do(&s_state.key_off_register);
    654   sw.Do(&s_state.endx_register);
    655   sw.Do(&s_state.pitch_modulation_enable_register);
    656   sw.Do(&s_state.noise_mode_register);
    657   sw.Do(&s_state.noise_count);
    658   sw.Do(&s_state.noise_level);
    659   sw.Do(&s_state.reverb_on_register);
    660   sw.Do(&s_state.reverb_base_address);
    661   sw.Do(&s_state.reverb_current_address);
    662   sw.Do(&s_state.reverb_registers.vLOUT);
    663   sw.Do(&s_state.reverb_registers.vROUT);
    664   sw.Do(&s_state.reverb_registers.mBASE);
    665   sw.DoArray(s_state.reverb_registers.rev, NUM_REVERB_REGS);
    666   for (u32 i = 0; i < 2; i++)
    667     sw.DoArray(s_state.reverb_downsample_buffer.data(), s_state.reverb_downsample_buffer.size());
    668   for (u32 i = 0; i < 2; i++)
    669     sw.DoArray(s_state.reverb_upsample_buffer.data(), s_state.reverb_upsample_buffer.size());
    670   sw.Do(&s_state.reverb_resample_buffer_position);
    671   for (u32 i = 0; i < NUM_VOICES; i++)
    672   {
    673     Voice& v = s_state.voices[i];
    674     sw.Do(&v.current_address);
    675     sw.DoArray(v.regs.index, NUM_VOICE_REGISTERS);
    676     sw.Do(&v.counter.bits);
    677     sw.Do(&v.current_block_flags.bits);
    678     if constexpr (COMPATIBILITY)
    679       sw.DoEx(&v.is_first_block, 47, false);
    680     else
    681       sw.Do(&v.is_first_block);
    682     sw.DoArray(&v.current_block_samples[NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK], NUM_SAMPLES_PER_ADPCM_BLOCK);
    683     sw.DoArray(&v.current_block_samples[0], NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK);
    684     sw.Do(&v.adpcm_last_samples);
    685     sw.Do(&v.last_volume);
    686     do_compatible_volume_sweep(sw, &v.left_volume);
    687     do_compatible_volume_sweep(sw, &v.right_volume);
    688     do_compatible_volume_envelope(sw, &v.adsr_envelope);
    689     sw.Do(&v.adsr_phase);
    690     sw.Do(&v.adsr_target);
    691     sw.Do(&v.has_samples);
    692     sw.Do(&v.ignore_loop_address);
    693   }
    694 
    695   sw.Do(&s_state.transfer_fifo);
    696   sw.DoBytes(s_ram.data(), RAM_SIZE);
    697 
    698   if (sw.IsReading())
    699   {
    700     UpdateEventInterval();
    701     UpdateTransferEvent();
    702   }
    703 
    704   return !sw.HasError();
    705 }
    706 
    707 bool SPU::DoState(StateWrapper& sw)
    708 {
    709   if (sw.GetVersion() < 70) [[unlikely]]
    710     return DoCompatibleState<true>(sw);
    711   else
    712     return DoCompatibleState<false>(sw);
    713 }
    714 
    715 u16 SPU::ReadRegister(u32 offset)
    716 {
    717   switch (offset)
    718   {
    719     case 0x1F801D80 - SPU_BASE:
    720       return s_state.main_volume_left_reg.bits;
    721 
    722     case 0x1F801D82 - SPU_BASE:
    723       return s_state.main_volume_right_reg.bits;
    724 
    725     case 0x1F801D84 - SPU_BASE:
    726       return s_state.reverb_registers.vLOUT;
    727 
    728     case 0x1F801D86 - SPU_BASE:
    729       return s_state.reverb_registers.vROUT;
    730 
    731     case 0x1F801D88 - SPU_BASE:
    732       return Truncate16(s_state.key_on_register);
    733 
    734     case 0x1F801D8A - SPU_BASE:
    735       return Truncate16(s_state.key_on_register >> 16);
    736 
    737     case 0x1F801D8C - SPU_BASE:
    738       return Truncate16(s_state.key_off_register);
    739 
    740     case 0x1F801D8E - SPU_BASE:
    741       return Truncate16(s_state.key_off_register >> 16);
    742 
    743     case 0x1F801D90 - SPU_BASE:
    744       return Truncate16(s_state.pitch_modulation_enable_register);
    745 
    746     case 0x1F801D92 - SPU_BASE:
    747       return Truncate16(s_state.pitch_modulation_enable_register >> 16);
    748 
    749     case 0x1F801D94 - SPU_BASE:
    750       return Truncate16(s_state.noise_mode_register);
    751 
    752     case 0x1F801D96 - SPU_BASE:
    753       return Truncate16(s_state.noise_mode_register >> 16);
    754 
    755     case 0x1F801D98 - SPU_BASE:
    756       return Truncate16(s_state.reverb_on_register);
    757 
    758     case 0x1F801D9A - SPU_BASE:
    759       return Truncate16(s_state.reverb_on_register >> 16);
    760 
    761     case 0x1F801D9C - SPU_BASE:
    762       return Truncate16(s_state.endx_register);
    763 
    764     case 0x1F801D9E - SPU_BASE:
    765       return Truncate16(s_state.endx_register >> 16);
    766 
    767     case 0x1F801DA2 - SPU_BASE:
    768       return s_state.reverb_registers.mBASE;
    769 
    770     case 0x1F801DA4 - SPU_BASE:
    771       TRACE_LOG("SPU IRQ address -> 0x{:04X}", s_state.irq_address);
    772       return s_state.irq_address;
    773 
    774     case 0x1F801DA6 - SPU_BASE:
    775       TRACE_LOG("SPU transfer address register -> 0x{:04X}", s_state.transfer_address_reg);
    776       return s_state.transfer_address_reg;
    777 
    778     case 0x1F801DA8 - SPU_BASE:
    779       TRACE_LOG("SPU transfer data register read");
    780       return UINT16_C(0xFFFF);
    781 
    782     case 0x1F801DAA - SPU_BASE:
    783       TRACE_LOG("SPU control register -> 0x{:04X}", s_state.SPUCNT.bits);
    784       return s_state.SPUCNT.bits;
    785 
    786     case 0x1F801DAC - SPU_BASE:
    787       TRACE_LOG("SPU transfer control register -> 0x{:04X}", s_state.transfer_control.bits);
    788       return s_state.transfer_control.bits;
    789 
    790     case 0x1F801DAE - SPU_BASE:
    791       GeneratePendingSamples();
    792       TRACE_LOG("SPU status register -> 0x{:04X}", s_state.SPUCNT.bits);
    793       return s_state.SPUSTAT.bits;
    794 
    795     case 0x1F801DB0 - SPU_BASE:
    796       return s_state.cd_audio_volume_left;
    797 
    798     case 0x1F801DB2 - SPU_BASE:
    799       return s_state.cd_audio_volume_right;
    800 
    801     case 0x1F801DB4 - SPU_BASE:
    802       return s_state.external_volume_left;
    803 
    804     case 0x1F801DB6 - SPU_BASE:
    805       return s_state.external_volume_right;
    806 
    807     case 0x1F801DB8 - SPU_BASE:
    808       GeneratePendingSamples();
    809       return s_state.main_volume_left.current_level;
    810 
    811     case 0x1F801DBA - SPU_BASE:
    812       GeneratePendingSamples();
    813       return s_state.main_volume_right.current_level;
    814 
    815     default:
    816     {
    817       if (offset < (0x1F801D80 - SPU_BASE))
    818         return ReadVoiceRegister(offset);
    819 
    820       if (offset >= (0x1F801DC0 - SPU_BASE) && offset < (0x1F801E00 - SPU_BASE))
    821         return s_state.reverb_registers.rev[(offset - (0x1F801DC0 - SPU_BASE)) / 2];
    822 
    823       if (offset >= (0x1F801E00 - SPU_BASE) && offset < (0x1F801E60 - SPU_BASE))
    824       {
    825         const u32 voice_index = (offset - (0x1F801E00 - SPU_BASE)) / 4;
    826         GeneratePendingSamples();
    827         if (offset & 0x02)
    828           return s_state.voices[voice_index].left_volume.current_level;
    829         else
    830           return s_state.voices[voice_index].right_volume.current_level;
    831       }
    832 
    833       DEV_LOG("Unknown SPU register read: offset 0x{:X} (address 0x{:08X})", offset, offset | SPU_BASE);
    834       return UINT16_C(0xFFFF);
    835     }
    836   }
    837 }
    838 
    839 void SPU::WriteRegister(u32 offset, u16 value)
    840 {
    841   switch (offset)
    842   {
    843     case 0x1F801D80 - SPU_BASE:
    844     {
    845       DEBUG_LOG("SPU main volume left <- 0x{:04X}", value);
    846       GeneratePendingSamples();
    847       s_state.main_volume_left_reg.bits = value;
    848       s_state.main_volume_left.Reset(s_state.main_volume_left_reg);
    849       return;
    850     }
    851 
    852     case 0x1F801D82 - SPU_BASE:
    853     {
    854       DEBUG_LOG("SPU main volume right <- 0x{:04X}", value);
    855       GeneratePendingSamples();
    856       s_state.main_volume_right_reg.bits = value;
    857       s_state.main_volume_right.Reset(s_state.main_volume_right_reg);
    858       return;
    859     }
    860 
    861     case 0x1F801D84 - SPU_BASE:
    862     {
    863       DEBUG_LOG("SPU reverb output volume left <- 0x{:04X}", value);
    864       GeneratePendingSamples();
    865       s_state.reverb_registers.vLOUT = value;
    866       return;
    867     }
    868 
    869     case 0x1F801D86 - SPU_BASE:
    870     {
    871       DEBUG_LOG("SPU reverb output volume right <- 0x{:04X}", value);
    872       GeneratePendingSamples();
    873       s_state.reverb_registers.vROUT = value;
    874       return;
    875     }
    876 
    877     case 0x1F801D88 - SPU_BASE:
    878     {
    879       DEBUG_LOG("SPU key on low <- 0x{:04X}", value);
    880       GeneratePendingSamples();
    881       s_state.key_on_register = (s_state.key_on_register & 0xFFFF0000) | ZeroExtend32(value);
    882     }
    883     break;
    884 
    885     case 0x1F801D8A - SPU_BASE:
    886     {
    887       DEBUG_LOG("SPU key on high <- 0x{:04X}", value);
    888       GeneratePendingSamples();
    889       s_state.key_on_register = (s_state.key_on_register & 0x0000FFFF) | (ZeroExtend32(value) << 16);
    890     }
    891     break;
    892 
    893     case 0x1F801D8C - SPU_BASE:
    894     {
    895       DEBUG_LOG("SPU key off low <- 0x{:04X}", value);
    896       GeneratePendingSamples();
    897       s_state.key_off_register = (s_state.key_off_register & 0xFFFF0000) | ZeroExtend32(value);
    898     }
    899     break;
    900 
    901     case 0x1F801D8E - SPU_BASE:
    902     {
    903       DEBUG_LOG("SPU key off high <- 0x{:04X}", value);
    904       GeneratePendingSamples();
    905       s_state.key_off_register = (s_state.key_off_register & 0x0000FFFF) | (ZeroExtend32(value) << 16);
    906     }
    907     break;
    908 
    909     case 0x1F801D90 - SPU_BASE:
    910     {
    911       GeneratePendingSamples();
    912       s_state.pitch_modulation_enable_register =
    913         (s_state.pitch_modulation_enable_register & 0xFFFF0000) | ZeroExtend32(value);
    914       DEBUG_LOG("SPU pitch modulation enable register <- 0x{:08X}", s_state.pitch_modulation_enable_register);
    915     }
    916     break;
    917 
    918     case 0x1F801D92 - SPU_BASE:
    919     {
    920       GeneratePendingSamples();
    921       s_state.pitch_modulation_enable_register =
    922         (s_state.pitch_modulation_enable_register & 0x0000FFFF) | (ZeroExtend32(value) << 16);
    923       DEBUG_LOG("SPU pitch modulation enable register <- 0x{:08X}", s_state.pitch_modulation_enable_register);
    924     }
    925     break;
    926 
    927     case 0x1F801D94 - SPU_BASE:
    928     {
    929       DEBUG_LOG("SPU noise mode register <- 0x{:04X}", value);
    930       GeneratePendingSamples();
    931       s_state.noise_mode_register = (s_state.noise_mode_register & 0xFFFF0000) | ZeroExtend32(value);
    932     }
    933     break;
    934 
    935     case 0x1F801D96 - SPU_BASE:
    936     {
    937       DEBUG_LOG("SPU noise mode register <- 0x{:04X}", value);
    938       GeneratePendingSamples();
    939       s_state.noise_mode_register = (s_state.noise_mode_register & 0x0000FFFF) | (ZeroExtend32(value) << 16);
    940     }
    941     break;
    942 
    943     case 0x1F801D98 - SPU_BASE:
    944     {
    945       DEBUG_LOG("SPU reverb on register <- 0x{:04X}", value);
    946       GeneratePendingSamples();
    947       s_state.reverb_on_register = (s_state.reverb_on_register & 0xFFFF0000) | ZeroExtend32(value);
    948     }
    949     break;
    950 
    951     case 0x1F801D9A - SPU_BASE:
    952     {
    953       DEBUG_LOG("SPU reverb on register <- 0x{:04X}", value);
    954       GeneratePendingSamples();
    955       s_state.reverb_on_register = (s_state.reverb_on_register & 0x0000FFFF) | (ZeroExtend32(value) << 16);
    956     }
    957     break;
    958 
    959     case 0x1F801DA2 - SPU_BASE:
    960     {
    961       DEBUG_LOG("SPU reverb base address < 0x{:04X}", value);
    962       GeneratePendingSamples();
    963       s_state.reverb_registers.mBASE = value;
    964       s_state.reverb_base_address = ZeroExtend32(value << 2) & 0x3FFFFu;
    965       s_state.reverb_current_address = s_state.reverb_base_address;
    966     }
    967     break;
    968 
    969     case 0x1F801DA4 - SPU_BASE:
    970     {
    971       DEBUG_LOG("SPU IRQ address register <- 0x{:04X}", value);
    972       GeneratePendingSamples();
    973       s_state.irq_address = value;
    974 
    975       if (IsRAMIRQTriggerable())
    976         CheckForLateRAMIRQs();
    977 
    978       return;
    979     }
    980 
    981     case 0x1F801DA6 - SPU_BASE:
    982     {
    983       DEBUG_LOG("SPU transfer address register <- 0x{:04X}", value);
    984       s_state.transfer_event.InvokeEarly();
    985       s_state.transfer_address_reg = value;
    986       s_state.transfer_address = ZeroExtend32(value) * 8;
    987       if (IsRAMIRQTriggerable() && CheckRAMIRQ(s_state.transfer_address))
    988       {
    989         DEBUG_LOG("Trigger IRQ @ {:08X} {:04X} from transfer address reg set", s_state.transfer_address,
    990                   s_state.transfer_address / 8);
    991         TriggerRAMIRQ();
    992       }
    993       return;
    994     }
    995 
    996     case 0x1F801DA8 - SPU_BASE:
    997     {
    998       TRACE_LOG("SPU transfer data register <- 0x{:04X} (RAM offset 0x{:08X})", ZeroExtend32(value),
    999                 s_state.transfer_address);
   1000 
   1001       ManualTransferWrite(value);
   1002       return;
   1003     }
   1004 
   1005     case 0x1F801DAA - SPU_BASE:
   1006     {
   1007       DEBUG_LOG("SPU control register <- 0x{:04X}", value);
   1008       GeneratePendingSamples();
   1009 
   1010       const SPUCNTRegister new_value{value};
   1011       if (new_value.ram_transfer_mode != s_state.SPUCNT.ram_transfer_mode &&
   1012           new_value.ram_transfer_mode == RAMTransferMode::Stopped)
   1013       {
   1014         // clear the fifo here?
   1015         if (!s_state.transfer_fifo.IsEmpty())
   1016         {
   1017           if (s_state.SPUCNT.ram_transfer_mode == RAMTransferMode::DMAWrite)
   1018           {
   1019             // I would guess on the console it would gradually write the FIFO out. Hopefully nothing relies on this
   1020             // level of timing granularity if we force it all out here.
   1021             WARNING_LOG("Draining write SPU transfer FIFO with {} bytes left", s_state.transfer_fifo.GetSize());
   1022             TickCount ticks = std::numeric_limits<TickCount>::max();
   1023             ExecuteFIFOWriteToRAM(ticks);
   1024             DebugAssert(s_state.transfer_fifo.IsEmpty());
   1025           }
   1026           else
   1027           {
   1028             DEBUG_LOG("Clearing read SPU transfer FIFO with {} bytes left", s_state.transfer_fifo.GetSize());
   1029             s_state.transfer_fifo.Clear();
   1030           }
   1031         }
   1032       }
   1033 
   1034       if (!new_value.enable && s_state.SPUCNT.enable)
   1035       {
   1036         // Mute all voices.
   1037         // Interestingly, hardware tests found this seems to happen immediately, not on the next 44100hz cycle.
   1038         for (u32 i = 0; i < NUM_VOICES; i++)
   1039           s_state.voices[i].ForceOff();
   1040       }
   1041 
   1042       s_state.SPUCNT.bits = new_value.bits;
   1043       s_state.SPUSTAT.mode = s_state.SPUCNT.mode.GetValue();
   1044 
   1045       if (!s_state.SPUCNT.irq9_enable)
   1046       {
   1047         s_state.SPUSTAT.irq9_flag = false;
   1048         InterruptController::SetLineState(InterruptController::IRQ::SPU, false);
   1049       }
   1050       else if (IsRAMIRQTriggerable())
   1051       {
   1052         CheckForLateRAMIRQs();
   1053       }
   1054 
   1055       UpdateEventInterval();
   1056       UpdateDMARequest();
   1057       UpdateTransferEvent();
   1058       return;
   1059     }
   1060 
   1061     case 0x1F801DAC - SPU_BASE:
   1062     {
   1063       DEBUG_LOG("SPU transfer control register <- 0x{:04X}", value);
   1064       s_state.transfer_control.bits = value;
   1065       return;
   1066     }
   1067 
   1068     case 0x1F801DB0 - SPU_BASE:
   1069     {
   1070       DEBUG_LOG("SPU left cd audio register <- 0x{:04X}", value);
   1071       GeneratePendingSamples();
   1072       s_state.cd_audio_volume_left = value;
   1073     }
   1074     break;
   1075 
   1076     case 0x1F801DB2 - SPU_BASE:
   1077     {
   1078       DEBUG_LOG("SPU right cd audio register <- 0x{:04X}", value);
   1079       GeneratePendingSamples();
   1080       s_state.cd_audio_volume_right = value;
   1081     }
   1082     break;
   1083 
   1084     case 0x1F801DB4 - SPU_BASE:
   1085     {
   1086       // External volumes aren't used, so don't bother syncing.
   1087       DEBUG_LOG("SPU left external volume register <- 0x{:04X}", value);
   1088       s_state.external_volume_left = value;
   1089     }
   1090     break;
   1091 
   1092     case 0x1F801DB6 - SPU_BASE:
   1093     {
   1094       // External volumes aren't used, so don't bother syncing.
   1095       DEBUG_LOG("SPU right external volume register <- 0x{:04X}", value);
   1096       s_state.external_volume_right = value;
   1097     }
   1098     break;
   1099 
   1100       // read-only registers
   1101     case 0x1F801DAE - SPU_BASE:
   1102     {
   1103       return;
   1104     }
   1105 
   1106     default:
   1107     {
   1108       if (offset < (0x1F801D80 - SPU_BASE))
   1109       {
   1110         WriteVoiceRegister(offset, value);
   1111         return;
   1112       }
   1113 
   1114       if (offset >= (0x1F801DC0 - SPU_BASE) && offset < (0x1F801E00 - SPU_BASE))
   1115       {
   1116         const u32 reg = (offset - (0x1F801DC0 - SPU_BASE)) / 2;
   1117         DEBUG_LOG("SPU reverb register {} <- 0x{:04X}", reg, value);
   1118         GeneratePendingSamples();
   1119         s_state.reverb_registers.rev[reg] = value;
   1120         return;
   1121       }
   1122 
   1123       DEV_LOG("Unknown SPU register write: offset 0x{:X} (address 0x{:08X}) value 0x{:04X}", offset, offset | SPU_BASE,
   1124               value);
   1125       return;
   1126     }
   1127   }
   1128 }
   1129 
   1130 u16 SPU::ReadVoiceRegister(u32 offset)
   1131 {
   1132   const u32 reg_index = (offset % 0x10) / 2; //(offset & 0x0F) / 2;
   1133   const u32 voice_index = (offset / 0x10);   //((offset >> 4) & 0x1F);
   1134   Assert(voice_index < 24);
   1135 
   1136   // ADSR volume needs to be updated when reading. A voice might be off as well, but key on is pending.
   1137   const Voice& voice = s_state.voices[voice_index];
   1138   if (reg_index >= 6 && (voice.IsOn() || s_state.key_on_register & (1u << voice_index)))
   1139     GeneratePendingSamples();
   1140 
   1141   TRACE_LOG("Read voice {} register {} -> 0x{:02X}", voice_index, reg_index, voice.regs.index[reg_index]);
   1142   return voice.regs.index[reg_index];
   1143 }
   1144 
   1145 void SPU::WriteVoiceRegister(u32 offset, u16 value)
   1146 {
   1147   // per-voice registers
   1148   const u32 reg_index = (offset % 0x10);
   1149   const u32 voice_index = (offset / 0x10);
   1150   DebugAssert(voice_index < 24);
   1151 
   1152   Voice& voice = s_state.voices[voice_index];
   1153   if (voice.IsOn() || s_state.key_on_register & (1u << voice_index))
   1154     GeneratePendingSamples();
   1155 
   1156   switch (reg_index)
   1157   {
   1158     case 0x00: // volume left
   1159     {
   1160       DEBUG_LOG("SPU voice {} volume left <- 0x{:04X}", voice_index, value);
   1161       voice.regs.volume_left.bits = value;
   1162       voice.left_volume.Reset(voice.regs.volume_left);
   1163     }
   1164     break;
   1165 
   1166     case 0x02: // volume right
   1167     {
   1168       DEBUG_LOG("SPU voice {} volume right <- 0x{:04X}", voice_index, value);
   1169       voice.regs.volume_right.bits = value;
   1170       voice.right_volume.Reset(voice.regs.volume_right);
   1171     }
   1172     break;
   1173 
   1174     case 0x04: // sample rate
   1175     {
   1176       DEBUG_LOG("SPU voice {} ADPCM sample rate <- 0x{:04X}", voice_index, value);
   1177       voice.regs.adpcm_sample_rate = value;
   1178     }
   1179     break;
   1180 
   1181     case 0x06: // start address
   1182     {
   1183       DEBUG_LOG("SPU voice {} ADPCM start address <- 0x{:04X}", voice_index, value);
   1184       voice.regs.adpcm_start_address = value;
   1185     }
   1186     break;
   1187 
   1188     case 0x08: // adsr low
   1189     {
   1190       DEBUG_LOG("SPU voice {} ADSR low <- 0x{:04X} (was 0x{:04X})", voice_index, value, voice.regs.adsr.bits_low);
   1191       voice.regs.adsr.bits_low = value;
   1192       if (voice.IsOn())
   1193         voice.UpdateADSREnvelope();
   1194     }
   1195     break;
   1196 
   1197     case 0x0A: // adsr high
   1198     {
   1199       DEBUG_LOG("SPU voice {} ADSR high <- 0x{:04X} (was 0x{:04X})", voice_index, value, voice.regs.adsr.bits_low);
   1200       voice.regs.adsr.bits_high = value;
   1201       if (voice.IsOn())
   1202         voice.UpdateADSREnvelope();
   1203     }
   1204     break;
   1205 
   1206     case 0x0C: // adsr volume
   1207     {
   1208       DEBUG_LOG("SPU voice {} ADSR volume <- 0x{:04X} (was 0x{:04X})", voice_index, value, voice.regs.adsr_volume);
   1209       voice.regs.adsr_volume = value;
   1210     }
   1211     break;
   1212 
   1213     case 0x0E: // repeat address
   1214     {
   1215       // There is a short window of time here between the voice being keyed on and the first block finishing decoding
   1216       // where setting the repeat address will *NOT* ignore the block/loop start flag. Games sensitive to this are:
   1217       //  - The Misadventures of Tron Bonne
   1218       //  - Re-Loaded - The Hardcore Sequel
   1219       //  - Valkyrie Profile
   1220 
   1221       const bool ignore_loop_address = voice.IsOn() && !voice.is_first_block;
   1222       DEBUG_LOG("SPU voice {} ADPCM repeat address <- 0x{:04X}", voice_index, value);
   1223       voice.regs.adpcm_repeat_address = value;
   1224       voice.ignore_loop_address |= ignore_loop_address;
   1225 
   1226       if (!ignore_loop_address)
   1227       {
   1228         DEV_LOG("Not ignoring loop address, the ADPCM repeat address of 0x{:04X} for voice {} will be overwritten",
   1229                 value, voice_index);
   1230       }
   1231     }
   1232     break;
   1233 
   1234     default:
   1235     {
   1236       ERROR_LOG("Unknown SPU voice {} register write: offset 0x%X (address 0x{:08X}) value 0x{:04X}", offset,
   1237                 voice_index, offset | SPU_BASE, ZeroExtend32(value));
   1238     }
   1239     break;
   1240   }
   1241 }
   1242 
   1243 bool SPU::IsVoiceReverbEnabled(u32 i)
   1244 {
   1245   return ConvertToBoolUnchecked((s_state.reverb_on_register >> i) & u32(1));
   1246 }
   1247 
   1248 bool SPU::IsVoiceNoiseEnabled(u32 i)
   1249 {
   1250   return ConvertToBoolUnchecked((s_state.noise_mode_register >> i) & u32(1));
   1251 }
   1252 
   1253 bool SPU::IsPitchModulationEnabled(u32 i)
   1254 {
   1255   return ((i > 0) && ConvertToBoolUnchecked((s_state.pitch_modulation_enable_register >> i) & u32(1)));
   1256 }
   1257 
   1258 s16 SPU::GetVoiceNoiseLevel()
   1259 {
   1260   return static_cast<s16>(static_cast<u16>(s_state.noise_level));
   1261 }
   1262 
   1263 bool SPU::IsRAMIRQTriggerable()
   1264 {
   1265   return s_state.SPUCNT.irq9_enable && !s_state.SPUSTAT.irq9_flag;
   1266 }
   1267 
   1268 bool SPU::CheckRAMIRQ(u32 address)
   1269 {
   1270   return ((ZeroExtend32(s_state.irq_address) * 8) == address);
   1271 }
   1272 
   1273 void SPU::TriggerRAMIRQ()
   1274 {
   1275   DebugAssert(IsRAMIRQTriggerable());
   1276   s_state.SPUSTAT.irq9_flag = true;
   1277   InterruptController::SetLineState(InterruptController::IRQ::SPU, true);
   1278 }
   1279 
   1280 void SPU::CheckForLateRAMIRQs()
   1281 {
   1282   if (CheckRAMIRQ(s_state.transfer_address))
   1283   {
   1284     DEBUG_LOG("Trigger IRQ @ {:08X} {:04X} from late transfer", s_state.transfer_address, s_state.transfer_address / 8);
   1285     TriggerRAMIRQ();
   1286     return;
   1287   }
   1288 
   1289   for (u32 i = 0; i < NUM_VOICES; i++)
   1290   {
   1291     // we skip voices which haven't started this block yet - because they'll check
   1292     // the next time they're sampled, and the delay might be important.
   1293     const Voice& v = s_state.voices[i];
   1294     if (!v.has_samples)
   1295       continue;
   1296 
   1297     const u32 address = v.current_address * 8;
   1298     if (CheckRAMIRQ(address) || CheckRAMIRQ((address + 8) & RAM_MASK))
   1299     {
   1300       DEBUG_LOG("Trigger IRQ @ {:08X} ({:04X}) from late", address, address / 8);
   1301       TriggerRAMIRQ();
   1302       return;
   1303     }
   1304   }
   1305 }
   1306 
   1307 void SPU::WriteToCaptureBuffer(u32 index, s16 value)
   1308 {
   1309   const u32 ram_address = (index * CAPTURE_BUFFER_SIZE_PER_CHANNEL) | ZeroExtend16(s_state.capture_buffer_position);
   1310   // Log_DebugFmt("write to capture buffer {} (0x{:08X}) <- 0x{:04X}", index, ram_address, u16(value));
   1311   std::memcpy(&s_ram[ram_address], &value, sizeof(value));
   1312   if (IsRAMIRQTriggerable() && CheckRAMIRQ(ram_address))
   1313   {
   1314     DEBUG_LOG("Trigger IRQ @ {:08X} ({:04X}) from capture buffer", ram_address, ram_address / 8);
   1315     TriggerRAMIRQ();
   1316   }
   1317 }
   1318 
   1319 void SPU::IncrementCaptureBufferPosition()
   1320 {
   1321   s_state.capture_buffer_position += sizeof(s16);
   1322   s_state.capture_buffer_position %= CAPTURE_BUFFER_SIZE_PER_CHANNEL;
   1323   s_state.SPUSTAT.second_half_capture_buffer = s_state.capture_buffer_position >= (CAPTURE_BUFFER_SIZE_PER_CHANNEL / 2);
   1324 }
   1325 
   1326 ALWAYS_INLINE_RELEASE void SPU::ExecuteFIFOReadFromRAM(TickCount& ticks)
   1327 {
   1328   while (ticks > 0 && !s_state.transfer_fifo.IsFull())
   1329   {
   1330     u16 value;
   1331     std::memcpy(&value, &s_ram[s_state.transfer_address], sizeof(u16));
   1332     s_state.transfer_address = (s_state.transfer_address + sizeof(u16)) & RAM_MASK;
   1333     s_state.transfer_fifo.Push(value);
   1334     ticks -= TRANSFER_TICKS_PER_HALFWORD;
   1335 
   1336     if (IsRAMIRQTriggerable() && CheckRAMIRQ(s_state.transfer_address))
   1337     {
   1338       DEBUG_LOG("Trigger IRQ @ {:08X} ({:04X}) from transfer read", s_state.transfer_address,
   1339                 s_state.transfer_address / 8);
   1340       TriggerRAMIRQ();
   1341     }
   1342   }
   1343 }
   1344 
   1345 ALWAYS_INLINE_RELEASE void SPU::ExecuteFIFOWriteToRAM(TickCount& ticks)
   1346 {
   1347   while (ticks > 0 && !s_state.transfer_fifo.IsEmpty())
   1348   {
   1349     u16 value = s_state.transfer_fifo.Pop();
   1350     std::memcpy(&s_ram[s_state.transfer_address], &value, sizeof(u16));
   1351     s_state.transfer_address = (s_state.transfer_address + sizeof(u16)) & RAM_MASK;
   1352     ticks -= TRANSFER_TICKS_PER_HALFWORD;
   1353 
   1354     if (IsRAMIRQTriggerable() && CheckRAMIRQ(s_state.transfer_address))
   1355     {
   1356       DEBUG_LOG("Trigger IRQ @ {:08X} ({:04X}) from transfer write", s_state.transfer_address,
   1357                 s_state.transfer_address / 8);
   1358       TriggerRAMIRQ();
   1359     }
   1360   }
   1361 }
   1362 
   1363 void SPU::ExecuteTransfer(void* param, TickCount ticks, TickCount ticks_late)
   1364 {
   1365   const RAMTransferMode mode = s_state.SPUCNT.ram_transfer_mode;
   1366   DebugAssert(mode != RAMTransferMode::Stopped);
   1367   InternalGeneratePendingSamples();
   1368 
   1369   if (mode == RAMTransferMode::DMARead)
   1370   {
   1371     while (ticks > 0 && !s_state.transfer_fifo.IsFull())
   1372     {
   1373       ExecuteFIFOReadFromRAM(ticks);
   1374 
   1375       // this can result in the FIFO being emptied, hence double the while loop
   1376       UpdateDMARequest();
   1377     }
   1378 
   1379     // we're done if we have no more data to read
   1380     if (s_state.transfer_fifo.IsFull())
   1381     {
   1382       s_state.SPUSTAT.transfer_busy = false;
   1383       s_state.transfer_event.Deactivate();
   1384       return;
   1385     }
   1386 
   1387     s_state.SPUSTAT.transfer_busy = true;
   1388     const TickCount ticks_until_complete =
   1389       TickCount(s_state.transfer_fifo.GetSpace() * u32(TRANSFER_TICKS_PER_HALFWORD)) + ((ticks < 0) ? -ticks : 0);
   1390     s_state.transfer_event.Schedule(ticks_until_complete);
   1391   }
   1392   else
   1393   {
   1394     // write the fifo to ram, request dma again when empty
   1395     while (ticks > 0 && !s_state.transfer_fifo.IsEmpty())
   1396     {
   1397       ExecuteFIFOWriteToRAM(ticks);
   1398 
   1399       // similar deal here, the FIFO can be written out in a long slice
   1400       UpdateDMARequest();
   1401     }
   1402 
   1403     // we're done if we have no more data to write
   1404     if (s_state.transfer_fifo.IsEmpty())
   1405     {
   1406       s_state.SPUSTAT.transfer_busy = false;
   1407       s_state.transfer_event.Deactivate();
   1408       return;
   1409     }
   1410 
   1411     s_state.SPUSTAT.transfer_busy = true;
   1412     const TickCount ticks_until_complete =
   1413       TickCount(s_state.transfer_fifo.GetSize() * u32(TRANSFER_TICKS_PER_HALFWORD)) + ((ticks < 0) ? -ticks : 0);
   1414     s_state.transfer_event.Schedule(ticks_until_complete);
   1415   }
   1416 }
   1417 
   1418 void SPU::ManualTransferWrite(u16 value)
   1419 {
   1420   if (!s_state.transfer_fifo.IsEmpty() && s_state.SPUCNT.ram_transfer_mode != RAMTransferMode::DMARead)
   1421   {
   1422     WARNING_LOG("FIFO not empty on manual SPU write, draining to hopefully avoid corruption. Game is silly.");
   1423     if (s_state.SPUCNT.ram_transfer_mode != RAMTransferMode::Stopped)
   1424       ExecuteTransfer(nullptr, std::numeric_limits<s32>::max(), 0);
   1425   }
   1426 
   1427   std::memcpy(&s_ram[s_state.transfer_address], &value, sizeof(u16));
   1428   s_state.transfer_address = (s_state.transfer_address + sizeof(u16)) & RAM_MASK;
   1429 
   1430   if (IsRAMIRQTriggerable() && CheckRAMIRQ(s_state.transfer_address))
   1431   {
   1432     DEBUG_LOG("Trigger IRQ @ {:08X} ({:04X}) from manual write", s_state.transfer_address,
   1433               s_state.transfer_address / 8);
   1434     TriggerRAMIRQ();
   1435   }
   1436 }
   1437 
   1438 void SPU::UpdateTransferEvent()
   1439 {
   1440   const RAMTransferMode mode = s_state.SPUCNT.ram_transfer_mode;
   1441   if (mode == RAMTransferMode::Stopped)
   1442   {
   1443     s_state.transfer_event.Deactivate();
   1444   }
   1445   else if (mode == RAMTransferMode::DMARead)
   1446   {
   1447     // transfer event fills the fifo
   1448     if (s_state.transfer_fifo.IsFull())
   1449       s_state.transfer_event.Deactivate();
   1450     else if (!s_state.transfer_event.IsActive())
   1451       s_state.transfer_event.Schedule(TickCount(s_state.transfer_fifo.GetSpace() * u32(TRANSFER_TICKS_PER_HALFWORD)));
   1452   }
   1453   else
   1454   {
   1455     // transfer event copies from fifo to ram
   1456     if (s_state.transfer_fifo.IsEmpty())
   1457       s_state.transfer_event.Deactivate();
   1458     else if (!s_state.transfer_event.IsActive())
   1459       s_state.transfer_event.Schedule(TickCount(s_state.transfer_fifo.GetSize() * u32(TRANSFER_TICKS_PER_HALFWORD)));
   1460   }
   1461 
   1462   s_state.SPUSTAT.transfer_busy = s_state.transfer_event.IsActive();
   1463 }
   1464 
   1465 void SPU::UpdateDMARequest()
   1466 {
   1467   switch (s_state.SPUCNT.ram_transfer_mode)
   1468   {
   1469     case RAMTransferMode::DMARead:
   1470       s_state.SPUSTAT.dma_read_request = s_state.transfer_fifo.IsFull();
   1471       s_state.SPUSTAT.dma_write_request = false;
   1472       s_state.SPUSTAT.dma_request = s_state.SPUSTAT.dma_read_request;
   1473       break;
   1474 
   1475     case RAMTransferMode::DMAWrite:
   1476       s_state.SPUSTAT.dma_read_request = false;
   1477       s_state.SPUSTAT.dma_write_request = s_state.transfer_fifo.IsEmpty();
   1478       s_state.SPUSTAT.dma_request = s_state.SPUSTAT.dma_write_request;
   1479       break;
   1480 
   1481     case RAMTransferMode::Stopped:
   1482     case RAMTransferMode::ManualWrite:
   1483     default:
   1484       s_state.SPUSTAT.dma_read_request = false;
   1485       s_state.SPUSTAT.dma_write_request = false;
   1486       s_state.SPUSTAT.dma_request = false;
   1487       break;
   1488   }
   1489 
   1490   // This might call us back directly.
   1491   DMA::SetRequest(DMA::Channel::SPU, s_state.SPUSTAT.dma_request);
   1492 }
   1493 
   1494 void SPU::DMARead(u32* words, u32 word_count)
   1495 {
   1496   /*
   1497     From @JaCzekanski - behavior when block size is larger than the FIFO size
   1498     for blocks <= 0x16 - all data is transferred correctly
   1499     using block size 0x20 transfer behaves strange:
   1500     % Writing 524288 bytes to SPU RAM to 0x00000000 using DMA... ok
   1501     % Reading 256 bytes from SPU RAM from 0x00001000 using DMA... ok
   1502     % 0x00001000: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
   1503     % 0x00001010: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
   1504     % 0x00001020: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f  !"#$%&'()*+,-./
   1505     % 0x00001030: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?
   1506     % 0x00001040: 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f >?>?>?>?>?>?>?>?
   1507     % 0x00001050: 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f >?>?>?>?>?>?>?>?
   1508     % 0x00001060: 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f >?>?>?>?>?>?>?>?
   1509     % 0x00001070: 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f 3e 3f >?>?>?>?>?>?>?>?
   1510     % 0x00001080: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO
   1511     % 0x00001090: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f PQRSTUVWXYZ[\]^_
   1512     % 0x000010a0: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f `abcdefghijklmno
   1513     % 0x000010b0: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f pqrstuvwxyz{|}~.
   1514     % 0x000010c0: 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f ~.~.~.~.~.~.~.~.
   1515     % 0x000010d0: 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f ~.~.~.~.~.~.~.~.
   1516     % 0x000010e0: 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f ~.~.~.~.~.~.~.~.
   1517     % 0x000010f0: 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f 7e 7f ~.~.~.~.~.~.~.~.
   1518     Using Block size = 0x10 (correct data)
   1519     % Reading 256 bytes from SPU RAM from 0x00001000 using DMA... ok
   1520     % 0x00001000: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
   1521     % 0x00001010: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
   1522     % 0x00001020: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f  !"#$%&'()*+,-./
   1523     % 0x00001030: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 0123456789:;<=>?
   1524     % 0x00001040: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f @ABCDEFGHIJKLMNO
   1525     % 0x00001050: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f PQRSTUVWXYZ[\]^_
   1526     % 0x00001060: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f `abcdefghijklmno
   1527     % 0x00001070: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f pqrstuvwxyz{|}~.
   1528     % 0x00001080: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f ................
   1529     % 0x00001090: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ................
   1530     % 0x000010a0: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af ................
   1531     % 0x000010b0: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf ................
   1532     % 0x000010c0: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf ................
   1533     % 0x000010d0: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df ................
   1534     % 0x000010e0: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef ................
   1535     % 0x000010f0: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff ................
   1536    */
   1537 
   1538   u16* halfwords = reinterpret_cast<u16*>(words);
   1539   u32 halfword_count = word_count * 2;
   1540 
   1541   const u32 size = s_state.transfer_fifo.GetSize();
   1542   if (word_count > size)
   1543   {
   1544     u16 fill_value = 0;
   1545     if (size > 0)
   1546     {
   1547       s_state.transfer_fifo.PopRange(halfwords, size);
   1548       fill_value = halfwords[size - 1];
   1549     }
   1550 
   1551     WARNING_LOG("Transfer FIFO underflow, filling with 0x{:04X}", fill_value);
   1552     std::fill_n(&halfwords[size], halfword_count - size, fill_value);
   1553   }
   1554   else
   1555   {
   1556     s_state.transfer_fifo.PopRange(halfwords, halfword_count);
   1557   }
   1558 
   1559   UpdateDMARequest();
   1560   UpdateTransferEvent();
   1561 }
   1562 
   1563 void SPU::DMAWrite(const u32* words, u32 word_count)
   1564 {
   1565   const u16* halfwords = reinterpret_cast<const u16*>(words);
   1566   u32 halfword_count = word_count * 2;
   1567 
   1568   const u32 words_to_transfer = std::min(s_state.transfer_fifo.GetSpace(), halfword_count);
   1569   s_state.transfer_fifo.PushRange(halfwords, words_to_transfer);
   1570 
   1571   if (words_to_transfer != halfword_count) [[unlikely]]
   1572     WARNING_LOG("Transfer FIFO overflow, dropping {} halfwords", halfword_count - words_to_transfer);
   1573 
   1574   UpdateDMARequest();
   1575   UpdateTransferEvent();
   1576 }
   1577 
   1578 void SPU::GeneratePendingSamples()
   1579 {
   1580   if (s_state.transfer_event.IsActive())
   1581     s_state.transfer_event.InvokeEarly();
   1582 
   1583   InternalGeneratePendingSamples();
   1584 }
   1585 
   1586 void SPU::InternalGeneratePendingSamples()
   1587 {
   1588   const TickCount ticks_pending = s_state.tick_event.GetTicksSinceLastExecution();
   1589   TickCount frames_to_execute;
   1590   if (g_settings.cpu_overclock_active)
   1591   {
   1592     frames_to_execute = static_cast<u32>((static_cast<u64>(ticks_pending) * g_settings.cpu_overclock_denominator) +
   1593                                          static_cast<u32>(s_state.ticks_carry)) /
   1594                         static_cast<u32>(s_state.cpu_tick_divider);
   1595   }
   1596   else
   1597   {
   1598     frames_to_execute =
   1599       (s_state.tick_event.GetTicksSinceLastExecution() + s_state.ticks_carry) / SYSCLK_TICKS_PER_SPU_TICK;
   1600   }
   1601 
   1602   const bool force_exec = (frames_to_execute > 0);
   1603   s_state.tick_event.InvokeEarly(force_exec);
   1604 }
   1605 
   1606 const std::array<u8, SPU::RAM_SIZE>& SPU::GetRAM()
   1607 {
   1608   return s_ram;
   1609 }
   1610 
   1611 std::array<u8, SPU::RAM_SIZE>& SPU::GetWritableRAM()
   1612 {
   1613   return s_ram;
   1614 }
   1615 
   1616 bool SPU::IsAudioOutputMuted()
   1617 {
   1618   return s_state.audio_output_muted;
   1619 }
   1620 
   1621 void SPU::SetAudioOutputMuted(bool muted)
   1622 {
   1623   s_state.audio_output_muted = muted;
   1624 }
   1625 
   1626 AudioStream* SPU::GetOutputStream()
   1627 {
   1628   return s_state.audio_stream.get();
   1629 }
   1630 
   1631 void SPU::Voice::KeyOn()
   1632 {
   1633   current_address = regs.adpcm_start_address & ~u16(1);
   1634   counter.bits = 0;
   1635   regs.adsr_volume = 0;
   1636   adpcm_last_samples.fill(0);
   1637 
   1638   // Samples from the previous block for interpolation should be zero. Fixes clicks in audio in Breath of Fire III.
   1639   std::fill_n(&current_block_samples[NUM_SAMPLES_PER_ADPCM_BLOCK], NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK,
   1640               static_cast<s16>(0));
   1641 
   1642   has_samples = false;
   1643   is_first_block = true;
   1644   ignore_loop_address = false;
   1645   adsr_phase = ADSRPhase::Attack;
   1646   UpdateADSREnvelope();
   1647 }
   1648 
   1649 void SPU::Voice::KeyOff()
   1650 {
   1651   if (adsr_phase == ADSRPhase::Off || adsr_phase == ADSRPhase::Release)
   1652     return;
   1653 
   1654   adsr_phase = ADSRPhase::Release;
   1655   UpdateADSREnvelope();
   1656 }
   1657 
   1658 void SPU::Voice::ForceOff()
   1659 {
   1660   if (adsr_phase == ADSRPhase::Off)
   1661     return;
   1662 
   1663   regs.adsr_volume = 0;
   1664   adsr_phase = ADSRPhase::Off;
   1665 }
   1666 
   1667 SPU::ADSRPhase SPU::GetNextADSRPhase(ADSRPhase phase)
   1668 {
   1669   switch (phase)
   1670   {
   1671     case ADSRPhase::Attack:
   1672       // attack -> decay
   1673       return ADSRPhase::Decay;
   1674 
   1675     case ADSRPhase::Decay:
   1676       // decay -> sustain
   1677       return ADSRPhase::Sustain;
   1678 
   1679     case ADSRPhase::Sustain:
   1680       // sustain stays in sustain until key off
   1681       return ADSRPhase::Sustain;
   1682 
   1683     default:
   1684     case ADSRPhase::Release:
   1685       // end of release disables the voice
   1686       return ADSRPhase::Off;
   1687   }
   1688 }
   1689 
   1690 void SPU::VolumeEnvelope::Reset(u8 rate_, u8 rate_mask_, bool decreasing_, bool exponential_, bool phase_invert_)
   1691 {
   1692   rate = rate_;
   1693   decreasing = decreasing_;
   1694   exponential = exponential_;
   1695 
   1696   // psx-spx says "The Phase bit seems to have no effect in Exponential Decrease mode."
   1697   // TODO: This needs to be tested on hardware.
   1698   phase_invert = phase_invert_ && !(decreasing_ && exponential_);
   1699 
   1700   counter = 0;
   1701   counter_increment = 0x8000;
   1702 
   1703   // negative level * negative step would give a positive number in decreasing+exponential mode, when we want it to be
   1704   // negative. Phase invert cause the step to be positive in decreasing mode, otherwise negative. Bitwise NOT, so that
   1705   // +7,+6,+5,+4 becomes -8,-7,-6,-5 as per psx-spx.
   1706   const s16 base_step = 7 - (rate & 3);
   1707   step = ((decreasing_ ^ phase_invert_) | (decreasing_ & exponential_)) ? ~base_step : base_step;
   1708   if (rate < 44)
   1709   {
   1710     // AdsrStep = StepValue SHL Max(0,11-ShiftValue)
   1711     step <<= (11 - (rate >> 2));
   1712   }
   1713   else if (rate >= 48)
   1714   {
   1715     // AdsrCycles = 1 SHL Max(0,ShiftValue-11)
   1716     counter_increment >>= ((rate >> 2) - 11);
   1717 
   1718     // Rate of 0x7F (or more specifically all bits set, for decay/release) is a special case that never ticks.
   1719     if ((rate_ & rate_mask_) != rate_mask_)
   1720       counter_increment = std::max<u16>(counter_increment, 1u);
   1721   }
   1722 }
   1723 
   1724 ALWAYS_INLINE_RELEASE bool SPU::VolumeEnvelope::Tick(s16& current_level)
   1725 {
   1726   // Recompute step in exponential/decrement mode.
   1727   u32 this_increment = counter_increment;
   1728   s32 this_step = step;
   1729   if (exponential)
   1730   {
   1731     if (decreasing)
   1732     {
   1733       this_step = (this_step * current_level) >> 15;
   1734     }
   1735     else
   1736     {
   1737       if (current_level >= 0x6000)
   1738       {
   1739         if (rate < 40)
   1740         {
   1741           this_step >>= 2;
   1742         }
   1743         else if (rate >= 44)
   1744         {
   1745           this_increment >>= 2;
   1746         }
   1747         else
   1748         {
   1749           this_step >>= 1;
   1750           this_increment >>= 1;
   1751         }
   1752       }
   1753     }
   1754   }
   1755 
   1756   counter += this_increment;
   1757 
   1758   // Very strange behavior. Rate of 0x76 behaves like 0x6A, seems it's dependent on the MSB=1.
   1759   if (!(counter & 0x8000))
   1760     return true;
   1761   counter = 0;
   1762 
   1763   // Phase invert acts very strange. If the volume is positive, it will decrease to zero, then increase back to maximum
   1764   // negative (inverted) volume. Except when decrementing, then it snaps straight to zero. Simply clamping to int16
   1765   // range will be fine for incrementing, because the volume never decreases past zero. If the volume _was_ negative,
   1766   // and is incrementing, hardware tests show that it only clamps to max, not 0.
   1767   s32 new_level = current_level + this_step;
   1768   if (!decreasing)
   1769   {
   1770     current_level = Truncate16(new_level = std::clamp(new_level, MIN_VOLUME, MAX_VOLUME));
   1771     return (new_level != ((this_step < 0) ? MIN_VOLUME : MAX_VOLUME));
   1772   }
   1773   else
   1774   {
   1775     if (phase_invert)
   1776       current_level = Truncate16(new_level = std::clamp(new_level, MIN_VOLUME, 0));
   1777     else
   1778       current_level = Truncate16(new_level = std::max(new_level, 0));
   1779     return (new_level == 0);
   1780   }
   1781 }
   1782 
   1783 void SPU::VolumeSweep::Reset(VolumeRegister reg)
   1784 {
   1785   if (!reg.sweep_mode)
   1786   {
   1787     current_level = reg.fixed_volume_shr1 * 2;
   1788     envelope_active = false;
   1789     return;
   1790   }
   1791 
   1792   envelope.Reset(reg.sweep_rate, 0x7F, reg.sweep_direction_decrease, reg.sweep_exponential, reg.sweep_phase_negative);
   1793   envelope_active = (envelope.counter_increment > 0);
   1794 }
   1795 
   1796 void SPU::VolumeSweep::Tick()
   1797 {
   1798   if (!envelope_active)
   1799     return;
   1800 
   1801   envelope_active = envelope.Tick(current_level);
   1802 }
   1803 
   1804 void SPU::Voice::UpdateADSREnvelope()
   1805 {
   1806   switch (adsr_phase)
   1807   {
   1808     case ADSRPhase::Off:
   1809       adsr_target = 0;
   1810       adsr_envelope.Reset(0, 0, false, false, false);
   1811       return;
   1812 
   1813     case ADSRPhase::Attack:
   1814       adsr_target = 32767; // 0 -> max
   1815       adsr_envelope.Reset(regs.adsr.attack_rate, 0x7F, false, regs.adsr.attack_exponential, false);
   1816       break;
   1817 
   1818     case ADSRPhase::Decay:
   1819       adsr_target = static_cast<s16>(std::min<s32>((u32(regs.adsr.sustain_level.GetValue()) + 1) * 0x800,
   1820                                                    VolumeEnvelope::MAX_VOLUME)); // max -> sustain level
   1821       adsr_envelope.Reset(regs.adsr.decay_rate_shr2 << 2, 0x1F << 2, true, true, false);
   1822       break;
   1823 
   1824     case ADSRPhase::Sustain:
   1825       adsr_target = 0;
   1826       adsr_envelope.Reset(regs.adsr.sustain_rate, 0x7F, regs.adsr.sustain_direction_decrease,
   1827                           regs.adsr.sustain_exponential, false);
   1828       break;
   1829 
   1830     case ADSRPhase::Release:
   1831       adsr_target = 0;
   1832       adsr_envelope.Reset(regs.adsr.release_rate_shr2 << 2, 0x1F << 2, true, regs.adsr.release_exponential, false);
   1833       break;
   1834 
   1835     default:
   1836       break;
   1837   }
   1838 }
   1839 
   1840 void SPU::Voice::TickADSR()
   1841 {
   1842   if (adsr_envelope.counter_increment > 0)
   1843     adsr_envelope.Tick(regs.adsr_volume);
   1844 
   1845   if (adsr_phase != ADSRPhase::Sustain)
   1846   {
   1847     const bool reached_target =
   1848       adsr_envelope.decreasing ? (regs.adsr_volume <= adsr_target) : (regs.adsr_volume >= adsr_target);
   1849     if (reached_target)
   1850     {
   1851       adsr_phase = GetNextADSRPhase(adsr_phase);
   1852       UpdateADSREnvelope();
   1853     }
   1854   }
   1855 }
   1856 
   1857 void SPU::Voice::DecodeBlock(const ADPCMBlock& block)
   1858 {
   1859   static constexpr std::array<s32, 5> filter_table_pos = {{0, 60, 115, 98, 122}};
   1860   static constexpr std::array<s32, 5> filter_table_neg = {{0, 0, -52, -55, -60}};
   1861 
   1862   // store samples needed for interpolation
   1863   current_block_samples[2] = current_block_samples[NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK + NUM_SAMPLES_PER_ADPCM_BLOCK - 1];
   1864   current_block_samples[1] = current_block_samples[NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK + NUM_SAMPLES_PER_ADPCM_BLOCK - 2];
   1865   current_block_samples[0] = current_block_samples[NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK + NUM_SAMPLES_PER_ADPCM_BLOCK - 3];
   1866 
   1867   // pre-lookup
   1868   const u8 shift = block.GetShift();
   1869   const u8 filter_index = block.GetFilter();
   1870   const s32 filter_pos = filter_table_pos[filter_index];
   1871   const s32 filter_neg = filter_table_neg[filter_index];
   1872   s16 last_samples[2] = {adpcm_last_samples[0], adpcm_last_samples[1]};
   1873 
   1874   // samples
   1875   for (u32 i = 0; i < NUM_SAMPLES_PER_ADPCM_BLOCK; i++)
   1876   {
   1877     // extend 4-bit to 16-bit, apply shift from header and mix in previous samples
   1878     s32 sample = s32(static_cast<s16>(ZeroExtend16(block.GetNibble(i)) << 12) >> shift);
   1879     sample += (last_samples[0] * filter_pos) >> 6;
   1880     sample += (last_samples[1] * filter_neg) >> 6;
   1881 
   1882     last_samples[1] = last_samples[0];
   1883     current_block_samples[NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK + i] = last_samples[0] = static_cast<s16>(Clamp16(sample));
   1884   }
   1885 
   1886   std::copy(last_samples, last_samples + countof(last_samples), adpcm_last_samples.begin());
   1887   current_block_flags.bits = block.flags.bits;
   1888 }
   1889 
   1890 s32 SPU::Voice::Interpolate() const
   1891 {
   1892   static constexpr std::array<s16, 0x200> gauss = {{
   1893     -0x001, -0x001, -0x001, -0x001, -0x001, -0x001, -0x001, -0x001, //
   1894     -0x001, -0x001, -0x001, -0x001, -0x001, -0x001, -0x001, -0x001, //
   1895     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, //
   1896     0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0003, 0x0003, //
   1897     0x0003, 0x0004, 0x0004, 0x0005, 0x0005, 0x0006, 0x0007, 0x0007, //
   1898     0x0008, 0x0009, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, //
   1899     0x000F, 0x0010, 0x0011, 0x0012, 0x0013, 0x0015, 0x0016, 0x0018, // entry
   1900     0x0019, 0x001B, 0x001C, 0x001E, 0x0020, 0x0021, 0x0023, 0x0025, // 000..07F
   1901     0x0027, 0x0029, 0x002C, 0x002E, 0x0030, 0x0033, 0x0035, 0x0038, //
   1902     0x003A, 0x003D, 0x0040, 0x0043, 0x0046, 0x0049, 0x004D, 0x0050, //
   1903     0x0054, 0x0057, 0x005B, 0x005F, 0x0063, 0x0067, 0x006B, 0x006F, //
   1904     0x0074, 0x0078, 0x007D, 0x0082, 0x0087, 0x008C, 0x0091, 0x0096, //
   1905     0x009C, 0x00A1, 0x00A7, 0x00AD, 0x00B3, 0x00BA, 0x00C0, 0x00C7, //
   1906     0x00CD, 0x00D4, 0x00DB, 0x00E3, 0x00EA, 0x00F2, 0x00FA, 0x0101, //
   1907     0x010A, 0x0112, 0x011B, 0x0123, 0x012C, 0x0135, 0x013F, 0x0148, //
   1908     0x0152, 0x015C, 0x0166, 0x0171, 0x017B, 0x0186, 0x0191, 0x019C, //
   1909     0x01A8, 0x01B4, 0x01C0, 0x01CC, 0x01D9, 0x01E5, 0x01F2, 0x0200, //
   1910     0x020D, 0x021B, 0x0229, 0x0237, 0x0246, 0x0255, 0x0264, 0x0273, //
   1911     0x0283, 0x0293, 0x02A3, 0x02B4, 0x02C4, 0x02D6, 0x02E7, 0x02F9, //
   1912     0x030B, 0x031D, 0x0330, 0x0343, 0x0356, 0x036A, 0x037E, 0x0392, //
   1913     0x03A7, 0x03BC, 0x03D1, 0x03E7, 0x03FC, 0x0413, 0x042A, 0x0441, //
   1914     0x0458, 0x0470, 0x0488, 0x04A0, 0x04B9, 0x04D2, 0x04EC, 0x0506, //
   1915     0x0520, 0x053B, 0x0556, 0x0572, 0x058E, 0x05AA, 0x05C7, 0x05E4, // entry
   1916     0x0601, 0x061F, 0x063E, 0x065C, 0x067C, 0x069B, 0x06BB, 0x06DC, // 080..0FF
   1917     0x06FD, 0x071E, 0x0740, 0x0762, 0x0784, 0x07A7, 0x07CB, 0x07EF, //
   1918     0x0813, 0x0838, 0x085D, 0x0883, 0x08A9, 0x08D0, 0x08F7, 0x091E, //
   1919     0x0946, 0x096F, 0x0998, 0x09C1, 0x09EB, 0x0A16, 0x0A40, 0x0A6C, //
   1920     0x0A98, 0x0AC4, 0x0AF1, 0x0B1E, 0x0B4C, 0x0B7A, 0x0BA9, 0x0BD8, //
   1921     0x0C07, 0x0C38, 0x0C68, 0x0C99, 0x0CCB, 0x0CFD, 0x0D30, 0x0D63, //
   1922     0x0D97, 0x0DCB, 0x0E00, 0x0E35, 0x0E6B, 0x0EA1, 0x0ED7, 0x0F0F, //
   1923     0x0F46, 0x0F7F, 0x0FB7, 0x0FF1, 0x102A, 0x1065, 0x109F, 0x10DB, //
   1924     0x1116, 0x1153, 0x118F, 0x11CD, 0x120B, 0x1249, 0x1288, 0x12C7, //
   1925     0x1307, 0x1347, 0x1388, 0x13C9, 0x140B, 0x144D, 0x1490, 0x14D4, //
   1926     0x1517, 0x155C, 0x15A0, 0x15E6, 0x162C, 0x1672, 0x16B9, 0x1700, //
   1927     0x1747, 0x1790, 0x17D8, 0x1821, 0x186B, 0x18B5, 0x1900, 0x194B, //
   1928     0x1996, 0x19E2, 0x1A2E, 0x1A7B, 0x1AC8, 0x1B16, 0x1B64, 0x1BB3, //
   1929     0x1C02, 0x1C51, 0x1CA1, 0x1CF1, 0x1D42, 0x1D93, 0x1DE5, 0x1E37, //
   1930     0x1E89, 0x1EDC, 0x1F2F, 0x1F82, 0x1FD6, 0x202A, 0x207F, 0x20D4, //
   1931     0x2129, 0x217F, 0x21D5, 0x222C, 0x2282, 0x22DA, 0x2331, 0x2389, // entry
   1932     0x23E1, 0x2439, 0x2492, 0x24EB, 0x2545, 0x259E, 0x25F8, 0x2653, // 100..17F
   1933     0x26AD, 0x2708, 0x2763, 0x27BE, 0x281A, 0x2876, 0x28D2, 0x292E, //
   1934     0x298B, 0x29E7, 0x2A44, 0x2AA1, 0x2AFF, 0x2B5C, 0x2BBA, 0x2C18, //
   1935     0x2C76, 0x2CD4, 0x2D33, 0x2D91, 0x2DF0, 0x2E4F, 0x2EAE, 0x2F0D, //
   1936     0x2F6C, 0x2FCC, 0x302B, 0x308B, 0x30EA, 0x314A, 0x31AA, 0x3209, //
   1937     0x3269, 0x32C9, 0x3329, 0x3389, 0x33E9, 0x3449, 0x34A9, 0x3509, //
   1938     0x3569, 0x35C9, 0x3629, 0x3689, 0x36E8, 0x3748, 0x37A8, 0x3807, //
   1939     0x3867, 0x38C6, 0x3926, 0x3985, 0x39E4, 0x3A43, 0x3AA2, 0x3B00, //
   1940     0x3B5F, 0x3BBD, 0x3C1B, 0x3C79, 0x3CD7, 0x3D35, 0x3D92, 0x3DEF, //
   1941     0x3E4C, 0x3EA9, 0x3F05, 0x3F62, 0x3FBD, 0x4019, 0x4074, 0x40D0, //
   1942     0x412A, 0x4185, 0x41DF, 0x4239, 0x4292, 0x42EB, 0x4344, 0x439C, //
   1943     0x43F4, 0x444C, 0x44A3, 0x44FA, 0x4550, 0x45A6, 0x45FC, 0x4651, //
   1944     0x46A6, 0x46FA, 0x474E, 0x47A1, 0x47F4, 0x4846, 0x4898, 0x48E9, //
   1945     0x493A, 0x498A, 0x49D9, 0x4A29, 0x4A77, 0x4AC5, 0x4B13, 0x4B5F, //
   1946     0x4BAC, 0x4BF7, 0x4C42, 0x4C8D, 0x4CD7, 0x4D20, 0x4D68, 0x4DB0, //
   1947     0x4DF7, 0x4E3E, 0x4E84, 0x4EC9, 0x4F0E, 0x4F52, 0x4F95, 0x4FD7, // entry
   1948     0x5019, 0x505A, 0x509A, 0x50DA, 0x5118, 0x5156, 0x5194, 0x51D0, // 180..1FF
   1949     0x520C, 0x5247, 0x5281, 0x52BA, 0x52F3, 0x532A, 0x5361, 0x5397, //
   1950     0x53CC, 0x5401, 0x5434, 0x5467, 0x5499, 0x54CA, 0x54FA, 0x5529, //
   1951     0x5558, 0x5585, 0x55B2, 0x55DE, 0x5609, 0x5632, 0x565B, 0x5684, //
   1952     0x56AB, 0x56D1, 0x56F6, 0x571B, 0x573E, 0x5761, 0x5782, 0x57A3, //
   1953     0x57C3, 0x57E2, 0x57FF, 0x581C, 0x5838, 0x5853, 0x586D, 0x5886, //
   1954     0x589E, 0x58B5, 0x58CB, 0x58E0, 0x58F4, 0x5907, 0x5919, 0x592A, //
   1955     0x593A, 0x5949, 0x5958, 0x5965, 0x5971, 0x597C, 0x5986, 0x598F, //
   1956     0x5997, 0x599E, 0x59A4, 0x59A9, 0x59AD, 0x59B0, 0x59B2, 0x59B3  //
   1957   }};
   1958 
   1959   const u8 i = counter.interpolation_index;
   1960   const u32 s = NUM_SAMPLES_FROM_LAST_ADPCM_BLOCK + ZeroExtend32(counter.sample_index.GetValue());
   1961 
   1962   s32 out = s32(gauss[0x0FF - i]) * s32(current_block_samples[s - 3]);
   1963   out += s32(gauss[0x1FF - i]) * s32(current_block_samples[s - 2]);
   1964   out += s32(gauss[0x100 + i]) * s32(current_block_samples[s - 1]);
   1965   out += s32(gauss[0x000 + i]) * s32(current_block_samples[s - 0]);
   1966   return out >> 15;
   1967 }
   1968 
   1969 void SPU::ReadADPCMBlock(u16 address, ADPCMBlock* block)
   1970 {
   1971   u32 ram_address = (ZeroExtend32(address) * 8) & RAM_MASK;
   1972   if (IsRAMIRQTriggerable() && (CheckRAMIRQ(ram_address) || CheckRAMIRQ((ram_address + 8) & RAM_MASK)))
   1973   {
   1974     DEBUG_LOG("Trigger IRQ @ {:08X} ({:04X}) from ADPCM reader", ram_address, ram_address / 8);
   1975     TriggerRAMIRQ();
   1976   }
   1977 
   1978   // fast path - no wrap-around
   1979   if ((ram_address + sizeof(ADPCMBlock)) <= RAM_SIZE)
   1980   {
   1981     std::memcpy(block, &s_ram[ram_address], sizeof(ADPCMBlock));
   1982     return;
   1983   }
   1984 
   1985   block->shift_filter.bits = s_ram[ram_address];
   1986   ram_address = (ram_address + 1) & RAM_MASK;
   1987   block->flags.bits = s_ram[ram_address];
   1988   ram_address = (ram_address + 1) & RAM_MASK;
   1989   for (u32 i = 0; i < 14; i++)
   1990   {
   1991     block->data[i] = s_ram[ram_address];
   1992     ram_address = (ram_address + 1) & RAM_MASK;
   1993   }
   1994 }
   1995 
   1996 ALWAYS_INLINE_RELEASE std::tuple<s32, s32> SPU::SampleVoice(u32 voice_index)
   1997 {
   1998   Voice& voice = s_state.voices[voice_index];
   1999   if (!voice.IsOn() && !s_state.SPUCNT.irq9_enable)
   2000   {
   2001     voice.last_volume = 0;
   2002 
   2003 #ifdef SPU_DUMP_ALL_VOICES
   2004     if (s_state.s_voice_dump_writers[voice_index])
   2005     {
   2006       const s16 dump_samples[2] = {0, 0};
   2007       s_state.s_voice_dump_writers[voice_index]->WriteFrames(dump_samples, 1);
   2008     }
   2009 #endif
   2010 
   2011     return {};
   2012   }
   2013 
   2014   if (!voice.has_samples)
   2015   {
   2016     ADPCMBlock block;
   2017     ReadADPCMBlock(voice.current_address, &block);
   2018     voice.DecodeBlock(block);
   2019     voice.has_samples = true;
   2020 
   2021     if (voice.current_block_flags.loop_start && !voice.ignore_loop_address)
   2022     {
   2023       TRACE_LOG("Voice {} loop start @ 0x{:08X}", voice_index, voice.current_address);
   2024       voice.regs.adpcm_repeat_address = voice.current_address;
   2025     }
   2026   }
   2027 
   2028   // skip interpolation when the volume is muted anyway
   2029   s32 volume;
   2030   if (voice.regs.adsr_volume != 0)
   2031   {
   2032     // interpolate/sample and apply ADSR volume
   2033     s32 sample;
   2034     if (IsVoiceNoiseEnabled(voice_index))
   2035       sample = GetVoiceNoiseLevel();
   2036     else
   2037       sample = voice.Interpolate();
   2038 
   2039     volume = ApplyVolume(sample, voice.regs.adsr_volume);
   2040   }
   2041   else
   2042   {
   2043     volume = 0;
   2044   }
   2045 
   2046   voice.last_volume = volume;
   2047 
   2048   if (voice.adsr_phase != ADSRPhase::Off)
   2049     voice.TickADSR();
   2050 
   2051   // Pitch modulation
   2052   u16 step = voice.regs.adpcm_sample_rate;
   2053   if (IsPitchModulationEnabled(voice_index))
   2054   {
   2055     const s32 factor = std::clamp<s32>(s_state.voices[voice_index - 1].last_volume, -0x8000, 0x7FFF) + 0x8000;
   2056     step = Truncate16(static_cast<u32>((SignExtend32(step) * factor) >> 15));
   2057   }
   2058   step = std::min<u16>(step, 0x3FFF);
   2059 
   2060   // Shouldn't ever overflow because if sample_index == 27, step == 0x4000 there won't be a carry out from the
   2061   // interpolation index. If there is a carry out, bit 12 will never be 1, so it'll never add more than 4 to
   2062   // sample_index, which should never be >27.
   2063   DebugAssert(voice.counter.sample_index < NUM_SAMPLES_PER_ADPCM_BLOCK);
   2064   voice.counter.bits += step;
   2065 
   2066   if (voice.counter.sample_index >= NUM_SAMPLES_PER_ADPCM_BLOCK)
   2067   {
   2068     // next block
   2069     voice.counter.sample_index -= NUM_SAMPLES_PER_ADPCM_BLOCK;
   2070     voice.has_samples = false;
   2071     voice.is_first_block = false;
   2072     voice.current_address += 2;
   2073 
   2074     // handle flags
   2075     if (voice.current_block_flags.loop_end)
   2076     {
   2077       s_state.endx_register |= (u32(1) << voice_index);
   2078       voice.current_address = voice.regs.adpcm_repeat_address & ~u16(1);
   2079 
   2080       if (!voice.current_block_flags.loop_repeat)
   2081       {
   2082         // End+Mute flags are ignored when noise is enabled. ADPCM data is still decoded.
   2083         if (!IsVoiceNoiseEnabled(voice_index))
   2084         {
   2085           TRACE_LOG("Voice {} loop end+mute @ 0x{:04X}", voice_index, voice.current_address);
   2086           voice.ForceOff();
   2087         }
   2088         else
   2089         {
   2090           TRACE_LOG("IGNORING voice {} loop end+mute @ 0x{:04X}", voice_index, voice.current_address);
   2091         }
   2092       }
   2093       else
   2094       {
   2095         TRACE_LOG("Voice {} loop end+repeat @ 0x{:04X}", voice_index, voice.current_address);
   2096       }
   2097     }
   2098   }
   2099 
   2100   // apply per-channel volume
   2101   const s32 left = ApplyVolume(volume, voice.left_volume.current_level);
   2102   const s32 right = ApplyVolume(volume, voice.right_volume.current_level);
   2103   voice.left_volume.Tick();
   2104   voice.right_volume.Tick();
   2105 
   2106 #ifdef SPU_DUMP_ALL_VOICES
   2107   if (s_state.s_voice_dump_writers[voice_index])
   2108   {
   2109     const s16 dump_samples[2] = {static_cast<s16>(Clamp16(left)), static_cast<s16>(Clamp16(right))};
   2110     s_state.s_voice_dump_writers[voice_index]->WriteFrames(dump_samples, 1);
   2111   }
   2112 #endif
   2113 
   2114   return std::make_tuple(left, right);
   2115 }
   2116 
   2117 void SPU::UpdateNoise()
   2118 {
   2119   // Dr Hell's noise waveform, implementation borrowed from pcsx-r.
   2120   static constexpr std::array<u8, 64> noise_wave_add = {
   2121     {1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0,
   2122      0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1}};
   2123   static constexpr std::array<u8, 5> noise_freq_add = {{0, 84, 140, 180, 210}};
   2124 
   2125   const u32 noise_clock = s_state.SPUCNT.noise_clock;
   2126   const u32 level = (0x8000u >> (noise_clock >> 2)) << 16;
   2127 
   2128   s_state.noise_count += 0x10000u + noise_freq_add[noise_clock & 3u];
   2129   if ((s_state.noise_count & 0xFFFFu) >= noise_freq_add[4])
   2130   {
   2131     s_state.noise_count += 0x10000;
   2132     s_state.noise_count -= noise_freq_add[noise_clock & 3u];
   2133   }
   2134 
   2135   if (s_state.noise_count < level)
   2136     return;
   2137 
   2138   s_state.noise_count %= level;
   2139   s_state.noise_level = (s_state.noise_level << 1) | noise_wave_add[(s_state.noise_level >> 10) & 63u];
   2140 }
   2141 
   2142 u32 SPU::ReverbMemoryAddress(u32 address)
   2143 {
   2144   // Ensures address does not leave the reverb work area.
   2145   static constexpr u32 MASK = (RAM_SIZE - 1) / 2;
   2146   u32 offset = s_state.reverb_current_address + (address & MASK);
   2147   offset += s_state.reverb_base_address & ((s32)(offset << 13) >> 31);
   2148 
   2149   // We address RAM in bytes. TODO: Change this to words.
   2150   return (offset & MASK) * 2u;
   2151 }
   2152 
   2153 s16 SPU::ReverbRead(u32 address, s32 offset)
   2154 {
   2155   // TODO: This should check interrupts.
   2156   const u32 real_address = ReverbMemoryAddress((address << 2) + offset);
   2157 
   2158   s16 data;
   2159   std::memcpy(&data, &s_ram[real_address], sizeof(data));
   2160   return data;
   2161 }
   2162 
   2163 void SPU::ReverbWrite(u32 address, s16 data)
   2164 {
   2165   // TODO: This should check interrupts.
   2166   const u32 real_address = ReverbMemoryAddress(address << 2);
   2167   std::memcpy(&s_ram[real_address], &data, sizeof(data));
   2168 }
   2169 
   2170 void SPU::ProcessReverb(s32 left_in, s32 right_in, s32* left_out, s32* right_out)
   2171 {
   2172   // From PSX-SPX:
   2173   // Input and output to/from the reverb unit is resampled using a 39-tap FIR filter with the following coefficients.
   2174   //  -0001h,  0000h,  0002h,  0000h, -000Ah,  0000h,  0023h,  0000h,
   2175   //  -0067h,  0000h,  010Ah,  0000h, -0268h,  0000h,  0534h,  0000h,
   2176   //  -0B90h,  0000h,  2806h,  4000h,  2806h,  0000h, -0B90h,  0000h,
   2177   //   0534h,  0000h, -0268h,  0000h,  010Ah,  0000h, -0067h,  0000h,
   2178   //   0023h,  0000h, -000Ah,  0000h,  0002h,  0000h, -0001h
   2179   //
   2180   // Zeros have been removed since the result is always zero, therefore the multiply is redundant.
   2181 
   2182   alignas(VECTOR_ALIGNMENT) static constexpr std::array<s32, 20> resample_coeff = {
   2183     -0x0001, 0x0002,  -0x000A, 0x0023,  -0x0067, 0x010A,  -0x0268, 0x0534,  -0x0B90, 0x2806,
   2184     0x2806,  -0x0B90, 0x0534,  -0x0268, 0x010A,  -0x0067, 0x0023,  -0x000A, 0x0002,  -0x0001};
   2185 
   2186   static constexpr auto iiasm = [](const s16 insamp) {
   2187     if (s_state.reverb_registers.IIR_ALPHA == -32768) [[unlikely]]
   2188       return (insamp == -32768) ? 0 : (insamp * -65536);
   2189     else
   2190       return insamp * (32768 - s_state.reverb_registers.IIR_ALPHA);
   2191   };
   2192 
   2193   static constexpr auto neg = [](s32 samp) { return (samp == -32768) ? 0x7FFF : -samp; };
   2194 
   2195   s_state.last_reverb_input[0] = Truncate16(left_in);
   2196   s_state.last_reverb_input[1] = Truncate16(right_in);
   2197 
   2198   // Resampling buffer is duplicated to avoid having to manually wrap the index.
   2199   s_state.reverb_downsample_buffer[0][s_state.reverb_resample_buffer_position | 0x00] =
   2200     s_state.reverb_downsample_buffer[0][s_state.reverb_resample_buffer_position | 0x40] = Truncate16(left_in);
   2201   s_state.reverb_downsample_buffer[1][s_state.reverb_resample_buffer_position | 0x00] =
   2202     s_state.reverb_downsample_buffer[1][s_state.reverb_resample_buffer_position | 0x40] = Truncate16(right_in);
   2203 
   2204   // Reverb algorithm from Mednafen-PSX, rewritten/vectorized.
   2205   s32 out[2];
   2206   if (s_state.reverb_resample_buffer_position & 1u)
   2207   {
   2208     std::array<s32, 2> downsampled;
   2209     for (size_t channel = 0; channel < 2; channel++)
   2210     {
   2211       const s16* src =
   2212         &s_state.reverb_downsample_buffer[channel][(s_state.reverb_resample_buffer_position - 38) & 0x3F];
   2213       GSVector4i acc =
   2214         GSVector4i::load<true>(&resample_coeff[0]).mul32l(GSVector4i::load<false>(&src[0]).sll32(16).sra32(16));
   2215       acc = acc.add32(
   2216         GSVector4i::load<true>(&resample_coeff[4]).mul32l(GSVector4i::load<false>(&src[8]).sll32(16).sra32(16)));
   2217       acc = acc.add32(
   2218         GSVector4i::load<true>(&resample_coeff[8]).mul32l(GSVector4i::load<false>(&src[16]).sll32(16).sra32(16)));
   2219       acc = acc.add32(
   2220         GSVector4i::load<true>(&resample_coeff[12]).mul32l(GSVector4i::load<false>(&src[24]).sll32(16).sra32(16)));
   2221       acc = acc.add32(
   2222         GSVector4i::load<true>(&resample_coeff[16]).mul32l(GSVector4i::load<false>(&src[32]).sll32(16).sra32(16)));
   2223 
   2224       // Horizontal reduction, middle 0x4000. Moved here so we don't need another 4 elements above.
   2225       downsampled[channel] = Clamp16((acc.addv_s32() + (0x4000 * src[19])) >> 15);
   2226     }
   2227 
   2228     for (size_t channel = 0; channel < 2; channel++)
   2229     {
   2230       if (s_state.SPUCNT.reverb_master_enable)
   2231       {
   2232         // Input from Mixer (Input volume multiplied with incoming data).
   2233         const s32 IIR_INPUT_A = Clamp16(
   2234           (((ReverbRead(s_state.reverb_registers.IIR_SRC_A[channel ^ 0]) * s_state.reverb_registers.IIR_COEF) >> 14) +
   2235            ((downsampled[channel] * s_state.reverb_registers.IN_COEF[channel]) >> 14)) >>
   2236           1);
   2237         const s32 IIR_INPUT_B = Clamp16(
   2238           (((ReverbRead(s_state.reverb_registers.IIR_SRC_B[channel ^ 1]) * s_state.reverb_registers.IIR_COEF) >> 14) +
   2239            ((downsampled[channel] * s_state.reverb_registers.IN_COEF[channel]) >> 14)) >>
   2240           1);
   2241 
   2242         // Same Side Reflection (left-to-left and right-to-right).
   2243         const s32 IIR_A = Clamp16((((IIR_INPUT_A * s_state.reverb_registers.IIR_ALPHA) >> 14) +
   2244                                    (iiasm(ReverbRead(s_state.reverb_registers.IIR_DEST_A[channel], -1)) >> 14)) >>
   2245                                   1);
   2246 
   2247         // Different Side Reflection (left-to-right and right-to-left).
   2248         const s32 IIR_B = Clamp16((((IIR_INPUT_B * s_state.reverb_registers.IIR_ALPHA) >> 14) +
   2249                                    (iiasm(ReverbRead(s_state.reverb_registers.IIR_DEST_B[channel], -1)) >> 14)) >>
   2250                                   1);
   2251 
   2252         ReverbWrite(s_state.reverb_registers.IIR_DEST_A[channel], Truncate16(IIR_A));
   2253         ReverbWrite(s_state.reverb_registers.IIR_DEST_B[channel], Truncate16(IIR_B));
   2254       }
   2255 
   2256       // Early Echo (Comb Filter, with input from buffer).
   2257       const s32 ACC =
   2258         ((ReverbRead(s_state.reverb_registers.ACC_SRC_A[channel]) * s_state.reverb_registers.ACC_COEF_A) >> 14) +
   2259         ((ReverbRead(s_state.reverb_registers.ACC_SRC_B[channel]) * s_state.reverb_registers.ACC_COEF_B) >> 14) +
   2260         ((ReverbRead(s_state.reverb_registers.ACC_SRC_C[channel]) * s_state.reverb_registers.ACC_COEF_C) >> 14) +
   2261         ((ReverbRead(s_state.reverb_registers.ACC_SRC_D[channel]) * s_state.reverb_registers.ACC_COEF_D) >> 14);
   2262 
   2263       // Late Reverb APF1 (All Pass Filter 1, with input from COMB).
   2264       const s32 FB_A = ReverbRead(s_state.reverb_registers.MIX_DEST_A[channel] - s_state.reverb_registers.FB_SRC_A);
   2265       const s32 FB_B = ReverbRead(s_state.reverb_registers.MIX_DEST_B[channel] - s_state.reverb_registers.FB_SRC_B);
   2266       const s32 MDA = Clamp16((ACC + ((FB_A * neg(s_state.reverb_registers.FB_ALPHA)) >> 14)) >> 1);
   2267 
   2268       // Late Reverb APF2 (All Pass Filter 2, with input from APF1).
   2269       const s32 MDB = Clamp16(FB_A + ((((MDA * s_state.reverb_registers.FB_ALPHA) >> 14) +
   2270                                        ((FB_B * neg(s_state.reverb_registers.FB_X)) >> 14)) >>
   2271                                       1));
   2272 
   2273       // 22050hz sample output.
   2274       s_state.reverb_upsample_buffer[channel][(s_state.reverb_resample_buffer_position >> 1) | 0x20] =
   2275         s_state.reverb_upsample_buffer[channel][s_state.reverb_resample_buffer_position >> 1] =
   2276           Truncate16(Clamp16(FB_B + ((MDB * s_state.reverb_registers.FB_X) >> 15)));
   2277 
   2278       if (s_state.SPUCNT.reverb_master_enable)
   2279       {
   2280         ReverbWrite(s_state.reverb_registers.MIX_DEST_A[channel], Truncate16(MDA));
   2281         ReverbWrite(s_state.reverb_registers.MIX_DEST_B[channel], Truncate16(MDB));
   2282       }
   2283     }
   2284 
   2285     s_state.reverb_current_address = (s_state.reverb_current_address + 1) & 0x3FFFFu;
   2286     s_state.reverb_current_address =
   2287       (s_state.reverb_current_address == 0) ? s_state.reverb_base_address : s_state.reverb_current_address;
   2288 
   2289     for (size_t channel = 0; channel < 2; channel++)
   2290     {
   2291       const s16* src =
   2292         &s_state.reverb_upsample_buffer[channel][((s_state.reverb_resample_buffer_position >> 1) - 19) & 0x1F];
   2293 
   2294       GSVector4i srcs = GSVector4i::load<false>(&src[0]);
   2295       GSVector4i acc = GSVector4i::load<true>(&resample_coeff[0]).mul32l(srcs.s16to32());
   2296       acc = acc.add32(GSVector4i::load<true>(&resample_coeff[4]).mul32l(srcs.uph64().s16to32()));
   2297       srcs = GSVector4i::load<false>(&src[8]);
   2298       acc = acc.add32(GSVector4i::load<true>(&resample_coeff[8]).mul32l(srcs.s16to32()));
   2299       acc = acc.add32(GSVector4i::load<true>(&resample_coeff[12]).mul32l(srcs.uph64().s16to32()));
   2300       srcs = GSVector4i::loadl(&src[16]);
   2301       acc = acc.add32(GSVector4i::load<true>(&resample_coeff[16]).mul32l(srcs.s16to32()));
   2302 
   2303       out[channel] = std::clamp<s32>(acc.addv_s32() >> 14, -32768, 32767);
   2304     }
   2305   }
   2306   else
   2307   {
   2308     const size_t idx = (((s_state.reverb_resample_buffer_position >> 1) - 19) & 0x1F) + 9;
   2309     for (unsigned lr = 0; lr < 2; lr++)
   2310       out[lr] = s_state.reverb_upsample_buffer[lr][idx];
   2311   }
   2312 
   2313   s_state.reverb_resample_buffer_position = (s_state.reverb_resample_buffer_position + 1) & 0x3F;
   2314 
   2315   s_state.last_reverb_output[0] = *left_out = ApplyVolume(out[0], s_state.reverb_registers.vLOUT);
   2316   s_state.last_reverb_output[1] = *right_out = ApplyVolume(out[1], s_state.reverb_registers.vROUT);
   2317 
   2318 #ifdef SPU_DUMP_ALL_VOICES
   2319   if (s_state.s_voice_dump_writers[NUM_VOICES])
   2320   {
   2321     const s16 dump_samples[2] = {static_cast<s16>(Clamp16(s_state.last_reverb_output[0])),
   2322                                  static_cast<s16>(Clamp16(s_state.last_reverb_output[1]))};
   2323     s_state.s_voice_dump_writers[NUM_VOICES]->WriteFrames(dump_samples, 1);
   2324   }
   2325 #endif
   2326 }
   2327 
   2328 void SPU::Execute(void* param, TickCount ticks, TickCount ticks_late)
   2329 {
   2330   u32 remaining_frames;
   2331   if (g_settings.cpu_overclock_active)
   2332   {
   2333     // (X * D) / N / 768 -> (X * D) / (N * 768)
   2334     const u64 num =
   2335       (static_cast<u64>(ticks) * g_settings.cpu_overclock_denominator) + static_cast<u32>(s_state.ticks_carry);
   2336     remaining_frames = static_cast<u32>(num / s_state.cpu_tick_divider);
   2337     s_state.ticks_carry = static_cast<TickCount>(num % s_state.cpu_tick_divider);
   2338   }
   2339   else
   2340   {
   2341     remaining_frames = static_cast<u32>((ticks + s_state.ticks_carry) / SYSCLK_TICKS_PER_SPU_TICK);
   2342     s_state.ticks_carry = (ticks + s_state.ticks_carry) % SYSCLK_TICKS_PER_SPU_TICK;
   2343   }
   2344 
   2345   AudioStream* output_stream =
   2346     s_state.audio_output_muted ? s_state.null_audio_stream.get() : s_state.audio_stream.get();
   2347 
   2348   while (remaining_frames > 0)
   2349   {
   2350     s16* output_frame_start;
   2351     u32 output_frame_space = remaining_frames;
   2352     output_stream->BeginWrite(&output_frame_start, &output_frame_space);
   2353 
   2354     s16* output_frame = output_frame_start;
   2355     const u32 frames_in_this_batch = std::min(remaining_frames, output_frame_space);
   2356     for (u32 i = 0; i < frames_in_this_batch; i++)
   2357     {
   2358       s32 left_sum = 0;
   2359       s32 right_sum = 0;
   2360       s32 reverb_in_left = 0;
   2361       s32 reverb_in_right = 0;
   2362 
   2363       u32 reverb_on_register = s_state.reverb_on_register;
   2364 
   2365       for (u32 voice = 0; voice < NUM_VOICES; voice++)
   2366       {
   2367         const auto [left, right] = SampleVoice(voice);
   2368         left_sum += left;
   2369         right_sum += right;
   2370 
   2371         if (reverb_on_register & 1u)
   2372         {
   2373           reverb_in_left += left;
   2374           reverb_in_right += right;
   2375         }
   2376         reverb_on_register >>= 1;
   2377       }
   2378 
   2379       if (!s_state.SPUCNT.mute_n)
   2380       {
   2381         left_sum = 0;
   2382         right_sum = 0;
   2383         reverb_in_left = 0;
   2384         reverb_in_right = 0;
   2385       }
   2386 
   2387       // Update noise once per frame.
   2388       UpdateNoise();
   2389 
   2390       // Mix in CD audio.
   2391       const auto [cd_audio_left, cd_audio_right] = CDROM::GetAudioFrame();
   2392       if (s_state.SPUCNT.cd_audio_enable)
   2393       {
   2394         const s32 cd_audio_volume_left = ApplyVolume(s32(cd_audio_left), s_state.cd_audio_volume_left);
   2395         const s32 cd_audio_volume_right = ApplyVolume(s32(cd_audio_right), s_state.cd_audio_volume_right);
   2396 
   2397         left_sum += cd_audio_volume_left;
   2398         right_sum += cd_audio_volume_right;
   2399 
   2400         if (s_state.SPUCNT.cd_audio_reverb)
   2401         {
   2402           reverb_in_left += cd_audio_volume_left;
   2403           reverb_in_right += cd_audio_volume_right;
   2404         }
   2405       }
   2406 
   2407       // Compute reverb.
   2408       s32 reverb_out_left, reverb_out_right;
   2409       ProcessReverb(Clamp16(reverb_in_left), Clamp16(reverb_in_right), &reverb_out_left, &reverb_out_right);
   2410 
   2411       // Mix in reverb.
   2412       left_sum += reverb_out_left;
   2413       right_sum += reverb_out_right;
   2414 
   2415       // Apply main volume after clamping. A maximum volume should not overflow here because both are 16-bit values.
   2416       *(output_frame++) = static_cast<s16>(ApplyVolume(Clamp16(left_sum), s_state.main_volume_left.current_level));
   2417       *(output_frame++) = static_cast<s16>(ApplyVolume(Clamp16(right_sum), s_state.main_volume_right.current_level));
   2418       s_state.main_volume_left.Tick();
   2419       s_state.main_volume_right.Tick();
   2420 
   2421       // Write to capture buffers.
   2422       WriteToCaptureBuffer(0, cd_audio_left);
   2423       WriteToCaptureBuffer(1, cd_audio_right);
   2424       WriteToCaptureBuffer(2, static_cast<s16>(Clamp16(s_state.voices[1].last_volume)));
   2425       WriteToCaptureBuffer(3, static_cast<s16>(Clamp16(s_state.voices[3].last_volume)));
   2426       IncrementCaptureBufferPosition();
   2427 
   2428       // Key off/on voices after the first frame.
   2429       if (i == 0 && (s_state.key_off_register != 0 || s_state.key_on_register != 0))
   2430       {
   2431         u32 key_off_register = s_state.key_off_register;
   2432         s_state.key_off_register = 0;
   2433 
   2434         u32 key_on_register = s_state.key_on_register;
   2435         s_state.key_on_register = 0;
   2436 
   2437         for (u32 voice = 0; voice < NUM_VOICES; voice++)
   2438         {
   2439           if (key_off_register & 1u)
   2440             s_state.voices[voice].KeyOff();
   2441           key_off_register >>= 1;
   2442 
   2443           if (key_on_register & 1u)
   2444           {
   2445             s_state.endx_register &= ~(1u << voice);
   2446             s_state.voices[voice].KeyOn();
   2447           }
   2448           key_on_register >>= 1;
   2449         }
   2450       }
   2451     }
   2452 
   2453 #ifndef __ANDROID__
   2454     if (MediaCapture* cap = System::GetMediaCapture()) [[unlikely]]
   2455     {
   2456       if (!cap->DeliverAudioFrames(output_frame_start, frames_in_this_batch))
   2457         System::StopMediaCapture();
   2458     }
   2459 #endif
   2460 
   2461     output_stream->EndWrite(frames_in_this_batch);
   2462     remaining_frames -= frames_in_this_batch;
   2463   }
   2464 }
   2465 
   2466 void SPU::UpdateEventInterval()
   2467 {
   2468   // Don't generate more than the audio buffer since in a single slice, otherwise we'll both overflow the buffers when
   2469   // we do write it, and the audio thread will underflow since it won't have enough data it the game isn't messing with
   2470   // the SPU state.
   2471   const u32 max_slice_frames = s_state.audio_stream->GetBufferSize();
   2472 
   2473   // TODO: Make this predict how long until the interrupt will be hit instead...
   2474   const u32 interval = (s_state.SPUCNT.enable && s_state.SPUCNT.irq9_enable) ? 1 : max_slice_frames;
   2475   const TickCount interval_ticks = static_cast<TickCount>(interval) * s_state.cpu_ticks_per_spu_tick;
   2476   if (s_state.tick_event.IsActive() && s_state.tick_event.GetInterval() == interval_ticks)
   2477     return;
   2478 
   2479   // Ensure all pending ticks have been executed, since we won't get them back after rescheduling.
   2480   s_state.tick_event.InvokeEarly(true);
   2481   s_state.tick_event.SetInterval(interval_ticks);
   2482 
   2483   TickCount downcount = interval_ticks;
   2484   if (!g_settings.cpu_overclock_active)
   2485     downcount -= s_state.ticks_carry;
   2486 
   2487   s_state.tick_event.Schedule(downcount);
   2488 }
   2489 
   2490 void SPU::DrawDebugStateWindow()
   2491 {
   2492   static const ImVec4 active_color{1.0f, 1.0f, 1.0f, 1.0f};
   2493   static const ImVec4 inactive_color{0.4f, 0.4f, 0.4f, 1.0f};
   2494   const float framebuffer_scale = ImGuiManager::GetGlobalScale();
   2495 
   2496   ImGui::SetNextWindowSize(ImVec2(800.0f * framebuffer_scale, 800.0f * framebuffer_scale), ImGuiCond_FirstUseEver);
   2497   if (!ImGui::Begin("SPU State", nullptr))
   2498   {
   2499     ImGui::End();
   2500     return;
   2501   }
   2502 
   2503   // status
   2504   if (ImGui::CollapsingHeader("Status", ImGuiTreeNodeFlags_DefaultOpen))
   2505   {
   2506     static constexpr std::array<const char*, 4> transfer_modes = {
   2507       {"Transfer Stopped", "Manual Write", "DMA Write", "DMA Read"}};
   2508     const std::array<float, 6> offsets = {{100.0f * framebuffer_scale, 200.0f * framebuffer_scale,
   2509                                            300.0f * framebuffer_scale, 420.0f * framebuffer_scale,
   2510                                            500.0f * framebuffer_scale, 600.0f * framebuffer_scale}};
   2511 
   2512     ImGui::Text("Control: ");
   2513     ImGui::SameLine(offsets[0]);
   2514     ImGui::TextColored(s_state.SPUCNT.enable ? active_color : inactive_color, "SPU Enable");
   2515     ImGui::SameLine(offsets[1]);
   2516     ImGui::TextColored(s_state.SPUCNT.mute_n ? inactive_color : active_color, "Mute SPU");
   2517     ImGui::SameLine(offsets[2]);
   2518     ImGui::TextColored(s_state.SPUCNT.external_audio_enable ? active_color : inactive_color, "External Audio");
   2519     ImGui::SameLine(offsets[3]);
   2520     ImGui::TextColored(s_state.SPUCNT.ram_transfer_mode != RAMTransferMode::Stopped ? active_color : inactive_color,
   2521                        "%s", transfer_modes[static_cast<u8>(s_state.SPUCNT.ram_transfer_mode.GetValue())]);
   2522 
   2523     ImGui::Text("Status: ");
   2524     ImGui::SameLine(offsets[0]);
   2525     ImGui::TextColored(s_state.SPUSTAT.irq9_flag ? active_color : inactive_color, "IRQ9");
   2526     ImGui::SameLine(offsets[1]);
   2527     ImGui::TextColored(s_state.SPUSTAT.dma_request ? active_color : inactive_color, "DMA Request");
   2528     ImGui::SameLine(offsets[2]);
   2529     ImGui::TextColored(s_state.SPUSTAT.dma_read_request ? active_color : inactive_color, "DMA Read");
   2530     ImGui::SameLine(offsets[3]);
   2531     ImGui::TextColored(s_state.SPUSTAT.dma_write_request ? active_color : inactive_color, "DMA Write");
   2532     ImGui::SameLine(offsets[4]);
   2533     ImGui::TextColored(s_state.SPUSTAT.transfer_busy ? active_color : inactive_color, "Transfer Busy");
   2534     ImGui::SameLine(offsets[5]);
   2535     ImGui::TextColored(s_state.SPUSTAT.second_half_capture_buffer ? active_color : inactive_color,
   2536                        "Second Capture Buffer");
   2537 
   2538     ImGui::Text("Interrupt: ");
   2539     ImGui::SameLine(offsets[0]);
   2540     ImGui::TextColored(s_state.SPUCNT.irq9_enable ? active_color : inactive_color,
   2541                        s_state.SPUCNT.irq9_enable ? "Enabled @ 0x%04X (actual 0x%08X)" :
   2542                                                     "Disabled @ 0x%04X (actual 0x%08X)",
   2543                        s_state.irq_address, (ZeroExtend32(s_state.irq_address) * 8) & RAM_MASK);
   2544 
   2545     ImGui::Text("Volume: ");
   2546     ImGui::SameLine(offsets[0]);
   2547     ImGui::Text("Left: %d%%", ApplyVolume(100, s_state.main_volume_left.current_level));
   2548     ImGui::SameLine(offsets[1]);
   2549     ImGui::Text("Right: %d%%", ApplyVolume(100, s_state.main_volume_right.current_level));
   2550 
   2551     ImGui::Text("CD Audio: ");
   2552     ImGui::SameLine(offsets[0]);
   2553     ImGui::TextColored(s_state.SPUCNT.cd_audio_enable ? active_color : inactive_color,
   2554                        s_state.SPUCNT.cd_audio_enable ? "Enabled" : "Disabled");
   2555     ImGui::SameLine(offsets[1]);
   2556     ImGui::TextColored(s_state.SPUCNT.cd_audio_enable ? active_color : inactive_color, "Left Volume: %d%%",
   2557                        ApplyVolume(100, s_state.cd_audio_volume_left));
   2558     ImGui::SameLine(offsets[3]);
   2559     ImGui::TextColored(s_state.SPUCNT.cd_audio_enable ? active_color : inactive_color, "Right Volume: %d%%",
   2560                        ApplyVolume(100, s_state.cd_audio_volume_left));
   2561 
   2562     ImGui::Text("Transfer FIFO: ");
   2563     ImGui::SameLine(offsets[0]);
   2564     ImGui::TextColored(s_state.transfer_event.IsActive() ? active_color : inactive_color, "%u halfwords (%u bytes)",
   2565                        s_state.transfer_fifo.GetSize(), s_state.transfer_fifo.GetSize() * 2);
   2566   }
   2567 
   2568   // draw voice states
   2569   if (ImGui::CollapsingHeader("Voice State", ImGuiTreeNodeFlags_DefaultOpen))
   2570   {
   2571     static constexpr u32 NUM_COLUMNS = 12;
   2572 
   2573     ImGui::Columns(NUM_COLUMNS);
   2574 
   2575     // headers
   2576     static constexpr std::array<const char*, NUM_COLUMNS> column_titles = {
   2577       {"#", "InterpIndex", "SampleIndex", "CurAddr", "StartAddr", "RepeatAddr", "SampleRate", "VolLeft", "VolRight",
   2578        "ADSRPhase", "ADSRVol", "ADSRTicks"}};
   2579     static constexpr std::array<const char*, 5> adsr_phases = {{"Off", "Attack", "Decay", "Sustain", "Release"}};
   2580     for (u32 i = 0; i < NUM_COLUMNS; i++)
   2581     {
   2582       ImGui::TextUnformatted(column_titles[i]);
   2583       ImGui::NextColumn();
   2584     }
   2585 
   2586     // states
   2587     for (u32 voice_index = 0; voice_index < NUM_VOICES; voice_index++)
   2588     {
   2589       const Voice& v = s_state.voices[voice_index];
   2590       ImVec4 color = v.IsOn() ? ImVec4(1.0f, 1.0f, 1.0f, 1.0f) : ImVec4(0.5f, 0.5f, 0.5f, 1.0f);
   2591       ImGui::TextColored(color, "%u", ZeroExtend32(voice_index));
   2592       ImGui::NextColumn();
   2593       if (IsVoiceNoiseEnabled(voice_index))
   2594         ImGui::TextColored(color, "NOISE");
   2595       else
   2596         ImGui::TextColored(color, "%u", ZeroExtend32(v.counter.interpolation_index.GetValue()));
   2597       ImGui::NextColumn();
   2598       ImGui::TextColored(color, "%u", ZeroExtend32(v.counter.sample_index.GetValue()));
   2599       ImGui::NextColumn();
   2600       ImGui::TextColored(color, "%04X", ZeroExtend32(v.current_address));
   2601       ImGui::NextColumn();
   2602       ImGui::TextColored(color, "%04X", ZeroExtend32(v.regs.adpcm_start_address));
   2603       ImGui::NextColumn();
   2604       ImGui::TextColored(color, "%04X", ZeroExtend32(v.regs.adpcm_repeat_address));
   2605       ImGui::NextColumn();
   2606       ImGui::TextColored(color, "%.2f", (float(v.regs.adpcm_sample_rate) / 4096.0f) * 44100.0f);
   2607       ImGui::NextColumn();
   2608       ImGui::TextColored(color, "%d%%", ApplyVolume(100, v.left_volume.current_level));
   2609       ImGui::NextColumn();
   2610       ImGui::TextColored(color, "%d%%", ApplyVolume(100, v.right_volume.current_level));
   2611       ImGui::NextColumn();
   2612       ImGui::TextColored(color, "%s", adsr_phases[static_cast<u8>(v.adsr_phase)]);
   2613       ImGui::NextColumn();
   2614       ImGui::TextColored(color, "%d%%", ApplyVolume(100, v.regs.adsr_volume));
   2615       ImGui::NextColumn();
   2616       ImGui::TextColored(color, "%d", v.adsr_envelope.counter);
   2617       ImGui::NextColumn();
   2618     }
   2619 
   2620     ImGui::Columns(1);
   2621   }
   2622 
   2623   if (ImGui::CollapsingHeader("Reverb", ImGuiTreeNodeFlags_DefaultOpen))
   2624   {
   2625     ImGui::TextColored(s_state.SPUCNT.reverb_master_enable ? active_color : inactive_color, "Master Enable: %s",
   2626                        s_state.SPUCNT.reverb_master_enable ? "Yes" : "No");
   2627     ImGui::Text("Voices Enabled: ");
   2628 
   2629     for (u32 i = 0; i < NUM_VOICES; i++)
   2630     {
   2631       ImGui::SameLine(0.0f, 16.0f);
   2632 
   2633       const bool active = IsVoiceReverbEnabled(i);
   2634       ImGui::TextColored(active ? active_color : inactive_color, "%u", i);
   2635     }
   2636 
   2637     ImGui::TextColored(s_state.SPUCNT.cd_audio_reverb ? active_color : inactive_color, "CD Audio Enable: %s",
   2638                        s_state.SPUCNT.cd_audio_reverb ? "Yes" : "No");
   2639 
   2640     ImGui::TextColored(s_state.SPUCNT.external_audio_reverb ? active_color : inactive_color,
   2641                        "External Audio Enable: %s", s_state.SPUCNT.external_audio_reverb ? "Yes" : "No");
   2642 
   2643     ImGui::Text("Base Address: 0x%08X (%04X)", s_state.reverb_base_address, s_state.reverb_registers.mBASE);
   2644     ImGui::Text("Current Address: 0x%08X", s_state.reverb_current_address);
   2645     ImGui::Text("Current Amplitude: Input (%d, %d) Output (%d, %d)", s_state.last_reverb_input[0],
   2646                 s_state.last_reverb_input[1], s_state.last_reverb_output[0], s_state.last_reverb_output[1]);
   2647     ImGui::Text("Output Volume: Left %d%% Right %d%%", ApplyVolume(100, s_state.reverb_registers.vLOUT),
   2648                 ApplyVolume(100, s_state.reverb_registers.vROUT));
   2649 
   2650     ImGui::Text("Pitch Modulation: ");
   2651     for (u32 i = 1; i < NUM_VOICES; i++)
   2652     {
   2653       ImGui::SameLine(0.0f, 16.0f);
   2654 
   2655       const bool active = IsPitchModulationEnabled(i);
   2656       ImGui::TextColored(active ? active_color : inactive_color, "%u", i);
   2657     }
   2658   }
   2659 
   2660   if (ImGui::CollapsingHeader("Hacks", ImGuiTreeNodeFlags_DefaultOpen))
   2661   {
   2662     if (ImGui::Button("Key Off All Voices"))
   2663     {
   2664       for (u32 i = 0; i < NUM_VOICES; i++)
   2665       {
   2666         s_state.voices[i].KeyOff();
   2667         s_state.voices[i].adsr_envelope.counter = 0;
   2668         s_state.voices[i].regs.adsr_volume = 0;
   2669       }
   2670     }
   2671   }
   2672 
   2673   ImGui::End();
   2674 }