mirror of https://github.com/PrimeDecomp/prime.git
Initial THP import
Former-commit-id: 925d0a3b945e57ae1e366a48fd97b6eaf7bbf044
This commit is contained in:
parent
0972b17732
commit
bb7c4c10ae
|
@ -0,0 +1,88 @@
|
|||
#ifndef _DOLPHIN_THP
|
||||
#define _DOLPHIN_THP
|
||||
|
||||
#include "dolphin/types.h"
|
||||
#include "dolphin/thp/THPAudio.h"
|
||||
#include "dolphin/thp/THPVideoDecode.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef u8 THPSample;
|
||||
typedef s16 THPCoeff;
|
||||
typedef f32 THPQuantTab[64];
|
||||
|
||||
typedef struct _THPHuffmanTab {
|
||||
u8 quick[32];
|
||||
u8 increment[32];
|
||||
u8* Vij;
|
||||
s32 maxCode[18];
|
||||
s32 valPtr[18];
|
||||
u8 Vij1;
|
||||
u8 pad[11];
|
||||
} THPHuffmanTab;
|
||||
|
||||
typedef struct _THPComponent {
|
||||
u8 quantizationTableSelector;
|
||||
u8 DCTableSelector;
|
||||
u8 ACTableSelector;
|
||||
THPCoeff predDC;
|
||||
} THPComponent;
|
||||
|
||||
typedef struct _THPFileInfo {
|
||||
THPQuantTab quantTabs[3];
|
||||
THPHuffmanTab huffmanTabs[4];
|
||||
THPComponent components[3];
|
||||
u16 xPixelSize;
|
||||
u16 yPixelSize;
|
||||
u16 MCUsPerRow;
|
||||
u16 decompressedY;
|
||||
u8* c;
|
||||
u32 currByte;
|
||||
u32 cnt;
|
||||
u8 validHuffmanTabs;
|
||||
u8 RST;
|
||||
u16 nMCU;
|
||||
u16 currMCU;
|
||||
u8* dLC[3];
|
||||
} THPFileInfo;
|
||||
|
||||
s32 __THPAudioGetNewSample(THPAudioDecodeInfo*);
|
||||
void __THPAudioInitialize(THPAudioDecodeInfo*, u8*);
|
||||
|
||||
static void __THPSetupBuffers(void);
|
||||
static u8 __THPReadFrameHeader(void);
|
||||
static u8 __THPReadScaneHeader(void);
|
||||
static u8 __THPReadQuantizationTable(void);
|
||||
static u8 __THPReadHuffmanTableSpecification(void);
|
||||
static void __THPHuffGenerateSizeTable(void);
|
||||
static void __THPHuffGenerateCodeTable(void);
|
||||
static void __THPHuffGenerateDecoderTables(u8 tabIndex);
|
||||
static void __THPRestartDefinition(void);
|
||||
static void __THPPrepBitStream(void);
|
||||
static void __THPDecompressYUV(void*, void*, void*);
|
||||
static void __THPGQRRestore(void);
|
||||
static void __THPDecompressiMCURow512x448(void);
|
||||
static void __THPDecompressiMCURow640x480(void);
|
||||
static void __THPDecompressiMCURowNxN(void);
|
||||
static void __THPInverseDCTNoYPos(THPCoeff*, u32);
|
||||
static void __THPHuffDecodeDCTCompY(THPFileInfo*, THPCoeff*);
|
||||
static void __THPHuffDecodeDCTCompU(THPFileInfo*, THPCoeff*);
|
||||
static void __THPHuffDecodeDCTCompV(THPFileInfo*, THPCoeff*);
|
||||
|
||||
static const u8 __THPJpegNaturalOrder[80] = {
|
||||
0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33,
|
||||
40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36,
|
||||
29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54,
|
||||
47, 55, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63};
|
||||
|
||||
static const f64 __THPAANScaleFactor[8] = {
|
||||
1.0f, 1.387039845f, 1.306562965f, 1.175875602f, 1.0f, 0.785694958f, 0.541196100f, 0.275899379f,
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _DOLPHIN_THP
|
|
@ -0,0 +1,38 @@
|
|||
#ifndef _DOLPHIN_THPAUDIO
|
||||
#define _DOLPHIN_THPAUDIO
|
||||
|
||||
#include "dolphin/types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct THPAudioRecordHeader {
|
||||
u32 offsetNextChannel;
|
||||
u32 sampleSize;
|
||||
s16 lCoef[8][2];
|
||||
s16 rCoef[8][2];
|
||||
s16 lYn1;
|
||||
s16 lYn2;
|
||||
s16 rYn1;
|
||||
s16 rYn2;
|
||||
} THPAudioRecordHeader;
|
||||
|
||||
typedef struct THPAudioDecodeInfo {
|
||||
u8* encodeData;
|
||||
u32 offsetNibbles;
|
||||
u8 predictor;
|
||||
u8 scale;
|
||||
s16 yn1;
|
||||
s16 yn2;
|
||||
} THPAudioDecodeInfo;
|
||||
|
||||
u32 THPAudioDecode(s16* audioBuffer, u8* audioFrame, s32 flag);
|
||||
static s32 __THPAudioGetNewSample(THPAudioDecodeInfo* info);
|
||||
static void __THPAudioInitialize(THPAudioDecodeInfo* info, u8* ptr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _DOLPHIN_THPAUDIO
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef _THP_THPAUDIODECODE_H
|
||||
#define _THP_THPAUDIODECODE_H
|
||||
|
||||
#include "Dolphin/os.h"
|
||||
#include "THP/THPAudio.h"
|
||||
|
||||
static void* AudioDecoderForOnMemory(void* bufPtr);
|
||||
static void* AudioDecoder(void* _);
|
||||
static void AudioDecode(THPReadBuffer* readBuffer);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
BOOL CreateAudioDecodeThread(OSPriority prio, void* param);
|
||||
void AudioDecodeThreadStart();
|
||||
void AudioDecodeThreadCancel();
|
||||
|
||||
void PushFreeAudioBuffer(void* buf);
|
||||
void PushDecodedAudioBuffer(void* buf);
|
||||
|
||||
void* PopFreeAudioBuffer();
|
||||
void* PopDecodedAudioBuffer(s32 flags);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,36 @@
|
|||
#ifndef _THP_THPBUFFER_H
|
||||
#define _THP_THPBUFFER_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Size 0x10
|
||||
typedef struct THPTextureSet {
|
||||
u8* mYTexture; // _00
|
||||
u8* mUTexture; // _04
|
||||
u8* mVTexture; // _08
|
||||
s32 mFrameNumber; // _0C
|
||||
} THPTextureSet;
|
||||
|
||||
// Size 0xC
|
||||
typedef struct THPAudioBuffer {
|
||||
s16* mBuffer; // _00
|
||||
s16* mCurPtr; // _04
|
||||
u32 mValidSample; // _08
|
||||
} THPAudioBuffer;
|
||||
|
||||
// Size 0xC
|
||||
typedef struct THPReadBuffer {
|
||||
u8* mPtr; // _00
|
||||
s32 mFrameNumber; // _04
|
||||
BOOL mIsValid; // _08
|
||||
} THPReadBuffer;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef _THP_THPDRAW_H
|
||||
#define _THP_THPDRAW_H
|
||||
|
||||
#include "types.h"
|
||||
#include "Dolphin/GX/GXTypes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // ifdef __cplusplus
|
||||
|
||||
void THPGXRestore(void);
|
||||
void THPGXYuv2RgbSetup(GXRenderModeObj* obj);
|
||||
void THPGXYuv2RgbDraw(u32* yImage, u32* uImage, u32* vImage, s16 x, s16 y, s16 texWidth, s16 texHeight, s16 polyWidth, s16 polyHeight);
|
||||
void THPPlayerStop();
|
||||
BOOL THPPlayerSetVolume(int, int);
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif // ifdef __cplusplus
|
||||
|
||||
#endif
|
|
@ -0,0 +1,30 @@
|
|||
#ifndef _THP_THPFILE_H
|
||||
#define _THP_THPFILE_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Size 0x30
|
||||
typedef struct THPHeader {
|
||||
char mMagic[4]; // _00
|
||||
u32 mVersion; // _04
|
||||
u32 mBufferSize; // _08
|
||||
u32 mAudioMaxSamples; // _0C
|
||||
f32 mFrameRate; // _10
|
||||
u32 mNumFrames; // _14
|
||||
u32 mFirstFrameSize; // _18
|
||||
u32 mMovieDataSize; // _1C
|
||||
u32 mCompInfoDataOffsets; // _20
|
||||
u32 mOffsetDataOffsets; // _24
|
||||
u32 mMovieDataOffsets; // _28
|
||||
u32 mFinalFrameDataOffsets; // _2C
|
||||
} THPHeader;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,35 @@
|
|||
#ifndef _THP_THPINFO_H
|
||||
#define _THP_THPINFO_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Size 0xC
|
||||
typedef struct THPVideoInfo {
|
||||
u32 mXSize; // _00
|
||||
u32 mYSize; // _04
|
||||
u32 mVideoType; // _08
|
||||
} THPVideoInfo;
|
||||
|
||||
// Size 0x10
|
||||
typedef struct THPAudioInfo {
|
||||
u32 mSndChannels; // _00
|
||||
u32 mSndFrequency; // _04
|
||||
u32 mSndNumSamples; // _08
|
||||
u32 mSndNumTracks; // _0C
|
||||
} THPAudioInfo;
|
||||
|
||||
// Size 0x14
|
||||
typedef struct THPFrameCompInfo {
|
||||
u32 mNumComponents; // _00
|
||||
u8 mFrameComp[16]; // _04
|
||||
} THPFrameCompInfo;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,91 @@
|
|||
#ifndef _THP_THPPLAYER_H
|
||||
#define _THP_THPPLAYER_H
|
||||
|
||||
#include "types.h"
|
||||
#include "Dolphin/os.h"
|
||||
#include "Dolphin/gx.h"
|
||||
#include "THP/THPBuffer.h"
|
||||
#include "THP/THPFile.h"
|
||||
#include "THP/THPInfo.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Size: 0x1D0
|
||||
typedef struct THPPlayer {
|
||||
DVDFileInfo mFileInfo; // _00
|
||||
THPHeader mHeader; // _3C
|
||||
THPFrameCompInfo mCompInfo; // _6C
|
||||
THPVideoInfo mVideoInfo; // _80
|
||||
THPAudioInfo mAudioInfo; // _8C
|
||||
void* mThpWorkArea; // _9C
|
||||
BOOL mIsOpen; // _A0
|
||||
u8 mState; // _A4
|
||||
u8 mInternalState; // _A5
|
||||
u8 mPlayFlag; // _A6
|
||||
u8 mAudioExist; // _A7
|
||||
s32 mDvdError; // _A8
|
||||
s32 mVideoError; // _AC
|
||||
BOOL mIsOnMemory; // _B0
|
||||
u8* mMovieData; // _B4
|
||||
s32 mInitOffset; // _B8
|
||||
s32 mInitReadSize; // _BC
|
||||
s32 mInitReadFrame; // _C0
|
||||
u32 mCurField; // _C4
|
||||
s64 mRetraceCount; // _C8
|
||||
s32 mPrevCount; // _D0
|
||||
s32 mCurCount; // _D4
|
||||
s32 mVideoDecodeCount; // _D8
|
||||
f32 mCurVolume; // _DC
|
||||
f32 mTargetVolume; // _E0
|
||||
f32 mDeltaVolume; // _E4
|
||||
s32 mRampCount; // _E8
|
||||
s32 mCurAudioTrack; // _EC
|
||||
s32 mCurVideoNumber; // _F0
|
||||
s32 mCurAudioNumber; // _F4
|
||||
THPTextureSet* mDispTextureSet; // _F8
|
||||
THPAudioBuffer* mPlayAudioBuffer; // _FC
|
||||
THPReadBuffer mReadBuffer[10]; // _100
|
||||
THPTextureSet mTextureSet[3]; // _178
|
||||
THPAudioBuffer mAudioBuffer[3]; // _1A8
|
||||
} THPPlayer;
|
||||
|
||||
extern THPPlayer ActivePlayer;
|
||||
|
||||
BOOL THPPlayerInit(int _);
|
||||
void THPPlayerQuit();
|
||||
BOOL THPPlayerOpen(const char* fileName, BOOL onMemory);
|
||||
BOOL THPPlayerClose();
|
||||
BOOL THPPlayerPlay();
|
||||
void THPPlayerStop();
|
||||
BOOL THPPlayerPause();
|
||||
BOOL THPPlayerPrepare(int offset, u8 flag, int audioTrack);
|
||||
|
||||
BOOL THPPlayerSetBuffer(u8* data);
|
||||
|
||||
u32 THPPlayerCalcNeedMemory();
|
||||
|
||||
BOOL THPPlayerGetVideoInfo(void* dst);
|
||||
BOOL THPPlayerGetAudioInfo(void* dst);
|
||||
// f32 THPPlayerGetFrameRate();
|
||||
BOOL THPPlayerSetVolume(int vol, int duration);
|
||||
|
||||
int THPPlayerDrawCurrentFrame(GXRenderModeObj* obj, int x, int y, int polyWidth,
|
||||
int polyHeight); // TODO, parameter names from dwarf info if it exists
|
||||
u32 THPPlayerGetTotalFrame();
|
||||
u8 THPPlayerGetState();
|
||||
|
||||
void THPPlayerDrawDone();
|
||||
void THPPlayerPostDrawDone();
|
||||
|
||||
// this should go in a dolphin THP header eventually
|
||||
BOOL THPInit(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
void PrepareReady(int msg);
|
||||
|
||||
#endif /* _THP_THPPLAYER_H */
|
|
@ -0,0 +1,28 @@
|
|||
#ifndef _THP_THPREAD_H
|
||||
#define _THP_THPREAD_H
|
||||
|
||||
#include "dolphin/thp/THPBuffer.h"
|
||||
#include "dolphin/os.h"
|
||||
|
||||
static void* Reader(void* arg);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // ifdef __cplusplus
|
||||
|
||||
BOOL CreateReadThread(OSPriority priority);
|
||||
void ReadThreadStart();
|
||||
void ReadThreadCancel();
|
||||
OSMessage PopReadedBuffer();
|
||||
BOOL PushReadedBuffer(OSMessage*);
|
||||
OSMessage PopFreeReadBuffer();
|
||||
BOOL PushFreeReadBuffer(OSMessage*);
|
||||
OSMessage PopReadedBuffer2();
|
||||
BOOL PushReadedBuffer2(OSMessage*);
|
||||
|
||||
extern u8 gTHPReaderDvdAccess;
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -0,0 +1,31 @@
|
|||
#ifndef _DOLPHIN_THPVIDEODECODE
|
||||
#define _DOLPHIN_THPVIDEODECODE
|
||||
|
||||
#include "dolphin/thp/THPRead.h"
|
||||
|
||||
static void* VideoDecoder(void*);
|
||||
static void* VideoDecoderForOnMemory(void*);
|
||||
static void VideoDecode(THPReadBuffer*);
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // ifdef __cplusplus
|
||||
s32 THPVideoDecode(void* file, void* tileY, void* tileU, void* tileV, void* work);
|
||||
BOOL CreateVideoDecodeThread(OSPriority priority, void* task);
|
||||
void VideoDecodeThreadStart();
|
||||
void VideoDecodeThreadCancel();
|
||||
OSMessage PopFreeTextureSet();
|
||||
BOOL PushFreeTextureSet(OSMessage*);
|
||||
OSMessage PopDecodedTextureSet(s32 flags);
|
||||
BOOL PushDecodedTextureSet(OSMessage*);
|
||||
|
||||
extern BOOL VideoDecodeThreadCreated;
|
||||
extern OSMessageQueue FreeTextureSetQueue;
|
||||
extern OSMessageQueue DecodedTextureSetQueue;
|
||||
extern OSThread VideoDecodeThread;
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif // _DOLPHIN_THPVIDEODECODE
|
|
@ -0,0 +1,170 @@
|
|||
#include <dolphin/thp.h>
|
||||
|
||||
/*
|
||||
* --INFO--
|
||||
* Address: 800FE6B0
|
||||
* Size: 0003B0
|
||||
*/
|
||||
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;
|
||||
|
||||
if (audioBuffer == NULL || audioFrame == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 (header->offsetNextChannel == 0) {
|
||||
__THPAudioInitialize(&decInfo, left);
|
||||
|
||||
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;
|
||||
|
||||
if (sample > 0x8000) {
|
||||
yn += 0x10000;
|
||||
} else if ((sample == 0x8000) && ((yn & 0x10000) != 0)) {
|
||||
yn += 0x10000;
|
||||
}
|
||||
|
||||
yn += 0x8000;
|
||||
|
||||
if (yn > 2147483647LL) {
|
||||
yn = 2147483647LL;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
yn += 0x8000;
|
||||
|
||||
if (yn > 2147483647LL) {
|
||||
yn = 2147483647LL;
|
||||
}
|
||||
|
||||
if (yn < -2147483648LL) {
|
||||
yn = -2147483648LL;
|
||||
}
|
||||
|
||||
*decLeftPtr = (s16)(yn >> 16);
|
||||
decLeftPtr += step;
|
||||
yn2 = yn1;
|
||||
yn1 = (s16)(yn >> 16);
|
||||
}
|
||||
|
||||
__THPAudioInitialize(&decInfo, right);
|
||||
|
||||
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;
|
||||
|
||||
yn += 0x8000;
|
||||
|
||||
if (yn > 2147483647LL) {
|
||||
yn = 2147483647LL;
|
||||
}
|
||||
|
||||
if (yn < -2147483648LL) {
|
||||
yn = -2147483648LL;
|
||||
}
|
||||
|
||||
*decRightPtr = (s16)(yn >> 16);
|
||||
decRightPtr += step;
|
||||
yn2 = yn1;
|
||||
yn1 = (s16)(yn >> 16);
|
||||
}
|
||||
}
|
||||
|
||||
return header->sampleSize;
|
||||
}
|
||||
|
||||
/*
|
||||
* --INFO--
|
||||
* Address: 800FEA60
|
||||
* Size: 000090
|
||||
*/
|
||||
static s32 __THPAudioGetNewSample(THPAudioDecodeInfo* info) {
|
||||
s32 sample;
|
||||
|
||||
if (!(info->offsetNibbles & 0x0f)) {
|
||||
info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4);
|
||||
info->scale = (u8)((*(info->encodeData) & 0xF));
|
||||
info->encodeData++;
|
||||
info->offsetNibbles += 2;
|
||||
}
|
||||
|
||||
if (info->offsetNibbles & 0x1) {
|
||||
sample = (s32)((*(info->encodeData) & 0xF) << 28) >> 28;
|
||||
info->encodeData++;
|
||||
} else {
|
||||
sample = (s32)((*(info->encodeData) & 0xF0) << 24) >> 28;
|
||||
}
|
||||
|
||||
info->offsetNibbles++;
|
||||
return sample;
|
||||
}
|
||||
|
||||
/*
|
||||
* --INFO--
|
||||
* Address: 800FEAF0
|
||||
* Size: 00003C
|
||||
*/
|
||||
static void __THPAudioInitialize(THPAudioDecodeInfo* info, u8* ptr) {
|
||||
info->encodeData = ptr;
|
||||
info->offsetNibbles = 2;
|
||||
info->predictor = (u8)((*(info->encodeData) & 0x70) >> 4);
|
||||
info->scale = (u8)((*(info->encodeData) & 0xF));
|
||||
info->encodeData++;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue