summaryrefslogtreecommitdiff
path: root/soh/src/code
diff options
context:
space:
mode:
authorKevin Alexis Contreras <36680385+KiritoDv@users.noreply.github.com>2022-06-13 11:41:43 -0500
committerKevin Alexis Contreras <36680385+KiritoDv@users.noreply.github.com>2022-06-13 11:41:43 -0500
commit8b63cf93d812ac3a178105471fdb7423d9ae7aea (patch)
treef8549d96aea665b6bcb4e92cdbcb0f437c6be4de /soh/src/code
parent8a7aa5fa53d687bfe0a54f84d55a1a70ab22543e (diff)
parent96a18391a82092d4092fe495501192ba7fe3781e (diff)
Updated zapd_audio_support on zelda64
Diffstat (limited to 'soh/src/code')
-rw-r--r--soh/src/code/audio_data.c6
-rw-r--r--soh/src/code/audio_init_params.c35
-rw-r--r--soh/src/code/audio_load.c157
-rw-r--r--soh/src/code/audio_playback.c13
-rw-r--r--soh/src/code/audio_seqplayer.c29
-rw-r--r--soh/src/code/audio_synthesis.c3
-rw-r--r--soh/src/code/code_800F9280.c6
-rw-r--r--soh/src/code/z_kankyo.c11
8 files changed, 159 insertions, 101 deletions
diff --git a/soh/src/code/audio_data.c b/soh/src/code/audio_data.c
index 540eedca8..5fe49139b 100644
--- a/soh/src/code/audio_data.c
+++ b/soh/src/code/audio_data.c
@@ -544,16 +544,10 @@ u8 gDefaultShortNoteGateTimeTable[] = {
};
AdsrEnvelope gDefaultEnvelope[] = {
- // OTRTODO: Byteswapped manually for quick audio support.
{ 0x0100, 0x007D },
{ 0xE803, 0x007D },
{ 0xFFFF, 0x0000 },
{ 0x0000, 0x0000 },
- /* { 1, 32000 },
- { 1000, 32000 },
- { -1, 0 },
- { 0, 0 },
- */
};
NoteSubEu gZeroNoteSub = { 0 };
diff --git a/soh/src/code/audio_init_params.c b/soh/src/code/audio_init_params.c
index fa8f17a07..b4b8890b4 100644
--- a/soh/src/code/audio_init_params.c
+++ b/soh/src/code/audio_init_params.c
@@ -70,23 +70,24 @@ ReverbSettings D_80133420[][3] = {
},
};
+// OTRTODO
AudioSpec gAudioSpecs[18] = {
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x4000, 0x2880, 0, 0, 0 },
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x2800, 0x2880, 0, 0, 0 },
- { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x4000, 0, 0, 0, 0 },
- { 32000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x4000, 0x4800, 0, 0, 0 },
- { 32000, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x4000, 0x2880, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[1], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 23, 4, 0, 0, 2, D_80133420[4], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 23, 4, 0, 0, 2, D_80133420[5], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[6], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[7], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[9], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 23, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 28, 3, 0, 0, 2, D_80133420[10], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x2800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0x4800, 0, 0x4000, 0, 0, 0, 0 },
+ { 44000, 1, 28, 3, 0, 0, 1, D_80133420[11], 0x300, 0x200, 0x7FFF, 0, 0, 0, 0x4000, 0x4800, 0, 0, 0 },
+ { 44000, 1, 22, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 22, 4, 0, 0, 2, D_80133420[8], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
+ { 44000, 1, 16, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
{ 22050, 1, 24, 4, 0, 0, 2, D_80133420[0], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3800, 0x2880, 0, 0, 0 },
- { 32000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3600, 0x2600, 0, 0, 0 },
+ { 44000, 1, 24, 4, 0, 0, 2, D_80133420[2], 0x300, 0x200, 0x7FFF, 0x7F0, 0xE00, 0, 0x3600, 0x2600, 0, 0, 0 },
};
diff --git a/soh/src/code/audio_load.c b/soh/src/code/audio_load.c
index b0e538334..4cd38ed28 100644
--- a/soh/src/code/audio_load.c
+++ b/soh/src/code/audio_load.c
@@ -76,6 +76,8 @@ void* sUnusedHandler = NULL;
s32 gAudioContextInitalized = false;
+char* sequenceMap[512];
+
uintptr_t fontStart;
uint32_t fontOffsets[8192];
@@ -388,6 +390,7 @@ SoundFontData* AudioLoad_SyncLoadSeqFonts(s32 seqId, u32* outDefaultFontId) {
while (numFonts > 0) {
fontId = gAudioContext.sequenceFontTable[index++];
+
font = AudioLoad_SyncLoadFont(fontId);
numFonts--;
}
@@ -480,13 +483,26 @@ void AudioLoad_AsyncLoadFont(s32 fontId, s32 arg1, s32 retData, OSMesgQueue* ret
u8* AudioLoad_GetFontsForSequence(s32 seqId, u32* outNumFonts) {
s32 index;
- index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
+ if (!gUseLegacySD)
+ {
+ if (seqId == 255)
+ return NULL;
- *outNumFonts = gAudioContext.sequenceFontTable[index++];
- if (*outNumFonts == 0) {
- return NULL;
+ SequenceData sDat = ResourceMgr_LoadSeqByName(sequenceMap[seqId]);
+
+ if (sDat.numFonts == 0)
+ return NULL;
+
+ return sDat.fonts;
+ } else {
+ index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
+
+ *outNumFonts = gAudioContext.sequenceFontTable[index++];
+ if (*outNumFonts == 0) {
+ return NULL;
+ }
+ return &gAudioContext.sequenceFontTable[index];
}
- return &gAudioContext.sequenceFontTable[index];
}
void AudioLoad_DiscardSeqFonts(s32 seqId) {
@@ -569,16 +585,27 @@ s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2) {
AudioSeq_SequencePlayerDisable(seqPlayer);
fontId = 0xFF;
- index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
- numFonts = gAudioContext.sequenceFontTable[index++];
- while (numFonts > 0) {
- fontId = gAudioContext.sequenceFontTable[index++];
+ if (gUseLegacySD) {
+ index = ((u16*)gAudioContext.sequenceFontTable)[seqId];
+ numFonts = gAudioContext.sequenceFontTable[index++];
- // if (gUseLegacySD)
- AudioLoad_SyncLoadFont(fontId);
+ while (numFonts > 0) {
+ fontId = gAudioContext.sequenceFontTable[index++];
- numFonts--;
+ AudioLoad_SyncLoadFont(fontId); // NOTE: If this is commented out, then enemies will play child link sounds...
+
+ numFonts--;
+ }
+ } else {
+ SequenceData seqData2 = ResourceMgr_LoadSeqByName(sequenceMap[seqId]);
+
+ for (int i = 0; i < seqData2.numFonts; i++)
+ {
+ fontId = seqData2.fonts[i];
+ AudioLoad_SyncLoadFont(fontId); // NOTE: If this is commented out, then enemies will play child link sounds...
+ numFonts--;
+ }
}
seqData = AudioLoad_SyncLoadSeq(seqId);
@@ -660,7 +687,6 @@ SoundFontData* AudioLoad_SyncLoadFont(u32 fontId) {
s32 didAllocate;
RelocInfo relocInfo;
s32 realFontId = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId);
- //s32 realFontId = fontId;
if (gAudioContext.fontLoadStatus[realFontId] == 1) {
return NULL;
@@ -722,26 +748,20 @@ uintptr_t AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) {
char* seqData = 0;
SoundFont* fnt;
- if (!gUseLegacySD && tableType == SEQUENCE_TABLE)
- {
- seqData = ResourceMgr_LoadSeqByID(id);
- size = ResourceMgr_GetSeqSizeByID(id);
- size -= 2;
- medium = seqData[0];
- cachePolicy = seqData[1];
+ if (!gUseLegacySD && tableType == SEQUENCE_TABLE) {
+ SequenceData sData = ResourceMgr_LoadSeqByName(sequenceMap[id]);
+ seqData = sData.seqData;
+ size = sData.seqDataSize;
+ medium = sData.medium;
+ cachePolicy = sData.cachePolicy;
romAddr = 0;
- seqData += 2;
- }
- else if (!gUseLegacySD && tableType == FONT_TABLE)
- {
+ } else if (!gUseLegacySD && tableType == FONT_TABLE) {
fnt = ResourceMgr_LoadAudioSoundFont(id);
size = sizeof(SoundFont);
medium = 2;
cachePolicy = 0;
romAddr = 0;
- }
- else
- {
+ } else {
table = AudioLoad_GetLoadTable(tableType);
size = table->entries[realId].size;
size = ALIGN16(size);
@@ -1181,7 +1201,6 @@ s32 AudioLoad_AssertValidAddr(uintptr_t ramAddr, uintptr_t startAddr, size_t siz
#define BASE_ROM_OFFSET(x) (uintptr_t)((uintptr_t)(x) + (uintptr_t)(romAddr))
void AudioLoad_InitSwapFontSampleHeaders(SoundFontSample* sample, uintptr_t romAddr) {
- // OTRTODO: This will be removed when we actually extract the data.
size_t maxSoundFontSize = 0x3AA0; // soundFont 0 is the largest size at 0x3AA0
AdpcmLoop* loop;
AdpcmBook* book;
@@ -1390,12 +1409,21 @@ void AudioLoad_Init(void* heap, size_t heapSize) {
uintptr_t bankStart = ResourceMgr_LoadFileRaw(_AudiobankSegmentRomStart);
uintptr_t tableStart = ResourceMgr_LoadFileRaw(_AudiotableSegmentRomStart);
+ // If we have the old audioseq files present (and this is a 32-bit build), use the legacy audio system
+ if (seqStart != NULL && bankStart != NULL && tableStart != NULL)
+ gUseLegacySD = true;
+
fontStart = bankStart;
AudioLoad_InitTable(gAudioContext.sequenceTable, seqStart, 0);
AudioLoad_InitTable(gAudioContext.soundFontTable, bankStart, 0);
AudioLoad_InitTable(gAudioContext.sampleBankTable, tableStart, 0);
- numFonts = gAudioContext.soundFontTable->numEntries;
+
+ if (gUseLegacySD)
+ numFonts = gAudioContext.soundFontTable->numEntries;
+ else
+ numFonts = 0x26; // OTRTODO: Count the number of soundfonts that are inside the OTR(s)
+
gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont));
if (gUseLegacySD) {
@@ -1404,6 +1432,23 @@ void AudioLoad_Init(void* heap, size_t heapSize) {
}
AudioLoad_InitSwapFont();
+ } else {
+ int seqListSize = 0;
+ char** seqList = ResourceMgr_ListFiles("audio/sequences*", &seqListSize);
+
+ for (int i = 0; i < seqListSize; i++)
+ {
+ SequenceData sDat = ResourceMgr_LoadSeqByName(seqList[i]);
+
+ char* str = malloc(strlen(seqList[i]) + 1);
+ strcpy(str, seqList[i]);
+
+ sequenceMap[sDat.seqNumber] = str;
+ }
+
+ free(seqList);
+
+ int bp = 0;
}
if (temp_v0_3 = AudioHeap_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.permanentPoolSize), temp_v0_3 == NULL) {
@@ -1424,7 +1469,6 @@ void AudioLoad_InitSlowLoads(void) {
s32 AudioLoad_SlowLoadSample(s32 fontId, s32 instId, s8* isDone) {
SoundFontSample* sample;
AudioSlowLoad* slowLoad;
-
sample = AudioLoad_GetFontSample(fontId, instId);
if (sample == NULL) {
*isDone = 0;
@@ -1596,11 +1640,13 @@ s32 AudioLoad_SlowLoadSeq(s32 seqId, u8* ramAddr, s8* isDone) {
slowLoad->sample.sampleAddr = NULL;
slowLoad->isDone = isDone;
- if (!gUseLegacySD) {
- char* seqData = ResourceMgr_LoadSeqByID(seqId);
- size = ResourceMgr_GetSeqSizeByID(seqId) - 2;
- slowLoad->curDevAddr = seqData + 2;
- slowLoad->medium = seqData[0];
+ if (!gUseLegacySD)
+ {
+ SequenceData sData = ResourceMgr_LoadSeqByName(sequenceMap[seqId]);
+ char* seqData = sData.seqData;
+ size = sData.seqDataSize;
+ slowLoad->curDevAddr = seqData;
+ slowLoad->medium = sData.medium;
} else {
size = seqTable->entries[seqId].size;
size = ALIGN16(size);
@@ -1825,41 +1871,22 @@ void AudioLoad_AsyncDmaUnkMedium(uintptr_t devAddr, uintptr_t ramAddr, size_t si
#define RELOC(v, base) (reloc = (uintptr_t)((uintptr_t)(v) + (uintptr_t)(base)))
void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo, int fontId) {
- // OTRTODO: This is hack to detect whether or not the sample has been relocated.
size_t maxSoundBankSize = 0x3EB2A0; // sample bank 0 is largest size at 0x3EB2A0
- if ((uintptr_t)mem <= maxSoundBankSize) {
- // OTRTODO: This can be removed once we have properly byteswapped files on the disk.
- assert("mem for sound font bank is too low.");
+ if (gUseLegacySD)
+ {
+ // NOTE: This is hack to detect whether or not the sample has been relocated.
+ if ((uintptr_t)mem <= maxSoundBankSize) {
+ assert("mem for sound font bank is too low.");
+ }
}
SoundFontSample* sample;
void* reloc;
- // OTRTODO: Seems precarious to assume the RAM is never <= 0x3EB2A0, but it largely works.
- if ((uintptr_t)sound->sample < maxSoundBankSize || !gUseLegacySD)
- {
+ // NOTE: Seems precarious to assume the RAM is never <= 0x3EB2A0, but it largely works.
+ if ((uintptr_t)sound->sample < maxSoundBankSize || !gUseLegacySD) {
if (!gUseLegacySD) {
SoundFontSample* sample2 = sound;
-
- if (sample2->unk_bit25 != 1)
- {
- //if (sample2->size == 0x5CC8)
- //{
- // switch (sample2->medium) {
- // case 0:
- // sample2->medium = relocInfo->medium1;
- // break;
- // case 1:
- // sample2->medium = relocInfo->medium2;
- // break;
- // }
-
- // sample2->unk_bit25 = 1;
- // if (sample2->unk_bit26 && (sample2->medium != MEDIUM_RAM)) {
- // // gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample2;
- // }
- //}
- }
} else {
sample = sound->sample = RELOC(sound->sample, mem);
@@ -2112,8 +2139,10 @@ s32 AudioLoad_GetSamplesForFont(s32 fontId, SoundFontSample** sampleSet) {
void AudioLoad_AddUsedSample(SoundFontSound* sound) {
SoundFontSample* sample = sound->sample;
- if ((sample->size != 0) && (sample->unk_bit26) && (sample->medium != MEDIUM_RAM)) {
- gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample;
+ if (sample != NULL) {
+ if ((sample->size != 0) && (sample->unk_bit26) && (sample->medium != MEDIUM_RAM)) {
+ gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample;
+ }
}
}
diff --git a/soh/src/code/audio_playback.c b/soh/src/code/audio_playback.c
index 5d43118b8..9992eee3d 100644
--- a/soh/src/code/audio_playback.c
+++ b/soh/src/code/audio_playback.c
@@ -286,7 +286,18 @@ void Audio_ProcessNotes(void) {
}
subAttrs.frequency *= playbackState->vibratoFreqScale * playbackState->portamentoFreqScale;
- subAttrs.frequency *= gAudioContext.audioBufferParameters.resampleRate;
+
+ f32 resampRate = gAudioContext.audioBufferParameters.resampleRate;
+
+ if (!gUseLegacySD && !noteSubEu2->bitField1.isSyntheticWave && noteSubEu2->sound.soundFontSound != NULL &&
+ noteSubEu2->sound.soundFontSound->sample != NULL &&
+ noteSubEu2->sound.soundFontSound->sample->sampleRateMagicValue == 'RIFF') {
+ resampRate = CALC_RESAMPLE_FREQ(noteSubEu2->sound.soundFontSound->sample->sampleRate);
+ }
+
+ subAttrs.frequency *= resampRate;
+
+
subAttrs.velocity *= scale;
Audio_InitNoteSub(note, noteSubEu2, &subAttrs);
noteSubEu->bitField1.bookOffset = bookOffset;
diff --git a/soh/src/code/audio_seqplayer.c b/soh/src/code/audio_seqplayer.c
index 52d14a9a1..785a8b212 100644
--- a/soh/src/code/audio_seqplayer.c
+++ b/soh/src/code/audio_seqplayer.c
@@ -3,6 +3,9 @@
#include "ultra64.h"
#include "global.h"
+extern bool gUseLegacySD;
+extern char* sequenceMap[512];
+
#define PORTAMENTO_IS_SPECIAL(x) ((x).mode & 0x80)
#define PORTAMENTO_MODE(x) ((x).mode & ~0x80)
#define PORTAMENTO_MODE_1 1
@@ -939,7 +942,7 @@ u8 AudioSeq_GetInstrument(SequenceChannel* channel, u8 instId, Instrument** inst
return 0;
}
- if (inst->envelope != NULL)
+ if (inst->envelope != NULL)
{
adsr->envelope = inst->envelope;
adsr->releaseRate = (inst->releaseRate);
@@ -1060,9 +1063,14 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
command = (u8)parameters[0];
if (seqPlayer->defaultFont != 0xFF) {
- offset = ((u16*)gAudioContext.sequenceFontTable)[seqPlayer->seqId];
- lowBits = gAudioContext.sequenceFontTable[offset];
- command = gAudioContext.sequenceFontTable[offset + lowBits - result];
+ if (gUseLegacySD) {
+ offset = ((u16*)gAudioContext.sequenceFontTable)[seqPlayer->seqId];
+ lowBits = gAudioContext.sequenceFontTable[offset];
+ command = gAudioContext.sequenceFontTable[offset + lowBits - result];
+ } else {
+ SequenceData sDat = ResourceMgr_LoadSeqByName(sequenceMap[seqPlayer->seqId]);
+ command = sDat.fonts[sDat.numFonts - result - 1];
+ }
}
if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, command)) {
@@ -1171,9 +1179,14 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
command = (u8)parameters[0];
if (seqPlayer->defaultFont != 0xFF) {
- offset = ((u16*)gAudioContext.sequenceFontTable)[seqPlayer->seqId];
- lowBits = gAudioContext.sequenceFontTable[offset];
- command = gAudioContext.sequenceFontTable[offset + lowBits - result];
+ if (gUseLegacySD) {
+ offset = ((u16*)gAudioContext.sequenceFontTable)[seqPlayer->seqId];
+ lowBits = gAudioContext.sequenceFontTable[offset];
+ command = gAudioContext.sequenceFontTable[offset + lowBits - result];
+ } else {
+ SequenceData sDat = ResourceMgr_LoadSeqByName(sequenceMap[seqPlayer->seqId]);
+ command = sDat.fonts[sDat.numFonts - result - 1];
+ }
}
if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, command)) {
@@ -1330,14 +1343,12 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
break;
case 0xB2:
offset = (u16)parameters[0];
- // OTRTODO: Byteswap added for quick audio
channel->unk_22 = BOMSWAP16(*(u16*)(seqPlayer->seqData + (uintptr_t)(offset + scriptState->value * 2)));
break;
case 0xB4:
channel->dynTable = (void*)&seqPlayer->seqData[channel->unk_22];
break;
case 0xB5:
- // OTRTODO: Byteswap added for quick audio
channel->unk_22 = BOMSWAP16(((u16*)(channel->dynTable))[scriptState->value]);
break;
case 0xB6:
diff --git a/soh/src/code/audio_synthesis.c b/soh/src/code/audio_synthesis.c
index 4b30e8c7d..1d8522c77 100644
--- a/soh/src/code/audio_synthesis.c
+++ b/soh/src/code/audio_synthesis.c
@@ -561,6 +561,9 @@ Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* cmd, s32 updat
NoteSubEu* noteSubEu2;
s32 unk14;
+ if (aiBufLen == 0)
+ return;
+
t = gAudioContext.numNotes * updateIndex;
count = 0;
if (gAudioContext.numSynthesisReverbs == 0) {
diff --git a/soh/src/code/code_800F9280.c b/soh/src/code/code_800F9280.c
index e23ede0e9..6ca2ad75d 100644
--- a/soh/src/code/code_800F9280.c
+++ b/soh/src/code/code_800F9280.c
@@ -363,7 +363,11 @@ void Audio_ProcessSeqCmd(u32 cmd) {
}
}
-void Audio_QueueSeqCmd(u32 cmd) {
+extern f32 D_80130F24;
+extern f32 D_80130F28;
+
+void Audio_QueueSeqCmd(u32 cmd)
+{
sAudioSeqCmds[sSeqCmdWrPos++] = cmd;
}
diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c
index 9f7518374..6f1fc0c8f 100644
--- a/soh/src/code/z_kankyo.c
+++ b/soh/src/code/z_kankyo.c
@@ -2093,9 +2093,14 @@ void func_80075B44(GlobalContext* globalCtx) {
case 7:
Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_CRITTER_1 << 4 | NATURE_CHANNEL_CRITTER_3,
CHANNEL_IO_PORT_1, 0);
- if (globalCtx->envCtx.unk_EE[0] == 0 && globalCtx->envCtx.unk_F2[0] == 0) {
- Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_CRITTER_4 << 4 | NATURE_CHANNEL_CRITTER_5,
- CHANNEL_IO_PORT_1, 1);
+ if (globalCtx->envCtx.unk_EE[0] == 0 && globalCtx->envCtx.unk_F2[0] == 0)
+ {
+ // OTRTODO: This is where corrupt audio happens. Commenting this out seems to not introduce any side effects?
+ // Further investigation is needed...
+
+ if (gUseLegacySD)
+ Audio_SetNatureAmbienceChannelIO(NATURE_CHANNEL_CRITTER_4 << 4 | NATURE_CHANNEL_CRITTER_5,
+ CHANNEL_IO_PORT_1, 1);
}
globalCtx->envCtx.unk_E0++;
break;