From 2edc8b4b73c6684ba72bb873164a2cf009d18b4e Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 21 Dec 2025 21:32:53 +0100 Subject: [PATCH] audio_core: Move dsp memory ownership to memory system --- src/audio_core/dsp_interface.h | 3 --- src/audio_core/hle/hle.cpp | 27 +++++++------------ src/audio_core/hle/hle.h | 2 -- src/audio_core/lle/lle.cpp | 4 --- src/audio_core/lle/lle.h | 2 -- src/core/core.cpp | 3 --- src/core/memory.cpp | 12 ++++----- src/core/memory.h | 2 +- .../merry_audio/service_fixture.cpp | 3 ++- 9 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/audio_core/dsp_interface.h b/src/audio_core/dsp_interface.h index e2e76db6d..5ec41691a 100644 --- a/src/audio_core/dsp_interface.h +++ b/src/audio_core/dsp_interface.h @@ -86,9 +86,6 @@ public: */ virtual void PipeWrite(DspPipe pipe_number, std::span buffer) = 0; - /// Returns a reference to the array backing DSP memory - virtual std::array& GetDspMemory() = 0; - /// Sets the handler for the interrupts we trigger virtual void SetInterruptHandler( std::function handler) = 0; diff --git a/src/audio_core/hle/hle.cpp b/src/audio_core/hle/hle.cpp index 2ad86ca73..45165a2e8 100644 --- a/src/audio_core/hle/hle.cpp +++ b/src/audio_core/hle/hle.cpp @@ -60,8 +60,6 @@ public: std::size_t GetPipeReadableSize(DspPipe pipe_number) const; void PipeWrite(DspPipe pipe_number, std::span buffer); - std::array& GetDspMemory(); - void SetInterruptHandler( std::function handler); @@ -81,7 +79,10 @@ private: DspState dsp_state = DspState::Off; std::array, num_dsp_pipe> pipe_data{}; - HLE::DspMemory dsp_memory; +public: + HLE::DspMemory* dsp_memory; + +private: std::array sources{{ HLE::Source(0), HLE::Source(1), HLE::Source(2), HLE::Source(3), HLE::Source(4), HLE::Source(5), HLE::Source(6), HLE::Source(7), HLE::Source(8), HLE::Source(9), @@ -103,7 +104,6 @@ private: void serialize(Archive& ar, const unsigned int) { ar & dsp_state; ar & pipe_data; - ar & dsp_memory.raw_memory; ar & sources; ar & mixers; // interrupt_handler is reregistered when loading state from DSP_DSP @@ -113,7 +113,8 @@ private: DspHle::Impl::Impl(DspHle& parent_, Memory::MemorySystem& memory, Core::Timing& timing) : parent(parent_), core_timing(timing) { - dsp_memory.raw_memory.fill(0); + dsp_memory = reinterpret_cast(memory.GetDspMemory().data()); + dsp_memory->raw_memory.fill(0); for (auto& source : sources) { source.SetMemory(memory); @@ -284,10 +285,6 @@ void DspHle::Impl::PipeWrite(DspPipe pipe_number, std::span buffer) { } } -std::array& DspHle::Impl::GetDspMemory() { - return dsp_memory.raw_memory; -} - void DspHle::Impl::SetInterruptHandler( std::function handler) { interrupt_handler = handler; @@ -343,8 +340,8 @@ void DspHle::Impl::AudioPipeWriteStructAddresses() { size_t DspHle::Impl::CurrentRegionIndex() const { // The region with the higher frame counter is chosen unless there is wraparound. // This function only returns a 0 or 1. - const u16 frame_counter_0 = dsp_memory.region_0.frame_counter; - const u16 frame_counter_1 = dsp_memory.region_1.frame_counter; + const u16 frame_counter_0 = dsp_memory->region_0.frame_counter; + const u16 frame_counter_1 = dsp_memory->region_1.frame_counter; if (frame_counter_0 == 0xFFFFu && frame_counter_1 != 0xFFFEu) { // Wraparound has occurred. @@ -360,11 +357,11 @@ size_t DspHle::Impl::CurrentRegionIndex() const { } HLE::SharedMemory& DspHle::Impl::ReadRegion() { - return CurrentRegionIndex() == 0 ? dsp_memory.region_0 : dsp_memory.region_1; + return CurrentRegionIndex() == 0 ? dsp_memory->region_0 : dsp_memory->region_1; } HLE::SharedMemory& DspHle::Impl::WriteRegion() { - return CurrentRegionIndex() != 0 ? dsp_memory.region_0 : dsp_memory.region_1; + return CurrentRegionIndex() != 0 ? dsp_memory->region_0 : dsp_memory->region_1; } StereoFrame16 DspHle::Impl::GenerateCurrentFrame() { @@ -454,10 +451,6 @@ void DspHle::PipeWrite(DspPipe pipe_number, std::span buffer) { impl->PipeWrite(pipe_number, buffer); } -std::array& DspHle::GetDspMemory() { - return impl->GetDspMemory(); -} - void DspHle::SetInterruptHandler( std::function handler) { impl->SetInterruptHandler(handler); diff --git a/src/audio_core/hle/hle.h b/src/audio_core/hle/hle.h index 2ee4421e7..d1b34b455 100644 --- a/src/audio_core/hle/hle.h +++ b/src/audio_core/hle/hle.h @@ -37,8 +37,6 @@ public: std::size_t GetPipeReadableSize(DspPipe pipe_number) const override; void PipeWrite(DspPipe pipe_number, std::span buffer) override; - std::array& GetDspMemory() override; - void SetInterruptHandler( std::function handler) override; diff --git a/src/audio_core/lle/lle.cpp b/src/audio_core/lle/lle.cpp index 91ac5dc73..8a9377578 100644 --- a/src/audio_core/lle/lle.cpp +++ b/src/audio_core/lle/lle.cpp @@ -403,10 +403,6 @@ void DspLle::PipeWrite(DspPipe pipe_number, std::span buffer) { impl->WritePipe(static_cast(pipe_number), buffer); } -std::array& DspLle::GetDspMemory() { - return impl->teakra.GetDspMemory(); -} - void DspLle::SetInterruptHandler( std::function handler) { impl->teakra.SetRecvDataHandler(0, [this, handler]() { diff --git a/src/audio_core/lle/lle.h b/src/audio_core/lle/lle.h index 7ae64575d..d59973f71 100644 --- a/src/audio_core/lle/lle.h +++ b/src/audio_core/lle/lle.h @@ -31,8 +31,6 @@ public: std::size_t GetPipeReadableSize(DspPipe pipe_number) const override; void PipeWrite(DspPipe pipe_number, std::span buffer) override; - std::array& GetDspMemory() override; - void SetInterruptHandler( std::function handler) override; diff --git a/src/core/core.cpp b/src/core/core.cpp index 005003ec8..ee338232d 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -496,8 +496,6 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window, dsp_core = std::make_unique(*this, multithread); } - memory->SetDSP(*dsp_core); - dsp_core->SetSink(Settings::values.output_type.GetValue(), Settings::values.output_device.GetValue()); dsp_core->EnableStretching(Settings::values.enable_audio_stretching.GetValue()); @@ -819,7 +817,6 @@ void System::serialize(Archive& ar, const unsigned int file_version) { u32 cheats_pid; ar & cheats_pid; timing->UnlockEventQueue(); - memory->SetDSP(*dsp_core); cheat_engine.Connect(cheats_pid); // Re-register gpu callback, because gsp service changed after service_manager got diff --git a/src/core/memory.cpp b/src/core/memory.cpp index c49aa2704..cfe6203e9 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -91,14 +91,13 @@ public: std::unique_ptr fcram = std::make_unique(Memory::FCRAM_N3DS_SIZE); std::unique_ptr vram = std::make_unique(Memory::VRAM_SIZE); std::unique_ptr n3ds_extra_ram = std::make_unique(Memory::N3DS_EXTRA_RAM_SIZE); + std::unique_ptr dsp_ram = std::make_unique(Memory::DSP_RAM_SIZE); Core::System& system; std::shared_ptr current_page_table = nullptr; RasterizerCacheMarker cache_marker; std::vector> page_table_list; - AudioCore::DspInterface* dsp = nullptr; - std::shared_ptr fcram_mem; std::shared_ptr vram_mem; std::shared_ptr n3ds_extra_ram_mem; @@ -111,7 +110,7 @@ public: case Region::VRAM: return vram.get(); case Region::DSP: - return dsp->GetDspMemory().data(); + return dsp_ram.get(); case Region::FCRAM: return fcram.get(); case Region::N3DS: @@ -126,7 +125,7 @@ public: case Region::VRAM: return vram.get(); case Region::DSP: - return dsp->GetDspMemory().data(); + return dsp_ram.get(); case Region::FCRAM: return fcram.get(); case Region::N3DS: @@ -324,6 +323,7 @@ private: fcram.get(), save_n3ds_ram ? Memory::FCRAM_N3DS_SIZE : Memory::FCRAM_SIZE); ar& boost::serialization::make_binary_object( n3ds_extra_ram.get(), save_n3ds_ram ? Memory::N3DS_EXTRA_RAM_SIZE : 0); + ar& boost::serialization::make_binary_object(dsp_ram.get(), Memory::DSP_RAM_SIZE); ar & cache_marker; ar & page_table_list; // dsp is set from Core::System at startup @@ -989,8 +989,8 @@ MemoryRef MemorySystem::GetFCRAMRef(std::size_t offset) const { return MemoryRef(impl->fcram_mem, offset); } -void MemorySystem::SetDSP(AudioCore::DspInterface& dsp) { - impl->dsp = &dsp; +std::span MemorySystem::GetDspMemory() const { + return std::span{impl->dsp_ram.get(), DSP_RAM_SIZE}; } } // namespace Memory diff --git a/src/core/memory.h b/src/core/memory.h index a3245f8ca..4afdbfc70 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -641,7 +641,7 @@ public: /// Unregisters page table for rasterizer cache marking void UnregisterPageTable(std::shared_ptr page_table); - void SetDSP(AudioCore::DspInterface& dsp); + std::span GetDspMemory() const; void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode); diff --git a/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp b/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp index 9417cea97..e8940100f 100644 --- a/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp +++ b/src/tests/audio_core/merryhime_3ds_audio/merry_audio/service_fixture.cpp @@ -85,7 +85,8 @@ Result ServiceFixture::DSP_ReadPipeIfPossible(u32 channel, u32 /*peer*/, void* o Result ServiceFixture::ServiceFixture::DSP_ConvertProcessAddressFromDspDram(u32 dsp_address, u16** host_address) { *host_address = reinterpret_cast( - (dsp_address << 1) + (reinterpret_cast(dsp->GetDspMemory().data()) + 0x40000u)); + (dsp_address << 1) + + (reinterpret_cast(memory.GetDspMemory().data()) + 0x40000u)); return ResultSuccess; }