From 40b1a42e081fec4bed2bfbf363d5e27fe4698210 Mon Sep 17 00:00:00 2001 From: dbalatoni13 Date: Mon, 30 Dec 2024 02:53:32 +0100 Subject: [PATCH] Import THPAudio.c from MKDD --- configure.py | 2 +- src/dolphin/thp/THPAudio.c | 218 ++++++++++++++++++++----------------- 2 files changed, 118 insertions(+), 102 deletions(-) diff --git a/configure.py b/configure.py index ee154540..1dd001d7 100644 --- a/configure.py +++ b/configure.py @@ -640,7 +640,7 @@ config.libs = [ "host": False, "objects": [ Object(MatchingFor("GMPE01_00", "GMPE01_01"), "dolphin/thp/THPDec.c"), - Object(NonMatching, "dolphin/thp/THPAudio.c"), + Object(MatchingFor("GMPE01_00", "GMPE01_01"), "dolphin/thp/THPAudio.c"), ], }, { diff --git a/src/dolphin/thp/THPAudio.c b/src/dolphin/thp/THPAudio.c index 11a29fe4..e782abcb 100644 --- a/src/dolphin/thp/THPAudio.c +++ b/src/dolphin/thp/THPAudio.c @@ -2,131 +2,147 @@ u32 THPAudioDecode(s16 *audioBuffer, u8 *audioFrame, s32 flag) { - // THPAudioRecordHeader *header; - // THPAudioDecodeInfo decInfo; - // u8 *left, *right; - // s16 *decLeftPtr, *decRightPtr; - // s16 yn1, yn2; - // s32 i; - // s32 step; - // s32 sample; - // s64 yn; + THPAudioRecordHeader *header; + THPAudioDecodeInfo decInfo; + u8 *left, *right; + s16 *decLeftPtr, *decRightPtr; + s16 yn1, yn2; + s32 i; + s32 step; + s32 sample; + s64 yn; - // if (audioBuffer == NULL || audioFrame == NULL) { - // return 0; - // } + if (audioBuffer == NULL || audioFrame == NULL) { + return 0; + } - // header = (THPAudioRecordHeader *)audioFrame; - // left = audioFrame + sizeof(THPAudioRecordHeader); - // right = left + header->offsetNextChannel; + header = (THPAudioRecordHeader *)audioFrame; + left = audioFrame + sizeof(THPAudioRecordHeader); + right = left + header->offsetNextChannel; - // if (flag == 1) { - // decRightPtr = audioBuffer; - // decLeftPtr = audioBuffer + header->sampleSize; - // step = 1; - // } - // else { - // decRightPtr = audioBuffer; - // decLeftPtr = audioBuffer + 1; - // step = 2; - // } + if (flag == 1) { + decRightPtr = audioBuffer; + decLeftPtr = audioBuffer + header->sampleSize; + step = 1; + } + else { + decRightPtr = audioBuffer; + decLeftPtr = audioBuffer + 1; + step = 2; + } - // if (header->offsetNextChannel == 0) { - // __THPAudioInitialize(&decInfo, left); + if (header->offsetNextChannel == 0) { + __THPAudioInitialize(&decInfo, left); - // yn1 = header->lYn1; - // yn2 = header->lYn2; + yn1 = header->lYn1; + yn2 = header->lYn2; - // for (i = 0; i < header->sampleSize; i++) { - // sample = __THPAudioGetNewSample(&decInfo); - // yn = header->lCoef[decInfo.predictor][1] * yn2; - // yn += header->lCoef[decInfo.predictor][0] * yn1; - // yn += (sample << decInfo.scale) << 11; - // yn <<= 5; + for (i = 0; i < header->sampleSize; i++) { + sample = __THPAudioGetNewSample(&decInfo); + yn = header->lCoef[decInfo.predictor][1] * yn2; + yn += header->lCoef[decInfo.predictor][0] * yn1; + yn += (sample << decInfo.scale) << 11; + yn <<= 5; - // if (sample > 0x8000) { - // yn += 0x10000; - // } - // else if ((sample == 0x8000) && ((yn & 0x10000) != 0)) { - // yn += 0x10000; - // } + if ((u16)(yn & 0xffff) > 0x8000) { + yn += 0x10000; + } + else if ((u16)(yn & 0xffff) == 0x8000) { + if ((yn & 0x10000)) + yn += 0x10000; + } - // yn += 0x8000; + if (yn > 2147483647LL) { + yn = 2147483647LL; + } - // if (yn > 2147483647LL) { - // yn = 2147483647LL; - // } + if (yn < -2147483648LL) { + yn = -2147483648LL; + } - // if (yn < -2147483648LL) { - // yn = -2147483648LL; - // } + *decLeftPtr = (s16)(yn >> 16); + decLeftPtr += step; + *decRightPtr = (s16)(yn >> 16); + decRightPtr += step; + yn2 = yn1; + yn1 = (s16)(yn >> 16); + } + } + else { + __THPAudioInitialize(&decInfo, left); - // *decLeftPtr = (s16)(yn >> 16); - // decLeftPtr += step; - // *decRightPtr = (s16)(yn >> 16); - // decRightPtr += step; - // yn2 = yn1; - // yn1 = (s16)(yn >> 16); - // } - // } - // else { - // __THPAudioInitialize(&decInfo, left); + yn1 = header->lYn1; + yn2 = header->lYn2; - // yn1 = header->lYn1; - // yn2 = header->lYn2; + for (i = 0; i < header->sampleSize; i++) { + sample = __THPAudioGetNewSample(&decInfo); + yn = header->lCoef[decInfo.predictor][1] * yn2; + yn += header->lCoef[decInfo.predictor][0] * yn1; + yn += (sample << decInfo.scale) << 11; + yn <<= 5; - // for (i = 0; i < header->sampleSize; i++) { - // sample = __THPAudioGetNewSample(&decInfo); - // yn = header->lCoef[decInfo.predictor][1] * yn2; - // yn += header->lCoef[decInfo.predictor][0] * yn1; - // yn += (sample << decInfo.scale) << 11; - // yn <<= 5; - // yn += 0x8000; + if ((u16)(yn & 0xffff) > 0x8000) { + yn += 0x10000; + } + else { + if ((u16)(yn & 0xffff) == 0x8000) { + if ((yn & 0x10000)) + yn += 0x10000; + } + } - // if (yn > 2147483647LL) { - // yn = 2147483647LL; - // } + if (yn > 2147483647LL) { + yn = 2147483647LL; + } - // if (yn < -2147483648LL) { - // yn = -2147483648LL; - // } + if (yn < -2147483648LL) { + yn = -2147483648LL; + } - // *decLeftPtr = (s16)(yn >> 16); - // decLeftPtr += step; - // yn2 = yn1; - // yn1 = (s16)(yn >> 16); - // } + *decLeftPtr = (s16)(yn >> 16); + decLeftPtr += step; + yn2 = yn1; + yn1 = (s16)(yn >> 16); + } - // __THPAudioInitialize(&decInfo, right); + __THPAudioInitialize(&decInfo, right); - // yn1 = header->rYn1; - // yn2 = header->rYn2; + yn1 = header->rYn1; + yn2 = header->rYn2; - // for (i = 0; i < header->sampleSize; i++) { - // sample = __THPAudioGetNewSample(&decInfo); - // yn = header->rCoef[decInfo.predictor][1] * yn2; - // yn += header->rCoef[decInfo.predictor][0] * yn1; - // yn += (sample << decInfo.scale) << 11; - // yn <<= 5; + for (i = 0; i < header->sampleSize; i++) { + sample = __THPAudioGetNewSample(&decInfo); + yn = header->rCoef[decInfo.predictor][1] * yn2; + yn += header->rCoef[decInfo.predictor][0] * yn1; + yn += (sample << decInfo.scale) << 11; + yn <<= 5; - // yn += 0x8000; + if ((u16)(yn & 0xffff) > 0x8000) { + yn += 0x10000; + } + else { + if ((u16)(yn & 0xffff) == 0x8000) { + if ((yn & 0x10000)) + yn += 0x10000; + } + } - // if (yn > 2147483647LL) { - // yn = 2147483647LL; - // } + if (yn > 2147483647LL) { + yn = 2147483647LL; + } - // if (yn < -2147483648LL) { - // yn = -2147483648LL; - // } + if (yn < -2147483648LL) { + yn = -2147483648LL; + } - // *decRightPtr = (s16)(yn >> 16); - // decRightPtr += step; - // yn2 = yn1; - // yn1 = (s16)(yn >> 16); - // } - // } + *decRightPtr = (s16)(yn >> 16); + decRightPtr += step; + yn2 = yn1; + yn1 = (s16)(yn >> 16); + } + } - // return header->sampleSize; + return header->sampleSize; } static s32 __THPAudioGetNewSample(THPAudioDecodeInfo *info)