From 8ce886883eaa984e770f8e335b0d06b35bb29dab Mon Sep 17 00:00:00 2001 From: Isaac0-dev <62234577+Isaac0-dev@users.noreply.github.com> Date: Mon, 18 May 2026 00:47:38 +1000 Subject: [PATCH] rabbit review --- data/dynos_mgr_audio.cpp | 35 ++++++++++++++++++++++++++++++----- data/dynos_mgr_pack.cpp | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/data/dynos_mgr_audio.cpp b/data/dynos_mgr_audio.cpp index 2190fc835..d55cece98 100644 --- a/data/dynos_mgr_audio.cpp +++ b/data/dynos_mgr_audio.cpp @@ -40,12 +40,12 @@ void DynOS_Audio_ResetMods() { audio_init(); for (s32 i = 0; i < MAX_AUDIO_OVERRIDE; i++) { #ifdef VERSION_EU - if (!sAudioOverrides[i].pack.enabled || sAudioOverrides[i].mod.enabled) { + if (!sAudioOverrides[i].pack.enabled && sAudioOverrides[i].mod.enabled) { if (i >= SEQ_EVENT_CUTSCENE_LAKITU) { sBackgroundMusicDefaultVolume[i] = 75; - return; + } else { + sBackgroundMusicDefaultVolume[i] = sBackgroundMusicDefaultVolumeDefault[i]; } - sBackgroundMusicDefaultVolume[i] = sBackgroundMusicDefaultVolumeDefault[i]; } else if (sAudioOverrides[i].pack.enabled) { // keep pack override default volume sBackgroundMusicDefaultVolume[i] = sAudioOverrides[i].pack.defaultVolume; @@ -68,6 +68,7 @@ static bool DynOS_Audio_LoadEntry(AudioOverrideEntry* aOverride, u8 aSequenceId, if (gOverrideBank > -1) { aOverride->bank = gOverrideBank; } if (aOverride->loaded) { + sound_set_background_music_default_volume(aSequenceId, aOverride->defaultVolume); *aSeqData = aOverride->buffer; *aBankId = aOverride->bank; return true; @@ -149,20 +150,44 @@ static void DynOS_Audio_HotSwapIfActive(u8 aSequenceId) { void DynOS_Audio_ActivateOverride(AudioOverrideEntry* aOverride) { if (aOverride == NULL || aOverride->enabled) { return; } aOverride->enabled = true; + sound_set_background_music_default_volume(aOverride->sequenceId, aOverride->defaultVolume); DynOS_Audio_HotSwapIfActive(aOverride->sequenceId); } void DynOS_Audio_DeactivateOverride(AudioOverrideEntry* aOverride) { if (aOverride == NULL || !aOverride->enabled) { return; } aOverride->enabled = false; + if (sAudioOverrides[aOverride->sequenceId].mod.enabled) { + sound_set_background_music_default_volume( + aOverride->sequenceId, + sAudioOverrides[aOverride->sequenceId].mod.defaultVolume + ); + } else { + sound_reset_background_music_default_volume(aOverride->sequenceId); + } DynOS_Audio_HotSwapIfActive(aOverride->sequenceId); } AudioOverrideEntry* DynOS_Audio_CreateOverride(u8 aSequenceId, u8 aBankId, u8 aDefaultVolume, const char *aFilepath, bool aIsPack) { - if (aSequenceId >= MAX_AUDIO_OVERRIDE) { return NULL; } + if (aSequenceId >= MAX_AUDIO_OVERRIDE) { + PrintError("Invalid sequenceId while creating override: %d", aSequenceId); + return NULL; + } + + if (aBankId >= 64) { + PrintError("Invalid bankId while creating override: %d", aBankId); + return NULL; + } + AudioOverrideEntry* override = aIsPack ? &sAudioOverrides[aSequenceId].pack : &sAudioOverrides[aSequenceId].mod; - if (override->enabled) { audio_init(); } + if (override->enabled) { + if (aIsPack) { + PrintError("Pack sequence override already exists for sequence ID %d", aSequenceId); + return NULL; + } + audio_init(); + } DynOS_Audio_ResetEntry(override); Print("Loading audio: %s", aFilepath); override->sequenceId = aSequenceId; diff --git a/data/dynos_mgr_pack.cpp b/data/dynos_mgr_pack.cpp index 6e948d72a..09b184de4 100644 --- a/data/dynos_mgr_pack.cpp +++ b/data/dynos_mgr_pack.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "dynos.cpp.h" extern "C" { #include "engine/graph_node.h" @@ -10,6 +11,23 @@ static std::deque& DynosPacks() { return sDynosPacks; } +static bool ParseU8(const std::string& s, u8& out) { + unsigned int value = 0; + auto [ptr, ec] = std::from_chars(s.data(), s.data() + s.size(), value); + + // Reject: + // - parse errors + // - overflow + // - trailing junk + // - values outside u8 range + if (ec != std::errc() || ptr != s.data() + s.size() || value > 0xFF) { + return false; + } + + out = static_cast(value); + return true; +} + static void ScanPackBins(struct PackData* aPack) { DIR *_PackDir = opendir(aPack->mPath.c_str()); if (!_PackDir) { return; } @@ -45,13 +63,21 @@ static void ScanPackBins(struct PackData* aPack) { std::regex re(".*_(\\d+)_(\\d+)_(\\d+)$"); std::smatch match; if (std::regex_match(seqName, match, re) && match.size() == 4) { - u8 sequenceId = static_cast(std::stoi(match[1].str())); - u8 bankId = static_cast(std::stoi(match[2].str())); - u8 defaultVolume = static_cast(std::stoi(match[3].str())); - AudioOverrideEntry* audioOverride = DynOS_Audio_CreateOverride(sequenceId, bankId, defaultVolume, _FileName.c_str(), true); - if (audioOverride) { - aPack->mAudioOverrides.push_back(audioOverride); + u8 sequenceId, bankId, defaultVolume; + if (ParseU8(match[1].str(), sequenceId) && + ParseU8(match[2].str(), bankId) && + ParseU8(match[3].str(), defaultVolume) + ) { + AudioOverrideEntry* audioOverride = DynOS_Audio_CreateOverride(sequenceId, bankId, defaultVolume, _FileName.c_str(), true); + if (audioOverride) { + aPack->mAudioOverrides.push_back(audioOverride); + } } + } else { + PrintError( + "Invalid sequence override filename (expected format: ___.m64): '%s.m64'", + _SeqName.begin() + ); } } }