mirror of
https://github.com/Lime3DS/Lime3DS.git
synced 2026-02-10 00:15:32 +00:00
audio_core: Move dsp memory ownership to memory system
This commit is contained in:
parent
109f5fb730
commit
2edc8b4b73
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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]() {
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user