From 7f568a3c195d150e15241d1e92516616de00212b Mon Sep 17 00:00:00 2001 From: Weiyi Wang Date: Thu, 6 Dec 2018 07:18:26 -0500 Subject: [PATCH] DSP/HLE: move implementation of RecvData to audio_core, behind common interface --- src/audio_core/dsp_interface.h | 9 +++++++-- src/audio_core/hle/hle.cpp | 23 +++++++++++++++++++++-- src/audio_core/hle/hle.h | 3 +-- src/core/hle/service/dsp/dsp_dsp.cpp | 22 +++------------------- src/core/hle/service/dsp/dsp_dsp.h | 2 ++ 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/audio_core/dsp_interface.h b/src/audio_core/dsp_interface.h index aef57db87..b1188ab11 100644 --- a/src/audio_core/dsp_interface.h +++ b/src/audio_core/dsp_interface.h @@ -32,8 +32,13 @@ public: DspInterface& operator=(const DspInterface&) = delete; DspInterface& operator=(DspInterface&&) = delete; - /// Get the state of the DSP - virtual DspState GetDspState() const = 0; + /** + * Reads data from one of three DSP registers + * @note this function blocks until the data is available + * @param register_number the index of the register to read + * @returns the value of the register + */ + virtual u16 RecvData(u32 register_number) = 0; /** * Reads `length` bytes from the DSP pipe identified with `pipe_number`. diff --git a/src/audio_core/hle/hle.cpp b/src/audio_core/hle/hle.cpp index 4fa4145e2..eaf5c8c27 100644 --- a/src/audio_core/hle/hle.cpp +++ b/src/audio_core/hle/hle.cpp @@ -29,6 +29,7 @@ public: DspState GetDspState() const; + u16 RecvData(u32 register_number); std::vector PipeRead(DspPipe pipe_number, u32 length); std::size_t GetPipeReadableSize(DspPipe pipe_number) const; void PipeWrite(DspPipe pipe_number, const std::vector& buffer); @@ -93,6 +94,24 @@ DspState DspHle::Impl::GetDspState() const { return dsp_state; } +u16 DspHle::Impl::RecvData(u32 register_number) { + ASSERT_MSG(register_number == 0, "Unknown register_number {}", register_number); + + // Application reads this after requesting DSP shutdown, to verify the DSP has indeed shutdown + // or slept. + + switch (GetDspState()) { + case AudioCore::DspState::On: + return 0; + case AudioCore::DspState::Off: + case AudioCore::DspState::Sleeping: + return 1; + default: + UNREACHABLE(); + break; + } +} + std::vector DspHle::Impl::PipeRead(DspPipe pipe_number, u32 length) { const std::size_t pipe_index = static_cast(pipe_number); @@ -342,8 +361,8 @@ void DspHle::Impl::AudioTickCallback(s64 cycles_late) { DspHle::DspHle(Memory::MemorySystem& memory) : impl(std::make_unique(*this, memory)) {} DspHle::~DspHle() = default; -DspState DspHle::GetDspState() const { - return impl->GetDspState(); +u16 DspHle::RecvData(u32 register_number) { + return impl->RecvData(register_number); } std::vector DspHle::PipeRead(DspPipe pipe_number, u32 length) { diff --git a/src/audio_core/hle/hle.h b/src/audio_core/hle/hle.h index 70abddbd5..cc225b3d5 100644 --- a/src/audio_core/hle/hle.h +++ b/src/audio_core/hle/hle.h @@ -24,8 +24,7 @@ public: explicit DspHle(Memory::MemorySystem& memory); ~DspHle(); - DspState GetDspState() const override; - + u16 RecvData(u32 register_number) override; std::vector PipeRead(DspPipe pipe_number, u32 length) override; std::size_t GetPipeReadableSize(DspPipe pipe_number) const override; void PipeWrite(DspPipe pipe_number, const std::vector& buffer) override; diff --git a/src/core/hle/service/dsp/dsp_dsp.cpp b/src/core/hle/service/dsp/dsp_dsp.cpp index b15e670d3..8dc31d08d 100644 --- a/src/core/hle/service/dsp/dsp_dsp.cpp +++ b/src/core/hle/service/dsp/dsp_dsp.cpp @@ -24,26 +24,9 @@ void DSP_DSP::RecvData(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp(ctx, 0x01, 1, 0); const u32 register_number = rp.Pop(); - ASSERT_MSG(register_number == 0, "Unknown register_number {}", register_number); - - // Application reads this after requesting DSP shutdown, to verify the DSP has indeed shutdown - // or slept. - IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); rb.Push(RESULT_SUCCESS); - - switch (Core::DSP().GetDspState()) { - case AudioCore::DspState::On: - rb.Push(0); - break; - case AudioCore::DspState::Off: - case AudioCore::DspState::Sleeping: - rb.Push(1); - break; - default: - UNREACHABLE(); - break; - } + rb.Push(system.DSP().RecvData(register_number)); LOG_DEBUG(Service_DSP, "register_number={}", register_number); } @@ -350,7 +333,8 @@ bool DSP_DSP::HasTooManyEventsRegistered() const { return number >= max_number_of_interrupt_events; } -DSP_DSP::DSP_DSP(Core::System& system) : ServiceFramework("dsp::DSP", DefaultMaxSessions) { +DSP_DSP::DSP_DSP(Core::System& system) + : ServiceFramework("dsp::DSP", DefaultMaxSessions), system(system) { static const FunctionInfo functions[] = { // clang-format off {0x00010040, &DSP_DSP::RecvData, "RecvData"}, diff --git a/src/core/hle/service/dsp/dsp_dsp.h b/src/core/hle/service/dsp/dsp_dsp.h index 7226aeeac..78651bad8 100644 --- a/src/core/hle/service/dsp/dsp_dsp.h +++ b/src/core/hle/service/dsp/dsp_dsp.h @@ -245,6 +245,8 @@ private: /// Checks if we are trying to register more than 6 events bool HasTooManyEventsRegistered() const; + Core::System& system; + Kernel::SharedPtr semaphore_event; Kernel::SharedPtr interrupt_zero = nullptr; /// Currently unknown purpose