From 5da93d17bd584fee525a46ba632c9616d34b96b4 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Fri, 5 Apr 2024 19:42:18 +0300 Subject: [PATCH] HLE DSP: More of it --- include/audio/hle_core.hpp | 24 +++++++++++++++++++++++- src/core/audio/hle_core.cpp | 27 +++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/include/audio/hle_core.hpp b/include/audio/hle_core.hpp index 202b9308..f957284d 100644 --- a/include/audio/hle_core.hpp +++ b/include/audio/hle_core.hpp @@ -6,6 +6,27 @@ #include "memory.hpp" namespace Audio { + struct DSPSource { + std::array gain0, gain1, gain2; + + // Audio buffer information + // https://www.3dbrew.org/wiki/DSP_Memory_Region + struct Buffer { + u32 paddr; // Physical address of the buffer + u32 sampleCount; // Total number of samples + u8 adpcmScale; // ADPCM predictor/scale + u8 pad; // Unknown + + std::array previousSamples; // ADPCM y[n-1] and y[n-2] + bool adpcmDirty; + bool looping; + u16 bufferID; + }; + + void reset(); + DSPSource() { reset(); } + }; + class HLE_DSP : public DSPCore { // The audio frame types are public in case we want to use them for unit tests public: @@ -24,6 +45,7 @@ namespace Audio { template using QuadFrame = Frame; + using Source = Audio::DSPSource; private: enum class DSPState : u32 { Off, @@ -61,7 +83,7 @@ namespace Audio { Audio::HLE::SharedMemory& readRegion() { return readRegionIndex() == 0 ? dspRam.region0 : dspRam.region1; } Audio::HLE::SharedMemory& writeRegion() { return readRegionIndex() == 0 ? dspRam.region1 : dspRam.region0; } - StereoFrame generateFrame(); + void generateFrame(StereoFrame& frame); void outputFrame(); public: HLE_DSP(Memory& mem, Scheduler& scheduler, DSPService& dspService) : DSPCore(mem, scheduler, dspService) {} diff --git a/src/core/audio/hle_core.cpp b/src/core/audio/hle_core.cpp index 32697534..65bcb2c6 100644 --- a/src/core/audio/hle_core.cpp +++ b/src/core/audio/hle_core.cpp @@ -1,5 +1,7 @@ #include "audio/hle_core.hpp" +#include + #include "services/dsp.hpp" namespace Audio { @@ -168,7 +170,28 @@ namespace Audio { } void HLE_DSP::outputFrame() { - StereoFrame frame = generateFrame(); - Helpers::panic("HLE DSP: Output frame"); + StereoFrame frame; + generateFrame(frame); + + if (audioEnabled) { + // Wait until we've actually got room to push our frame + while (sampleBuffer.size() + 2 > sampleBuffer.Capacity()) { + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } + + sampleBuffer.push(frame.data(), frame.size()); + } } + + void HLE_DSP::generateFrame(StereoFrame& frame) { + using namespace Audio::HLE; + SharedMemory& read = readRegion(); + SharedMemory& write = writeRegion(); + + for (int source = 0; source < sourceCount; source++) { + Helpers::panic("Panda"); + } + } + + void DSPSource::reset() {} } // namespace Audio