From ee98912a4245d082ab8d24b55b2ec654be28bc44 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 18 Aug 2024 15:58:48 +1000 Subject: [PATCH] SPU: Fix SPU_DUMP_ALL_VOICES option --- src/core/spu.cpp | 95 ++++++++++++++++++------------------------------ 1 file changed, 35 insertions(+), 60 deletions(-) diff --git a/src/core/spu.cpp b/src/core/spu.cpp index 1d93e6665..165daf8fd 100644 --- a/src/core/spu.cpp +++ b/src/core/spu.cpp @@ -410,7 +410,6 @@ struct SPUState std::unique_ptr audio_stream; std::unique_ptr null_audio_stream; - std::unique_ptr dump_writer; bool audio_output_muted = false; #ifdef SPU_DUMP_ALL_VOICES @@ -436,6 +435,30 @@ void SPU::Initialize() CreateOutputStream(); Reset(); + +#ifdef SPU_DUMP_ALL_VOICES + { + const std::string base_path = System::GetNewMediaCapturePath(System::GetGameTitle(), "wav"); + for (size_t i = 0; i < s_state.s_voice_dump_writers.size(); i++) + { + s_state.s_voice_dump_writers[i].reset(); + s_state.s_voice_dump_writers[i] = std::make_unique(); + + TinyString new_suffix; + if (i == NUM_VOICES) + new_suffix.assign("reverb.wav"); + else + new_suffix.format("voice{}.wav", i); + + const std::string voice_filename = Path::ReplaceExtension(base_path, new_suffix); + if (!s_state.s_voice_dump_writers[i]->Open(voice_filename.c_str(), SAMPLE_RATE, 2)) + { + ERROR_LOG("Failed to open voice dump filename '{}'", voice_filename.c_str()); + s_state.s_voice_dump_writers[i].reset(); + } + } + } +#endif } void SPU::CreateOutputStream() @@ -483,6 +506,11 @@ void SPU::CPUClockChanged() void SPU::Shutdown() { +#ifdef SPU_DUMP_ALL_VOICES + for (size_t i = 0; i < s_state.s_voice_dump_writers.size(); i++) + s_state.s_voice_dump_writers[i].reset(); +#endif + s_state.tick_event.Deactivate(); s_state.transfer_event.Deactivate(); s_state.audio_stream.reset(); @@ -1508,59 +1536,6 @@ void SPU::InternalGeneratePendingSamples() s_state.tick_event.InvokeEarly(force_exec); } -#if 0 -// TODO: FIXME -bool SPU::StartDumpingAudio(const char* filename) -{ - s_state.dump_writer.reset(); - s_state.dump_writer = std::make_unique(); - if (!s_state.dump_writer->Open(filename, SAMPLE_RATE, 2)) - { - ERROR_LOG("Failed to open '{}'", filename); - s_state.dump_writer.reset(); - return false; - } - -#ifdef SPU_DUMP_ALL_VOICES - for (size_t i = 0; i < s_voice_dump_writers.size(); i++) - { - s_voice_dump_writers[i].reset(); - s_voice_dump_writers[i] = std::make_unique(); - - TinyString new_suffix; - if (i == NUM_VOICES) - new_suffix.assign("reverb.wav"); - else - new_suffix.format("voice{}.wav", i); - - const std::string voice_filename = Path::ReplaceExtension(filename, new_suffix); - if (!s_voice_dump_writers[i]->Open(voice_filename.c_str(), SAMPLE_RATE, 2)) - { - ERROR_LOG("Failed to open voice dump filename '{}'", voice_filename.c_str()); - s_voice_dump_writers[i].reset(); - } - } -#endif - - return true; -} - -bool SPU::StopDumpingAudio() -{ - if (!s_state.dump_writer) - return false; - - s_state.dump_writer.reset(); - -#ifdef SPU_DUMP_ALL_VOICES - for (size_t i = 0; i < s_voice_dump_writers.size(); i++) - s_voice_dump_writers[i].reset(); -#endif - - return true; -} -#endif - const std::array& SPU::GetRAM() { return s_ram; @@ -1972,10 +1947,10 @@ ALWAYS_INLINE_RELEASE std::tuple SPU::SampleVoice(u32 voice_index) voice.last_volume = 0; #ifdef SPU_DUMP_ALL_VOICES - if (s_voice_dump_writers[voice_index]) + if (s_state.s_voice_dump_writers[voice_index]) { const s16 dump_samples[2] = {0, 0}; - s_voice_dump_writers[voice_index]->WriteFrames(dump_samples, 1); + s_state.s_voice_dump_writers[voice_index]->WriteFrames(dump_samples, 1); } #endif @@ -2075,10 +2050,10 @@ ALWAYS_INLINE_RELEASE std::tuple SPU::SampleVoice(u32 voice_index) voice.right_volume.Tick(); #ifdef SPU_DUMP_ALL_VOICES - if (s_voice_dump_writers[voice_index]) + if (s_state.s_voice_dump_writers[voice_index]) { const s16 dump_samples[2] = {static_cast(Clamp16(left)), static_cast(Clamp16(right))}; - s_voice_dump_writers[voice_index]->WriteFrames(dump_samples, 1); + s_state.s_voice_dump_writers[voice_index]->WriteFrames(dump_samples, 1); } #endif @@ -2298,11 +2273,11 @@ void SPU::ProcessReverb(s16 left_in, s16 right_in, s32* left_out, s32* right_out s_last_reverb_output[1] = *right_out = ApplyVolume(out[1], s_state.reverb_registers.vROUT); #ifdef SPU_DUMP_ALL_VOICES - if (s_voice_dump_writers[NUM_VOICES]) + if (s_state.s_voice_dump_writers[NUM_VOICES]) { const s16 dump_samples[2] = {static_cast(Clamp16(s_last_reverb_output[0])), static_cast(Clamp16(s_last_reverb_output[1]))}; - s_voice_dump_writers[NUM_VOICES]->WriteFrames(dump_samples, 1); + s_state.s_voice_dump_writers[NUM_VOICES]->WriteFrames(dump_samples, 1); } #endif }