From 090f31cc5a9a63f11029dbc52cf434cd1a44cd24 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sun, 17 Nov 2024 19:41:45 -0600 Subject: [PATCH] Ported some code from 2ship and documented codec macros on ProcessNote --- src/audio/audio_synthesis.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/audio/audio_synthesis.c b/src/audio/audio_synthesis.c index 9e097358..507719a3 100644 --- a/src/audio/audio_synthesis.c +++ b/src/audio/audio_synthesis.c @@ -1026,27 +1026,44 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSub, NoteSynthesisSta } } switch (bookSample->codec) { - case 0: + case CODEC_ADPCM: frameSize = 9; skipInitialSamples = 0x10; sampleDmaStart = 0; break; - case 1: + case CODEC_S8: frameSize = 0x10; skipInitialSamples = 0x10; sampleDmaStart = 0; break; - case 2: - temp = func_800097A8(bookSample, numSamplesToLoadAdj, flags, - &synthState->synthesisBuffers->unk_40); - aLoadBuffer(aList++, OS_K0_TO_PHYSICAL(temp), 0x5F0, (numSamplesToLoadAdj + 0x10) * 2); - flags = 0; + case CODEC_S16_INMEMORY: skipBytes = 0; numSamplesProcessed = numSamplesToLoadAdj; dmemUncompressedAddrOffset1 = numSamplesToLoadAdj; goto skip; + + case CODEC_S16: + skipBytes = 0; + numSamplesProcessed += numSamplesToLoadAdj; + dmemUncompressedAddrOffset1 = numSamplesToLoadAdj; + size_t bytesToRead; + + if (((synthState->samplePosInt * 2) + (numSamplesToLoadAdj + SAMPLES_PER_FRAME) * SAMPLE_SIZE) < bookSample->size) { + bytesToRead = (numSamplesToLoadAdj + SAMPLES_PER_FRAME) * SAMPLE_SIZE; + } else { + bytesToRead = bookSample->size - (synthState->samplePosInt * 2); + } + // @port [Custom audio] + // TLDR samples are loaded async and might be null the first time they are played. + // See note in AudioSampleFactory.cpp + if (sampleAddr != NULL) { + aLoadBuffer(cmd++, sampleAddr + (synthState->samplePosInt * 2), DMEM_UNCOMPRESSED_NOTE, + bytesToRead); + } + + goto skip; } aligned = ALIGN16((nFramesToDecode * frameSize) + 0x10);