diff options
| author | Kevin Alexis Contreras <36680385+KiritoDv@users.noreply.github.com> | 2022-06-01 15:11:11 -0500 |
|---|---|---|
| committer | Kevin Alexis Contreras <36680385+KiritoDv@users.noreply.github.com> | 2022-06-01 15:11:11 -0500 |
| commit | 0320107fc03bfb17192191ae12f4380d76d850cf (patch) | |
| tree | d5cec2396720cda5f5350518636d278f01d02429 /soh/src/code | |
| parent | 0067a69795c160332eab0f2ef5188a062d03b81f (diff) | |
| parent | 6f5ce7d7157d60c22ca7cd43ff576fc54dc50dbc (diff) | |
Merge branch 'zapd_audio_support' into zelda64
Diffstat (limited to 'soh/src/code')
| -rw-r--r-- | soh/src/code/audioMgr.c | 1 | ||||
| -rw-r--r-- | soh/src/code/audio_heap.c | 8 | ||||
| -rw-r--r-- | soh/src/code/audio_load.c | 367 | ||||
| -rw-r--r-- | soh/src/code/audio_playback.c | 57 | ||||
| -rw-r--r-- | soh/src/code/audio_seqplayer.c | 12 | ||||
| -rw-r--r-- | soh/src/code/audio_synthesis.c | 14 | ||||
| -rw-r--r-- | soh/src/code/code_800C3C20.c | 2 | ||||
| -rw-r--r-- | soh/src/code/code_800E4FE0.c | 4 | ||||
| -rw-r--r-- | soh/src/code/code_800EC960.c | 10 | ||||
| -rw-r--r-- | soh/src/code/code_800F7260.c | 20 |
10 files changed, 356 insertions, 139 deletions
diff --git a/soh/src/code/audioMgr.c b/soh/src/code/audioMgr.c index 800291913..e8c7be032 100644 --- a/soh/src/code/audioMgr.c +++ b/soh/src/code/audioMgr.c @@ -84,7 +84,6 @@ void AudioMgr_Unlock(AudioMgr* audioMgr) { } void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedContext* sched, IrqMgr* irqMgr) { - return; // OTRTODO64 AudioPlayer_Init(); memset(audioMgr,0, sizeof(AudioMgr)); diff --git a/soh/src/code/audio_heap.c b/soh/src/code/audio_heap.c index 9e73ac570..bee0178ff 100644 --- a/soh/src/code/audio_heap.c +++ b/soh/src/code/audio_heap.c @@ -10,6 +10,8 @@ void AudioHeap_DiscardSampleCaches(void); void AudioHeap_DiscardSampleBank(s32 sampleBankId); void AudioHeap_DiscardSampleBanks(void); +extern bool gUseLegacySD; + f32 func_800DDE20(f32 arg0) { return 256.0f * gAudioContext.audioBufferParameters.unkUpdatesPerFrameScaled / arg0; } @@ -1201,7 +1203,11 @@ void AudioHeap_DiscardSampleCacheEntry(SampleCacheEntry* entry) { } } -void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, SoundFontSample* sample) { +void AudioHeap_UnapplySampleCache(SampleCacheEntry* entry, SoundFontSample* sample) +{ + if (!gUseLegacySD) + return; + if (sample != NULL) { if (sample->sampleAddr == entry->allocatedAddr) { sample->sampleAddr = entry->sampleAddr; diff --git a/soh/src/code/audio_load.c b/soh/src/code/audio_load.c index fee03e9ae..c9a8c6c46 100644 --- a/soh/src/code/audio_load.c +++ b/soh/src/code/audio_load.c @@ -4,6 +4,7 @@ #include "ultra64.h" #include "global.h" +#include "soh/OTRGlobals.h" #define MK_ASYNC_MSG(retData, tableType, id, status) (((retData) << 24) | ((tableType) << 16) | ((id) << 8) | (status)) #define ASYNC_TBLTYPE(v) ((u8)(v >> 16)) @@ -37,11 +38,11 @@ void AudioLoad_ProcessAsyncLoads(s32 resetStatus); void AudioLoad_ProcessAsyncLoadUnkMedium(AudioAsyncLoad* asyncLoad, s32 resetStatus); void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus); void AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo, s32 temporary); -void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo); +void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocInfo* relocInfo, int fontId); void AudioLoad_DiscardFont(s32 fontId); uintptr_t AudioLoad_TrySyncLoadSampleBank(u32 sampleBankId, u32* outMedium, s32 noLoad); uintptr_t AudioLoad_SyncLoad(u32 tableType, u32 tableId, s32* didAllocate); -uintptr_t AudioLoad_GetRealTableIndex(s32 tableType, u32 tableId); +u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 tableId); void* AudioLoad_SearchCaches(s32 tableType, s32 id); AudioTable* AudioLoad_GetLoadTable(s32 tableType); void AudioLoad_SyncDma(uintptr_t devAddr, u8* addr, size_t size, s32 medium); @@ -75,6 +76,11 @@ void* sUnusedHandler = NULL; s32 gAudioContextInitalized = false; +uintptr_t fontStart; +uint32_t fontOffsets[8192]; + +bool gUseLegacySD = false; + void AudioLoad_DecreaseSampleDmaTtls(void) { u32 i; @@ -279,8 +285,11 @@ void AudioLoad_InitSampleDmaBuffers(s32 arg0) { } s32 AudioLoad_IsFontLoadComplete(s32 fontId) { + return true; + if (fontId == 0xFF) { return true; + } else if (gAudioContext.fontLoadStatus[fontId] >= 2) { return true; } else if (gAudioContext.fontLoadStatus[AudioLoad_GetRealTableIndex(FONT_TABLE, fontId)] >= 2) { @@ -353,6 +362,9 @@ void AudioLoad_InitTable(AudioTable* table, uintptr_t romAddr, u16 unkMediumPara for (i = 0; i < table->numEntries; i++) { if ((table->entries[i].size != 0) && (table->entries[i].medium == MEDIUM_CART)) { + if (romAddr == fontStart) + fontOffsets[i] = table->entries[i].romAddr; + table->entries[i].romAddr += romAddr; } } @@ -401,7 +413,8 @@ void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 arg1) { s32 AudioLoad_SyncLoadSample(SoundFontSample* sample, s32 fontId) { void* sampleAddr; - if (sample->unk_bit25 == 1) { + if (sample->unk_bit25 == 1) + { if (sample->medium != MEDIUM_RAM) { sampleAddr = AudioHeap_AllocSampleCache(sample->size, fontId, (void*)sample->sampleAddr, sample->medium, CACHE_PERSISTENT); @@ -549,7 +562,7 @@ s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2) { s32 numFonts; s32 fontId; - if (seqId >= gAudioContext.numSequences) { + if (gUseLegacySD && seqId >= gAudioContext.numSequences) { return 0; } @@ -561,18 +574,27 @@ s32 AudioLoad_SyncInitSeqPlayerInternal(s32 playerIdx, s32 seqId, s32 arg2) { while (numFonts > 0) { fontId = gAudioContext.sequenceFontTable[index++]; - AudioLoad_SyncLoadFont(fontId); + + //if (gUseLegacySD) + AudioLoad_SyncLoadFont(fontId); + numFonts--; } seqData = AudioLoad_SyncLoadSeq(seqId); + if (seqData == NULL) { return 0; } AudioSeq_ResetSequencePlayer(seqPlayer); seqPlayer->seqId = seqId; - seqPlayer->defaultFont = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId); + + if (gUseLegacySD) + seqPlayer->defaultFont = AudioLoad_GetRealTableIndex(FONT_TABLE, fontId); + else + seqPlayer->defaultFont = fontId; + seqPlayer->seqData = seqData; seqPlayer->enabled = 1; seqPlayer->scriptState.pc = seqData; @@ -638,12 +660,22 @@ 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; } - sampleBankId1 = gAudioContext.soundFonts[realFontId].sampleBankId1; - sampleBankId2 = gAudioContext.soundFonts[realFontId].sampleBankId2; + + if (!gUseLegacySD) { + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + + sampleBankId1 = sf->sampleBankId1; + sampleBankId2 = sf->sampleBankId2; + } else { + + sampleBankId1 = gAudioContext.soundFonts[realFontId].sampleBankId1; + sampleBankId2 = gAudioContext.soundFonts[realFontId].sampleBankId2; + } relocInfo.sampleBankId1 = sampleBankId1; relocInfo.sampleBankId2 = sampleBankId2; @@ -686,13 +718,39 @@ uintptr_t AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { if (ret != NULL) { *didAllocate = false; status = 2; - } else { - table = AudioLoad_GetLoadTable(tableType); - size = table->entries[realId].size; - size = ALIGN16(size); - medium = table->entries[id].medium; - cachePolicy = table->entries[id].cachePolicy; - romAddr = table->entries[realId].romAddr; + } else + { + 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]; + romAddr = 0; + seqData += 2; + } + else if (!gUseLegacySD && tableType == FONT_TABLE) + { + fnt = ResourceMgr_LoadAudioSoundFont(id); + size = sizeof(SoundFont); + medium = 2; + cachePolicy = 0; + romAddr = 0; + } + else + { + table = AudioLoad_GetLoadTable(tableType); + size = table->entries[realId].size; + size = ALIGN16(size); + medium = table->entries[id].medium; + cachePolicy = table->entries[id].cachePolicy; + romAddr = table->entries[realId].romAddr; + } + switch (cachePolicy) { case 0: ret = AudioHeap_AllocPermanent(tableType, realId, size); @@ -725,7 +783,14 @@ uintptr_t AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { if (medium == MEDIUM_UNK) { AudioLoad_SyncDmaUnkMedium(romAddr, ret, size, (s16)table->unkMediumParam); } else { - AudioLoad_SyncDma(romAddr, ret, size, medium); + if (!gUseLegacySD && tableType == SEQUENCE_TABLE && seqData != NULL) { + AudioLoad_SyncDma(seqData, ret, size, medium); + } else if (!gUseLegacySD && tableType == FONT_TABLE) { + AudioLoad_SyncDma(fnt, ret, size, medium); + } + else { + AudioLoad_SyncDma(romAddr, ret, size, medium); + } } status = cachePolicy == 0 ? 5 : 2; @@ -748,9 +813,15 @@ uintptr_t AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) { return ret; } -uintptr_t AudioLoad_GetRealTableIndex(s32 tableType, u32 id) { +u32 AudioLoad_GetRealTableIndex(s32 tableType, u32 id) { + if ((tableType == SEQUENCE_TABLE || tableType == FONT_TABLE) && !gUseLegacySD) { + return id; + } + AudioTable* table = AudioLoad_GetLoadTable(tableType); + // If the size is 0, then this entry actually redirects to another entry. + // The rom address is actually an index into the same table where the "real" data is. if (table->entries[id].size == 0) { id = table->entries[id].romAddr; } @@ -801,29 +872,62 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo Drum* drum; SoundFontSound* sfx; s32 i; - s32 numDrums = gAudioContext.soundFonts[fontId].numDrums; - s32 numInstruments = gAudioContext.soundFonts[fontId].numInstruments; - s32 numSfx = gAudioContext.soundFonts[fontId].numSfx; + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + + s32 numDrums = 0; + s32 numInstruments = 0; + s32 numSfx = 0; + + if (gUseLegacySD) { + numDrums = gAudioContext.soundFonts[fontId].numDrums; + numInstruments = gAudioContext.soundFonts[fontId].numInstruments; + numSfx = gAudioContext.soundFonts[fontId].numSfx; + } else { + numDrums = sf->numDrums; + numInstruments = sf->numInstruments; + numSfx = sf->numSfx; + } + void** ptrs = (void**)mem; -#define BASE_OFFSET(x) (uintptr_t)((uintptr_t)(x) + (uintptr_t)(mem)) +#define BASE_OFFSET(x) (void*)((u32)(x) + (u32)(mem)) reloc2 = ptrs[0]; if (1) {} - if ((reloc2 != 0) && (numDrums != 0)) { + if ((reloc2 != 0 || !gUseLegacySD) && (numDrums != 0)) + { ptrs[0] = BASE_OFFSET(reloc2); - for (i = 0; i < numDrums; i++) { - reloc = ((Drum**)ptrs[0])[i]; - - if (reloc != 0) { - reloc = BASE_OFFSET(reloc); - - ((Drum**)ptrs[0])[i] = drum = reloc; - if (!drum->loaded) { - AudioLoad_RelocateSample(&drum->sound, mem, relocInfo); - reloc = drum->envelope; - drum->envelope = BASE_OFFSET(reloc); - drum->loaded = 1; + for (i = 0; i < numDrums; i++) + { + if (gUseLegacySD) + reloc = ((Drum**)ptrs[0])[i]; + + if (reloc != 0 || !gUseLegacySD) + { + if (gUseLegacySD) + { + reloc = BASE_OFFSET(reloc); + ((Drum**)ptrs[0])[i] = drum = reloc; + } + + if (!gUseLegacySD) + drum = sf->drums[i]; + + if (!drum->loaded) + { + if (!gUseLegacySD) + { + AudioLoad_RelocateSample(&sf->drums[i]->sound, mem, relocInfo, fontOffsets[fontId]); + //reloc = drum->envelope; + drum->loaded = 1; + } + else + { + AudioLoad_RelocateSample(&drum->sound, mem, relocInfo, fontOffsets[fontId]); + reloc = drum->envelope; + drum->envelope = BASE_OFFSET(reloc); + drum->loaded = 1; + } } } } @@ -831,14 +935,19 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo reloc2 = ptrs[1]; if (1) {} - if ((reloc2 != 0) && (numSfx != 0)) { + if ((reloc2 != 0 || !gUseLegacySD) && (numSfx != 0)) { ptrs[1] = BASE_OFFSET(reloc2); for (i = 0; i < numSfx; i++) { reloc = (SoundFontSound*)ptrs[1] + i; - if (reloc != 0) { - sfx = reloc; - if (sfx->sample != NULL) { - AudioLoad_RelocateSample(sfx, mem, relocInfo); + if (reloc != 0 || !gUseLegacySD) + { + if (!gUseLegacySD) { + AudioLoad_RelocateSample(&sf->soundEffects[i].sample, mem, relocInfo, fontOffsets[fontId]); + } else { + sfx = reloc; + if (sfx->sample != NULL) { + AudioLoad_RelocateSample(sfx, mem, relocInfo, fontOffsets[fontId]); + } } } } @@ -848,22 +957,34 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo numInstruments = 0x7E; } - for (i = 2; i <= 2 + numInstruments - 1; i++) { - if (ptrs[i] != NULL) { + int startI = gUseLegacySD ? 2 : 0; + int startEC = gUseLegacySD ? 2 + numInstruments - 1 : numInstruments - 1; + //for (i = 2; i <= 2 + numInstruments - 1; i++) { + for (i = startI; i <= startEC; i++) { + if (!gUseLegacySD || ptrs[i] != NULL) + { ptrs[i] = BASE_OFFSET(ptrs[i]); - inst = ptrs[i]; - if (!inst->loaded) { - if (inst->normalRangeLo != 0) { - AudioLoad_RelocateSample(&inst->lowNotesSound, mem, relocInfo); + if (gUseLegacySD) + inst = ptrs[i]; + else + inst = sf->instruments[i]; + + if (inst != NULL && !inst->loaded) { + if (inst->normalRangeLo != 0) + { + AudioLoad_RelocateSample(&inst->lowNotesSound, mem, relocInfo, fontOffsets[fontId]); } - AudioLoad_RelocateSample(&inst->normalNotesSound, mem, relocInfo); + AudioLoad_RelocateSample(&inst->normalNotesSound, mem, relocInfo, fontOffsets[fontId]); if (inst->normalRangeHi != 0x7F) { - AudioLoad_RelocateSample(&inst->highNotesSound, mem, relocInfo); + AudioLoad_RelocateSample(&inst->highNotesSound, mem, relocInfo, fontOffsets[fontId]); } reloc = inst->envelope; - inst->envelope = BASE_OFFSET(reloc); + + if (gUseLegacySD) + inst->envelope = BASE_OFFSET(reloc); + inst->loaded = 1; } } @@ -871,9 +992,11 @@ void AudioLoad_RelocateFont(s32 fontId, SoundFontData* mem, RelocInfo* relocInfo #undef BASE_OFFSET - gAudioContext.soundFonts[fontId].drums = ptrs[0]; - gAudioContext.soundFonts[fontId].soundEffects = ptrs[1]; - gAudioContext.soundFonts[fontId].instruments = (Instrument**)(ptrs + 2); + if (gUseLegacySD) { + gAudioContext.soundFonts[fontId].drums = ptrs[0]; + gAudioContext.soundFonts[fontId].soundEffects = ptrs[1]; + gAudioContext.soundFonts[fontId].instruments = (Instrument**)(ptrs + 2); + } } void AudioLoad_SyncDma(uintptr_t devAddr, u8* addr, size_t size, s32 medium) { @@ -1275,21 +1398,25 @@ void AudioLoad_Init(void* heap, size_t heapSize) { uintptr_t bankStart = ResourceMgr_LoadFileRaw(_AudiobankSegmentRomStart); uintptr_t tableStart = ResourceMgr_LoadFileRaw(_AudiotableSegmentRomStart); + fontStart = bankStart; + AudioLoad_InitTable(gAudioContext.sequenceTable, seqStart, 0); AudioLoad_InitTable(gAudioContext.soundFontTable, bankStart, 0); AudioLoad_InitTable(gAudioContext.sampleBankTable, tableStart, 0); numFonts = gAudioContext.soundFontTable->numEntries; gAudioContext.soundFonts = AudioHeap_Alloc(&gAudioContext.audioInitPool, numFonts * sizeof(SoundFont)); - for (i = 0; i < numFonts; i++) { - AudioLoad_InitSoundFontMeta(i); - } + if (gUseLegacySD) { + for (i = 0; i < numFonts; i++) { + AudioLoad_InitSoundFontMeta(i); + } - AudioLoad_InitSwapFont(); + AudioLoad_InitSwapFont(); + } if (temp_v0_3 = AudioHeap_Alloc(&gAudioContext.audioInitPool, D_8014A6C4.permanentPoolSize), temp_v0_3 == NULL) { // cast away const from D_8014A6C4 - *((size_t*)&D_8014A6C4.permanentPoolSize) = 0; + // *((u32*)&D_8014A6C4.permanentPoolSize) = 0; } AudioHeap_AllocPoolInit(&gAudioContext.permanentPool, temp_v0_3, D_8014A6C4.permanentPoolSize); @@ -1459,28 +1586,40 @@ s32 AudioLoad_SlowLoadSeq(s32 seqId, u8* ramAddr, s8* isDone) { AudioTable* seqTable; size_t size; - if (seqId >= gAudioContext.numSequences) { + if (gUseLegacySD && seqId >= gAudioContext.numSequences) { *isDone = 0; return -1; } seqId = AudioLoad_GetRealTableIndex(SEQUENCE_TABLE, seqId); + seqTable = AudioLoad_GetLoadTable(SEQUENCE_TABLE); + slowLoad = &gAudioContext.slowLoads[gAudioContext.slowLoadPos]; if (slowLoad->status == LOAD_STATUS_DONE) { slowLoad->status = LOAD_STATUS_WAITING; } + slowLoad->sample.sampleAddr = NULL; slowLoad->isDone = isDone; - size = seqTable->entries[seqId].size; - size = ALIGN16(size); + + if (!gUseLegacySD) { + char* seqData = ResourceMgr_LoadSeqByID(seqId); + size = ResourceMgr_GetSeqSizeByID(seqId) - 2; + slowLoad->curDevAddr = seqData + 2; + slowLoad->medium = seqData[0]; + } else { + size = seqTable->entries[seqId].size; + size = ALIGN16(size); + slowLoad->curDevAddr = seqTable->entries[seqId].romAddr; + slowLoad->medium = seqTable->entries[seqId].medium; + } + slowLoad->curRamAddr = ramAddr; slowLoad->status = LOAD_STATUS_START; slowLoad->bytesRemaining = size; slowLoad->ramAddr = ramAddr; - slowLoad->curDevAddr = seqTable->entries[seqId].romAddr; - slowLoad->medium = seqTable->entries[seqId].medium; slowLoad->seqOrFontId = seqId; if (slowLoad->medium == MEDIUM_UNK) { @@ -1693,7 +1832,7 @@ 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) { +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) { @@ -1705,32 +1844,58 @@ void AudioLoad_RelocateSample(SoundFontSound* sound, SoundFontData* mem, RelocIn void* reloc; // OTRTODO: Seems precarious to assume the RAM is never <= 0x3EB2A0, but it largely works. - if ((uintptr_t)sound->sample < maxSoundBankSize) { - sample = sound->sample = RELOC(sound->sample, mem); - if (sample->size != 0 && sample->unk_bit25 != 1) { - sample->loop = RELOC(sample->loop, mem); - sample->book = RELOC(sample->book, mem); - - // Resolve the sample medium 2-bit bitfield into a real value based on relocInfo. - switch (sample->medium) { - case 0: - sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr1); - sample->medium = relocInfo->medium1; - break; - case 1: - sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr2); - sample->medium = relocInfo->medium2; - break; - case 2: - case 3: - // Invalid? This leaves sample->medium as MEDIUM_CART and MEDIUM_DISK_DRIVE - // respectively, and the sampleAddr unrelocated. - break; + 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); + + if (sample->size != 0 && sample->unk_bit25 != 1) { + sample->loop = RELOC(sample->loop, mem); + sample->book = RELOC(sample->book, mem); + + // Resolve the sample medium 2-bit bitfield into a real value based on relocInfo. + switch (sample->medium) { + case 0: + sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr1); + sample->medium = relocInfo->medium1; + break; + case 1: + sample->sampleAddr = RELOC(sample->sampleAddr, relocInfo->baseAddr2); + sample->medium = relocInfo->medium2; + break; + case 2: + case 3: + // Invalid? This leaves sample->medium as MEDIUM_CART and MEDIUM_DISK_DRIVE + // respectively, and the sampleAddr unrelocated. + break; + } - sample->unk_bit25 = 1; - if (sample->unk_bit26 && (sample->medium != MEDIUM_RAM)) { - gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample; + sample->unk_bit25 = 1; + if (sample->unk_bit26 && (sample->medium != MEDIUM_RAM)) { + gAudioContext.usedSamples[gAudioContext.numUsedSamples++] = sample; + } } } } @@ -1983,9 +2148,17 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, RelocInfo* relocInfo gAudioContext.numUsedSamples = 0; - numDrums = gAudioContext.soundFonts[fontId].numDrums; - numInstruments = gAudioContext.soundFonts[fontId].numInstruments; - numSfx = gAudioContext.soundFonts[fontId].numSfx; + if (!gUseLegacySD) { + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + + numDrums = sf->numDrums; + numInstruments = sf->numInstruments; + numSfx = sf->numSfx; + } else { + numDrums = gAudioContext.soundFonts[fontId].numDrums; + numInstruments = gAudioContext.soundFonts[fontId].numInstruments; + numSfx = gAudioContext.soundFonts[fontId].numSfx; + } for (i = 0; i < numInstruments; i++) { instrument = Audio_GetInstrumentInner(fontId, i); @@ -2030,6 +2203,7 @@ void AudioLoad_PreloadSamplesForFont(s32 fontId, s32 async, RelocInfo* relocInfo } sample = gAudioContext.usedSamples[i]; + if (sample->medium == MEDIUM_RAM) { continue; } @@ -2106,10 +2280,19 @@ void AudioLoad_LoadPermanentSamples(void) { for (i = 0; i < gAudioContext.permanentPool.count; i++) { RelocInfo relocInfo; - if (gAudioContext.permanentCache[i].tableType == FONT_TABLE) { + if (gAudioContext.permanentCache[i].tableType == FONT_TABLE) + { fontId = AudioLoad_GetRealTableIndex(FONT_TABLE, gAudioContext.permanentCache[i].id); - relocInfo.sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; - relocInfo.sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + //fontId = gAudioContext.permanentCache[i].id; + + if (!gUseLegacySD) { + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + relocInfo.sampleBankId1 = sf->sampleBankId1; + relocInfo.sampleBankId2 = sf->sampleBankId2; + } else { + relocInfo.sampleBankId1 = gAudioContext.soundFonts[fontId].sampleBankId1; + relocInfo.sampleBankId2 = gAudioContext.soundFonts[fontId].sampleBankId2; + } if (relocInfo.sampleBankId1 != 0xFF) { relocInfo.sampleBankId1 = AudioLoad_GetRealTableIndex(SAMPLE_TABLE, relocInfo.sampleBankId1); diff --git a/soh/src/code/audio_playback.c b/soh/src/code/audio_playback.c index c116b4ddb..5d43118b8 100644 --- a/soh/src/code/audio_playback.c +++ b/soh/src/code/audio_playback.c @@ -1,6 +1,8 @@ #include "global.h" #include "Cvar.h" +extern bool gUseLegacySD; + void Audio_InitNoteSub(Note* note, NoteSubEu* sub, NoteSubAttributes* attrs) { f32 volRight, volLeft; s32 smallPanIndex; @@ -307,7 +309,7 @@ SoundFontSound* Audio_InstrumentGetSound(Instrument* instrument, s32 semitone) { Instrument* Audio_GetInstrumentInner(s32 fontId, s32 instId) { Instrument* inst; - + if (fontId == 0xFF) { return NULL; } @@ -317,16 +319,31 @@ Instrument* Audio_GetInstrumentInner(s32 fontId, s32 instId) { return NULL; } - if (instId >= gAudioContext.soundFonts[fontId].numInstruments) { - gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x3000000; - return NULL; + int instCnt = 0; + + if (gUseLegacySD) { + instCnt = gAudioContext.soundFonts[fontId].numInstruments; + inst = gAudioContext.soundFonts[fontId].instruments[instId]; + + if (instId >= gAudioContext.soundFonts[fontId].numInstruments) + if (instId >= instCnt) { + gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x3000000; + return NULL; + } + } else { + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + + if (instId >= sf->numInstruments) + return NULL; + + inst = sf->instruments[instId]; } - inst = gAudioContext.soundFonts[fontId].instruments[instId]; if (inst == NULL) { gAudioContext.audioErrorFlags = ((fontId << 8) + instId) + 0x1000000; return inst; } + return inst; } @@ -343,12 +360,17 @@ Drum* Audio_GetDrum(s32 fontId, s32 drumId) { return NULL; } - if (drumId >= gAudioContext.soundFonts[fontId].numDrums) { - gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x4000000; - return NULL; - } + if (gUseLegacySD) { + if (drumId >= gAudioContext.soundFonts[fontId].numDrums) { + gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x4000000; + return NULL; + } - drum = gAudioContext.soundFonts[fontId].drums[drumId]; + drum = gAudioContext.soundFonts[fontId].drums[drumId]; + } else { + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + drum = sf->drums[drumId]; + } if (drum == NULL) { gAudioContext.audioErrorFlags = ((fontId << 8) + drumId) + 0x5000000; @@ -369,12 +391,17 @@ SoundFontSound* Audio_GetSfx(s32 fontId, s32 sfxId) { return NULL; } - if (sfxId >= gAudioContext.soundFonts[fontId].numSfx) { - gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x4000000; - return NULL; - } + if (gUseLegacySD) { + if (sfxId >= gAudioContext.soundFonts[fontId].numSfx) { + gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x4000000; + return NULL; + } - sfx = &gAudioContext.soundFonts[fontId].soundEffects[sfxId]; + sfx = &gAudioContext.soundFonts[fontId].soundEffects[sfxId]; + } else { + SoundFont* sf = ResourceMgr_LoadAudioSoundFont(fontId); + sfx = &sf->soundEffects[sfxId]; + } if (sfx == NULL) { gAudioContext.audioErrorFlags = ((fontId << 8) + sfxId) + 0x5000000; diff --git a/soh/src/code/audio_seqplayer.c b/soh/src/code/audio_seqplayer.c index 3dd7b811e..52d14a9a1 100644 --- a/soh/src/code/audio_seqplayer.c +++ b/soh/src/code/audio_seqplayer.c @@ -938,8 +938,16 @@ u8 AudioSeq_GetInstrument(SequenceChannel* channel, u8 instId, Instrument** inst *instOut = NULL; return 0; } - adsr->envelope = inst->envelope; - adsr->releaseRate = inst->releaseRate; + + if (inst->envelope != NULL) + { + adsr->envelope = inst->envelope; + adsr->releaseRate = (inst->releaseRate); + } + else { + adsr->envelope = gDefaultEnvelope; + } + *instOut = inst; instId += 2; return instId; diff --git a/soh/src/code/audio_synthesis.c b/soh/src/code/audio_synthesis.c index 3416631bf..01a1e16c2 100644 --- a/soh/src/code/audio_synthesis.c +++ b/soh/src/code/audio_synthesis.c @@ -749,8 +749,10 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS cmd = AudioSynth_LoadWaveSamples(cmd, noteSubEu, synthState, nSamplesToLoad); noteSamplesDmemAddrBeforeResampling = DMEM_UNCOMPRESSED_NOTE + (synthState->samplePosInt * 2); synthState->samplePosInt += nSamplesToLoad; - } else { + } else + { audioFontSample = noteSubEu->sound.soundFontSound->sample; + loopInfo = audioFontSample->loop; loopEndPos = loopInfo->end; sampleAddr = audioFontSample->sampleAddr; @@ -822,6 +824,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS noteFinished = true; } } + switch (audioFontSample->codec) { case CODEC_ADPCM: @@ -848,6 +851,9 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS goto skip; case CODEC_S16: AudioSynth_ClearBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, (samplesLenAdjusted * 2) + 0x20); + AudioSynth_LoadBuffer(cmd++, DMEM_UNCOMPRESSED_NOTE, ALIGN16(nSamplesToLoad * 2), + audioFontSample->sampleAddr + (synthState->samplePosInt * 2)); + flags = A_CONTINUE; skipBytes = 0; nSamplesProcessed = samplesLenAdjusted; @@ -860,7 +866,8 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS if (nFramesToDecode != 0) { frameIndex = (synthState->samplePosInt + skipInitialSamples - nFirstFrameSamplesToIgnore) / 16; sampleDataOffset = frameIndex * frameSize; - if (audioFontSample->medium == MEDIUM_RAM) { + if (audioFontSample->medium == MEDIUM_RAM) + { sampleData = (u8*)(sampleDataStart + sampleDataOffset + sampleAddr); } else if (audioFontSample->medium == MEDIUM_UNK) { return cmd; @@ -1024,7 +1031,8 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSubEu, NoteSynthesisS unk7 = noteSubEu->unk_07; unkE = noteSubEu->unk_0E; buf = &synthState->synthesisBuffers->panSamplesBuffer[0x18]; - if (unk7 != 0 && noteSubEu->unk_0E != 0) { + if (unk7 != 0 && noteSubEu->unk_0E != 0) + { AudioSynth_DMemMove(cmd++, DMEM_TEMP, DMEM_SCRATCH2, aiBufLen * 2); thing = DMEM_SCRATCH2 - unk7; if (synthState->unk_1A != 0) { diff --git a/soh/src/code/code_800C3C20.c b/soh/src/code/code_800C3C20.c index b7090f4e3..bd3b37850 100644 --- a/soh/src/code/code_800C3C20.c +++ b/soh/src/code/code_800C3C20.c @@ -7,8 +7,6 @@ u8 D_8012D200[] = { void func_800C3C20(void) { s32 i; - return; // OTRTODO64 - for (i = 0; (i < ARRAY_COUNT(D_8012D200)) & 0xFFFFFFFF; i++) { Audio_StopSfxByBank(D_8012D200[i]); } diff --git a/soh/src/code/code_800E4FE0.c b/soh/src/code/code_800E4FE0.c index 5d2d11188..777efaa23 100644 --- a/soh/src/code/code_800E4FE0.c +++ b/soh/src/code/code_800E4FE0.c @@ -212,11 +212,7 @@ AudioTask* func_800E5000(void) { task = &gAudioContext.currTask->task.t; task->type = M_AUDTASK; task->flags = 0; - //task->ucode_boot = D_801120C0; task->ucode_boot_size = 0x1000; - //task->ucode_data_size = ((rspAspMainDataEnd - rspAspMainDataStart) * sizeof(u64)) - 1; - //task->ucode = D_801120C0; - //task->ucode_data = rspAspMainDataStart; task->ucode_size = 0x1000; task->dram_stack = NULL; task->dram_stack_size = 0; diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c index 13a50c554..a91764138 100644 --- a/soh/src/code/code_800EC960.c +++ b/soh/src/code/code_800EC960.c @@ -1250,7 +1250,7 @@ s32 Audio_SetGanonDistVol(u8 targetVol); // Function originally not called, so repurposing for DPad input void func_800EC960(u8 dpad) { if (dpad) { - sOcarinaAllowedBtnMask = + sOcarinaAllowedBtnMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT | BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT); sOcarinaABtnMap = BTN_A; sOcarinaCUPBtnMap = BTN_CUP | BTN_DUP; @@ -3502,7 +3502,6 @@ void func_800F4A70(void); void func_800F5CF8(void); void func_800F3054(void) { - return; // OTRTODO64 if (func_800FAD34() == 0) { sAudioUpdateTaskStart = gAudioContext.totalTaskCnt; sAudioUpdateStartTime = osGetTime(); @@ -4096,7 +4095,7 @@ void func_800F4870(u8 arg0) { } // (name derived from debug strings, should probably update. used in ganon/ganon_boss scenes) -s32 Audio_SetGanonDistVol(u8 targetVol) +s32 Audio_SetGanonDistVol(u8 targetVol) { u8 phi_v0; u16 phi_v0_2; @@ -4256,7 +4255,6 @@ void Audio_ClearSariaBgmAtPos(Vec3f* pos) { * equally between the two bgm channels. Split based on note priority */ void Audio_SplitBgmChannels(s8 volSplit) { - return; u8 volume; u8 notePriority; u16 channelBits; @@ -4521,15 +4519,13 @@ void func_800F5C2C(void) { sPrevMainBgmSeqId = NA_BGM_DISABLED; } -void Audio_PlayFanfare(u16 seqId) +void Audio_PlayFanfare(u16 seqId) { u16 sp26; u32 sp20; u8* sp1C; u8* sp18; - return; // OTRTODO64 - sp26 = func_800FA0B4(SEQ_PLAYER_FANFARE); sp1C = func_800E5E84(sp26 & 0xFF, &sp20); sp18 = func_800E5E84(seqId & 0xFF, &sp20); diff --git a/soh/src/code/code_800F7260.c b/soh/src/code/code_800F7260.c index bdc3a64ac..1210a0114 100644 --- a/soh/src/code/code_800F7260.c +++ b/soh/src/code/code_800F7260.c @@ -122,7 +122,7 @@ void Audio_ClearBGMMute(u8 channelIdx) { } } -void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* vol, s8* reverbAdd) +void Audio_PlaySoundGeneral(u16 sfxId, Vec3f* pos, u8 token, f32* freqScale, f32* vol, s8* reverbAdd) { u8 i; SoundRequest* req; @@ -204,7 +204,7 @@ void Audio_RemoveMatchingSoundRequests(u8 aspect, SoundBankEntry* cmp) { } } -void Audio_ProcessSoundRequest(void) +void Audio_ProcessSoundRequest(void) { u16 sfxId; u8 count; @@ -307,7 +307,7 @@ void Audio_ProcessSoundRequest(void) } } -void Audio_RemoveSoundBankEntry(u8 bankId, u8 entryIndex) +void Audio_RemoveSoundBankEntry(u8 bankId, u8 entryIndex) { SoundBankEntry* entry = &gSoundBanks[bankId][entryIndex]; u8 i; @@ -335,7 +335,7 @@ void Audio_RemoveSoundBankEntry(u8 bankId, u8 entryIndex) } } -void Audio_ChooseActiveSounds(u8 bankId) +void Audio_ChooseActiveSounds(u8 bankId) { u8 numChosenSounds; u8 numChannels; @@ -492,7 +492,7 @@ void Audio_ChooseActiveSounds(u8 bankId) } } -void Audio_PlayActiveSounds(u8 bankId) +void Audio_PlayActiveSounds(u8 bankId) { u8 entryIndex; SequenceChannel* channel; @@ -553,7 +553,7 @@ void Audio_PlayActiveSounds(u8 bankId) } } -void Audio_StopSfxByBank(u8 bankId) +void Audio_StopSfxByBank(u8 bankId) { SoundBankEntry* entry; s32 pad; @@ -579,8 +579,6 @@ void func_800F8884(u8 bankId, Vec3f* pos) { u8 entryIndex = gSoundBanks[bankId][0].next; u8 prevEntryIndex = 0; - return; // OTRTODO64 - while (entryIndex != 0xFF) { entry = &gSoundBanks[bankId][entryIndex]; if (entry->posX == &pos->x) { @@ -617,7 +615,7 @@ void Audio_StopSfxByPos(Vec3f* pos) { Audio_RemoveMatchingSoundRequests(2, &cmp); } -void Audio_StopSfxByPosAndId(Vec3f* pos, u16 sfxId) +void Audio_StopSfxByPosAndId(Vec3f* pos, u16 sfxId) { SoundBankEntry* entry; u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; @@ -678,7 +676,6 @@ void Audio_StopSfxById(u32 sfxId) { u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; u8 prevEntryIndex = 0; SoundBankEntry cmp; - return; // OTRTODO64 while (entryIndex != 0xFF) { entry = &gSoundBanks[SFX_BANK(sfxId)][entryIndex]; @@ -738,9 +735,8 @@ void func_800F8F88(void) { } } -u8 Audio_IsSfxPlaying(u32 sfxId) +u8 Audio_IsSfxPlaying(u32 sfxId) { - return; // OTRTODO64 SoundBankEntry* entry; u8 entryIndex = gSoundBanks[SFX_BANK(sfxId)][0].next; |
