audio_core: Move dsp memory ownership to memory system

This commit is contained in:
PabloMK7 2025-12-21 21:32:53 +01:00
parent 109f5fb730
commit 2edc8b4b73
9 changed files with 19 additions and 39 deletions

View File

@ -86,9 +86,6 @@ public:
*/
virtual void PipeWrite(DspPipe pipe_number, std::span<const u8> buffer) = 0;
/// Returns a reference to the array backing DSP memory
virtual std::array<u8, Memory::DSP_RAM_SIZE>& GetDspMemory() = 0;
/// Sets the handler for the interrupts we trigger
virtual void SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> handler) = 0;

View File

@ -60,8 +60,6 @@ public:
std::size_t GetPipeReadableSize(DspPipe pipe_number) const;
void PipeWrite(DspPipe pipe_number, std::span<const u8> buffer);
std::array<u8, Memory::DSP_RAM_SIZE>& GetDspMemory();
void SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> handler);
@ -81,7 +79,10 @@ private:
DspState dsp_state = DspState::Off;
std::array<std::vector<u8>, num_dsp_pipe> pipe_data{};
HLE::DspMemory dsp_memory;
public:
HLE::DspMemory* dsp_memory;
private:
std::array<HLE::Source, HLE::num_sources> 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<HLE::DspMemory*>(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<const u8> buffer) {
}
}
std::array<u8, Memory::DSP_RAM_SIZE>& DspHle::Impl::GetDspMemory() {
return dsp_memory.raw_memory;
}
void DspHle::Impl::SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> 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<const u8> buffer) {
impl->PipeWrite(pipe_number, buffer);
}
std::array<u8, Memory::DSP_RAM_SIZE>& DspHle::GetDspMemory() {
return impl->GetDspMemory();
}
void DspHle::SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> handler) {
impl->SetInterruptHandler(handler);

View File

@ -37,8 +37,6 @@ public:
std::size_t GetPipeReadableSize(DspPipe pipe_number) const override;
void PipeWrite(DspPipe pipe_number, std::span<const u8> buffer) override;
std::array<u8, Memory::DSP_RAM_SIZE>& GetDspMemory() override;
void SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> handler) override;

View File

@ -403,10 +403,6 @@ void DspLle::PipeWrite(DspPipe pipe_number, std::span<const u8> buffer) {
impl->WritePipe(static_cast<u8>(pipe_number), buffer);
}
std::array<u8, Memory::DSP_RAM_SIZE>& DspLle::GetDspMemory() {
return impl->teakra.GetDspMemory();
}
void DspLle::SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> handler) {
impl->teakra.SetRecvDataHandler(0, [this, handler]() {

View File

@ -31,8 +31,6 @@ public:
std::size_t GetPipeReadableSize(DspPipe pipe_number) const override;
void PipeWrite(DspPipe pipe_number, std::span<const u8> buffer) override;
std::array<u8, Memory::DSP_RAM_SIZE>& GetDspMemory() override;
void SetInterruptHandler(
std::function<void(Service::DSP::InterruptType type, DspPipe pipe)> handler) override;

View File

@ -496,8 +496,6 @@ System::ResultStatus System::Init(Frontend::EmuWindow& emu_window,
dsp_core = std::make_unique<AudioCore::DspLle>(*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

View File

@ -91,14 +91,13 @@ public:
std::unique_ptr<u8[]> fcram = std::make_unique<u8[]>(Memory::FCRAM_N3DS_SIZE);
std::unique_ptr<u8[]> vram = std::make_unique<u8[]>(Memory::VRAM_SIZE);
std::unique_ptr<u8[]> n3ds_extra_ram = std::make_unique<u8[]>(Memory::N3DS_EXTRA_RAM_SIZE);
std::unique_ptr<u8[]> dsp_ram = std::make_unique<u8[]>(Memory::DSP_RAM_SIZE);
Core::System& system;
std::shared_ptr<PageTable> current_page_table = nullptr;
RasterizerCacheMarker cache_marker;
std::vector<std::shared_ptr<PageTable>> page_table_list;
AudioCore::DspInterface* dsp = nullptr;
std::shared_ptr<BackingMem> fcram_mem;
std::shared_ptr<BackingMem> vram_mem;
std::shared_ptr<BackingMem> 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<u8, DSP_RAM_SIZE> MemorySystem::GetDspMemory() const {
return std::span<u8, DSP_RAM_SIZE>{impl->dsp_ram.get(), DSP_RAM_SIZE};
}
} // namespace Memory

View File

@ -641,7 +641,7 @@ public:
/// Unregisters page table for rasterizer cache marking
void UnregisterPageTable(std::shared_ptr<PageTable> page_table);
void SetDSP(AudioCore::DspInterface& dsp);
std::span<u8, DSP_RAM_SIZE> GetDspMemory() const;
void RasterizerFlushVirtualRegion(VAddr start, u32 size, FlushMode mode);

View File

@ -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<u16*>(
(dsp_address << 1) + (reinterpret_cast<uintptr_t>(dsp->GetDspMemory().data()) + 0x40000u));
(dsp_address << 1) +
(reinterpret_cast<uintptr_t>(memory.GetDspMemory().data()) + 0x40000u));
return ResultSuccess;
}