mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-05-24 09:44:50 +00:00
rabbit review
This commit is contained in:
parent
082047c605
commit
8ce886883e
2 changed files with 62 additions and 11 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include <deque>
|
||||
#include <regex>
|
||||
#include <charconv>
|
||||
#include "dynos.cpp.h"
|
||||
extern "C" {
|
||||
#include "engine/graph_node.h"
|
||||
|
|
@ -10,6 +11,23 @@ static std::deque<PackData>& 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<u8>(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<u8>(std::stoi(match[1].str()));
|
||||
u8 bankId = static_cast<u8>(std::stoi(match[2].str()));
|
||||
u8 defaultVolume = static_cast<u8>(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: <name>_<sequenceId>_<bankId>_<defaultVolume>.m64): '%s.m64'",
|
||||
_SeqName.begin()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue