This commit is contained in:
CreateSource 2024-12-29 21:00:17 -05:00
commit e664007d45
2 changed files with 118 additions and 102 deletions

View file

@ -640,7 +640,7 @@ config.libs = [
"host": False, "host": False,
"objects": [ "objects": [
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "dolphin/thp/THPDec.c"), 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"),
], ],
}, },
{ {

View file

@ -2,131 +2,147 @@
u32 THPAudioDecode(s16 *audioBuffer, u8 *audioFrame, s32 flag) u32 THPAudioDecode(s16 *audioBuffer, u8 *audioFrame, s32 flag)
{ {
// THPAudioRecordHeader *header; THPAudioRecordHeader *header;
// THPAudioDecodeInfo decInfo; THPAudioDecodeInfo decInfo;
// u8 *left, *right; u8 *left, *right;
// s16 *decLeftPtr, *decRightPtr; s16 *decLeftPtr, *decRightPtr;
// s16 yn1, yn2; s16 yn1, yn2;
// s32 i; s32 i;
// s32 step; s32 step;
// s32 sample; s32 sample;
// s64 yn; s64 yn;
// if (audioBuffer == NULL || audioFrame == NULL) { if (audioBuffer == NULL || audioFrame == NULL) {
// return 0; return 0;
// } }
// header = (THPAudioRecordHeader *)audioFrame; header = (THPAudioRecordHeader *)audioFrame;
// left = audioFrame + sizeof(THPAudioRecordHeader); left = audioFrame + sizeof(THPAudioRecordHeader);
// right = left + header->offsetNextChannel; right = left + header->offsetNextChannel;
// if (flag == 1) { if (flag == 1) {
// decRightPtr = audioBuffer; decRightPtr = audioBuffer;
// decLeftPtr = audioBuffer + header->sampleSize; decLeftPtr = audioBuffer + header->sampleSize;
// step = 1; step = 1;
// } }
// else { else {
// decRightPtr = audioBuffer; decRightPtr = audioBuffer;
// decLeftPtr = audioBuffer + 1; decLeftPtr = audioBuffer + 1;
// step = 2; step = 2;
// } }
// if (header->offsetNextChannel == 0) { if (header->offsetNextChannel == 0) {
// __THPAudioInitialize(&decInfo, left); __THPAudioInitialize(&decInfo, left);
// yn1 = header->lYn1; yn1 = header->lYn1;
// yn2 = header->lYn2; yn2 = header->lYn2;
// for (i = 0; i < header->sampleSize; i++) { for (i = 0; i < header->sampleSize; i++) {
// sample = __THPAudioGetNewSample(&decInfo); sample = __THPAudioGetNewSample(&decInfo);
// yn = header->lCoef[decInfo.predictor][1] * yn2; yn = header->lCoef[decInfo.predictor][1] * yn2;
// yn += header->lCoef[decInfo.predictor][0] * yn1; yn += header->lCoef[decInfo.predictor][0] * yn1;
// yn += (sample << decInfo.scale) << 11; yn += (sample << decInfo.scale) << 11;
// yn <<= 5; yn <<= 5;
// if (sample > 0x8000) { if ((u16)(yn & 0xffff) > 0x8000) {
// yn += 0x10000; yn += 0x10000;
// } }
// else if ((sample == 0x8000) && ((yn & 0x10000) != 0)) { else if ((u16)(yn & 0xffff) == 0x8000) {
// yn += 0x10000; if ((yn & 0x10000))
// } yn += 0x10000;
}
// yn += 0x8000; if (yn > 2147483647LL) {
yn = 2147483647LL;
}
// if (yn > 2147483647LL) { if (yn < -2147483648LL) {
// yn = 2147483647LL; yn = -2147483648LL;
// } }
// if (yn < -2147483648LL) { *decLeftPtr = (s16)(yn >> 16);
// yn = -2147483648LL; decLeftPtr += step;
// } *decRightPtr = (s16)(yn >> 16);
decRightPtr += step;
yn2 = yn1;
yn1 = (s16)(yn >> 16);
}
}
else {
__THPAudioInitialize(&decInfo, left);
// *decLeftPtr = (s16)(yn >> 16); yn1 = header->lYn1;
// decLeftPtr += step; yn2 = header->lYn2;
// *decRightPtr = (s16)(yn >> 16);
// decRightPtr += step;
// yn2 = yn1;
// yn1 = (s16)(yn >> 16);
// }
// }
// else {
// __THPAudioInitialize(&decInfo, left);
// yn1 = header->lYn1; for (i = 0; i < header->sampleSize; i++) {
// yn2 = header->lYn2; 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++) { if ((u16)(yn & 0xffff) > 0x8000) {
// sample = __THPAudioGetNewSample(&decInfo); yn += 0x10000;
// yn = header->lCoef[decInfo.predictor][1] * yn2; }
// yn += header->lCoef[decInfo.predictor][0] * yn1; else {
// yn += (sample << decInfo.scale) << 11; if ((u16)(yn & 0xffff) == 0x8000) {
// yn <<= 5; if ((yn & 0x10000))
// yn += 0x8000; yn += 0x10000;
}
}
// if (yn > 2147483647LL) { if (yn > 2147483647LL) {
// yn = 2147483647LL; yn = 2147483647LL;
// } }
// if (yn < -2147483648LL) { if (yn < -2147483648LL) {
// yn = -2147483648LL; yn = -2147483648LL;
// } }
// *decLeftPtr = (s16)(yn >> 16); *decLeftPtr = (s16)(yn >> 16);
// decLeftPtr += step; decLeftPtr += step;
// yn2 = yn1; yn2 = yn1;
// yn1 = (s16)(yn >> 16); yn1 = (s16)(yn >> 16);
// } }
// __THPAudioInitialize(&decInfo, right); __THPAudioInitialize(&decInfo, right);
// yn1 = header->rYn1; yn1 = header->rYn1;
// yn2 = header->rYn2; yn2 = header->rYn2;
// for (i = 0; i < header->sampleSize; i++) { for (i = 0; i < header->sampleSize; i++) {
// sample = __THPAudioGetNewSample(&decInfo); sample = __THPAudioGetNewSample(&decInfo);
// yn = header->rCoef[decInfo.predictor][1] * yn2; yn = header->rCoef[decInfo.predictor][1] * yn2;
// yn += header->rCoef[decInfo.predictor][0] * yn1; yn += header->rCoef[decInfo.predictor][0] * yn1;
// yn += (sample << decInfo.scale) << 11; yn += (sample << decInfo.scale) << 11;
// yn <<= 5; 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) { if (yn > 2147483647LL) {
// yn = 2147483647LL; yn = 2147483647LL;
// } }
// if (yn < -2147483648LL) { if (yn < -2147483648LL) {
// yn = -2147483648LL; yn = -2147483648LL;
// } }
// *decRightPtr = (s16)(yn >> 16); *decRightPtr = (s16)(yn >> 16);
// decRightPtr += step; decRightPtr += step;
// yn2 = yn1; yn2 = yn1;
// yn1 = (s16)(yn >> 16); yn1 = (s16)(yn >> 16);
// } }
// } }
// return header->sampleSize; return header->sampleSize;
} }
static s32 __THPAudioGetNewSample(THPAudioDecodeInfo *info) static s32 __THPAudioGetNewSample(THPAudioDecodeInfo *info)