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(¤t_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 }