From 37f9f5d894cedd752e28683d0af782b55c61f3f1 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sat, 6 Apr 2024 00:54:15 +0300 Subject: [PATCH] HLE DSP: Track voice status better --- include/audio/hle_core.hpp | 3 +++ src/core/audio/hle_core.cpp | 53 ++++++++++++++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/include/audio/hle_core.hpp b/include/audio/hle_core.hpp index 75d02bca..d4d72b62 100644 --- a/include/audio/hle_core.hpp +++ b/include/audio/hle_core.hpp @@ -8,6 +8,8 @@ namespace Audio { struct DSPSource { std::array gain0, gain1, gain2; + u16 syncCount; + bool enabled; // Audio buffer information // https://www.3dbrew.org/wiki/DSP_Memory_Region @@ -86,6 +88,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; } + void updateSourceConfig(Source& source, HLE::SourceConfiguration::Configuration& config); void generateFrame(StereoFrame& frame); void outputFrame(); public: diff --git a/src/core/audio/hle_core.cpp b/src/core/audio/hle_core.cpp index 6b0a32c9..b27dd10b 100644 --- a/src/core/audio/hle_core.cpp +++ b/src/core/audio/hle_core.cpp @@ -199,11 +199,56 @@ namespace Audio { SharedMemory& read = readRegion(); SharedMemory& write = writeRegion(); - for (int source = 0; source < sourceCount; source++) { - //updateSourceConfig(sources[source]); - Helpers::panic("Panda"); + for (int i = 0; i < sourceCount; i++) { + // Update source configuration from the read region of shared memory + auto& config = read.sourceConfigurations.config[i]; + auto& source = sources[i]; + updateSourceConfig(source, config); + + // Generate audio + + // Update write region of shared memory + auto& status = write.sourceStatuses.status[i]; + status.isEnabled = source.enabled; + status.syncCount = source.syncCount; + //status.lastBufferID=0,status.currentBufferID = 1; status.currentBufferIDDirty = 1; + //status.bufferPosition = } } - void DSPSource::reset() {} + void HLE_DSP::updateSourceConfig(Source& source, HLE::SourceConfiguration::Configuration& config) { + // Check if the any dirty bit is set, otherwise exit early + if (!config.dirtyRaw) { + return; + } + + if (config.enableDirty) { + config.enableDirty = 0; + source.enabled = config.enable != 0; + + printf("Voice %d enable set to %d\n", source.index, source.enabled); + } + + if (config.syncCountDirty) { + config.syncCountDirty = 0; + source.syncCount = config.syncCount; + } + + if (config.resetFlag) { + config.resetFlag = 0; + printf("Reset voice %d\n", source.index); + } + + if (config.partialResetFlag) { + config.partialResetFlag = 0; + printf("Partially reset voice %d\n", source.index); + } + + config.dirtyRaw = 0; + } + + void DSPSource::reset() { + enabled = false; + syncCount = 0; + } } // namespace Audio