diff --git a/include/JSystem/JAudio/JAIBasic.h b/include/JSystem/JAudio/JAIBasic.h index 671db4d1f..141efda92 100644 --- a/include/JSystem/JAudio/JAIBasic.h +++ b/include/JSystem/JAudio/JAIBasic.h @@ -51,7 +51,7 @@ public: void stopAllSound(u32); void stopAllSound(u32, void*); void deleteObject(void*); - void getSoundOffsetNumberFromID(u32); + int getSoundOffsetNumberFromID(u32); void setSeCategoryVolume(u8, u8); static u16 setParameterSeqSync(JASystem::TTrack*, u16); bool allocStreamBuffer(void*, s32); diff --git a/include/JSystem/JAudio/JAISound.h b/include/JSystem/JAudio/JAISound.h index fd939630f..668073252 100644 --- a/include/JSystem/JAudio/JAISound.h +++ b/include/JSystem/JAudio/JAISound.h @@ -69,7 +69,7 @@ public: JAInter::SeParameter* getSeParameter(); JAInter::StreamParameter* getStreamParameter(); int getTrackPortRoute(u8, u8); - int checkSoundHandle(u32, void*); + u32 checkSoundHandle(u32, void*); void initParameter(JAISound**, JAInter::Actor*, u32, u32, u8, void*); // TODO @@ -146,13 +146,15 @@ public: namespace JAInter { class MoveParaSet { public: - MoveParaSet(f32 param_1=1.0f) { + MoveParaSet(f32 param_1=1.0f) { init(param_1); } + int set(f32 param_1, u32 param_2); + bool move(); + + void init(f32 param_1) { field_0x4 = param_1; field_0x0 = param_1; field_0xc = 0; } - int set(f32 param_1, u32 param_2); - bool move(); /* 0x00 */ f32 field_0x0; /* 0x04 */ f32 field_0x4; diff --git a/include/JSystem/JAudio/JAISoundTable.h b/include/JSystem/JAudio/JAISoundTable.h index cb9dac0d4..72754c7b2 100644 --- a/include/JSystem/JAudio/JAISoundTable.h +++ b/include/JSystem/JAudio/JAISoundTable.h @@ -6,15 +6,15 @@ namespace JAInter { namespace SoundTable { void init(u8*, u32); - void getInfoPointer(u32); - void getInfoFormat(u32); + u8* getInfoPointer(u32); + u8 getInfoFormat(u32); u8 getCategotyMax(); extern u8 mVersion; extern u8 mCategotyMax; - extern s16* mSoundMax; + extern u16* mSoundMax; extern u32 mDatasize; - extern int* mPointerCategory; + extern u8** mPointerCategory; extern u8* mAddress; } } diff --git a/include/JSystem/JAudio/JAIStreamMgr.h b/include/JSystem/JAudio/JAIStreamMgr.h index e6bf75ea0..caec95e2e 100644 --- a/include/JSystem/JAudio/JAIStreamMgr.h +++ b/include/JSystem/JAudio/JAIStreamMgr.h @@ -16,9 +16,29 @@ namespace JASystem { namespace JAInter { class Actor; + struct streamUpdate_t { + streamUpdate_t() { field_0x14 = 0; } + u8 field_0x0; + u8 field_0x1; + u8 field_0x2; + f32 field_0x4; + f32 field_0x8; + f32 field_0xc; + int field_0x10; + JAISound* field_0x14; + }; + class StreamParameter { public: - /* 0x00 */ u8 field_0x0; + /* 0x000 */ u8 field_0x0; + /* 0x004 */ int field_0x4; + /* 0x008 */ int field_0x8; + /* 0x00C */ int field_0xc; + /* 0x010 */ int field_0x10; + /* 0x014 */ JAInter::MoveParaSet field_0x14[20]; + /* 0x154 */ JAInter::MoveParaSet* pitch; + /* 0x158 */ JAInter::MoveParaSet* pan; + /* 0x15C */ streamUpdate_t* field_0x15c; }; namespace StreamMgr { @@ -31,13 +51,24 @@ namespace JAInter { void checkRequestStream(); void checkPlayingStream(); + struct flags_t { + u8 flag1 : 1; + u8 flag2 : 1; + u8 flag3 : 1; + u8 flag4 : 1; + u8 flag5 : 1; + u8 flag6 : 1; + u8 flag7 : 1; + u8 flag8 : 1; + }; + extern LinkSound streamControl; - extern u8 flags; - extern int streamUpdate; // TODO pointer to something, not actually an int + extern flags_t flags; + extern streamUpdate_t* streamUpdate; extern u8* streamList; extern u8* initOnCodeStrm; - inline int getUpdateInfo() { return streamUpdate; } + inline streamUpdate_t* getUpdateInfo() { return streamUpdate; } } namespace StreamLib { @@ -72,27 +103,40 @@ namespace JAInter { void __start(); s32 callBack(void* param_1); + struct StreamHeader { + int field_0x0; + int field_0x4; + u16 field_0x8; + u16 field_0xa; + u16 field_0xc; + u16 field_0xe; + u32 field_0x10; + u32 field_0x14; + int field_0x18; + int field_0x1c; + }; + extern s16 filter_table[]; extern s16 table4[]; extern DVDFileInfo finfo; - extern u32 header[]; + extern StreamHeader header; extern char Filename[]; extern JASystem::Kernel::TSolidHeap streamHeap; extern u32 LOOP_BLOCKS; extern int LOOP_SAMPLESIZE; extern int outputmode; - extern int adpcm_remain; - extern int adpcm_loadpoint; - extern int loadsize; - extern int adpcm_buffer; - extern int loop_buffer; - extern int store_buffer; + extern u32 adpcm_remain; + extern u32 adpcm_loadpoint; + extern u32 loadsize; + extern s16* adpcm_buffer; + extern s16*** loop_buffer; + extern void** store_buffer; extern JASystem::TDSPChannel* assign_ch[2]; - extern int playside; + extern u32 playside; extern int playback_samples; extern int loadup_samples; extern u32 adpcmbuf_state; - extern int movieframe; + extern u32 movieframe; extern bool stopflag; extern bool stopflag2; extern u8 playflag; diff --git a/include/JSystem/JAudio/JASDSPInterface.h b/include/JSystem/JAudio/JASDSPInterface.h index 2cb710539..0d6732315 100644 --- a/include/JSystem/JAudio/JASDSPInterface.h +++ b/include/JSystem/JAudio/JASDSPInterface.h @@ -87,7 +87,7 @@ namespace JASystem { /* 0x68 */ int field_0x68; /* 0x6C */ u32 field_0x6c; /* 0x70 */ u8 field_0x70[0x74 - 0x70]; - /* 0x74 */ int field_0x74; + /* 0x74 */ u32 field_0x74; /* 0x78 */ short field_0x78[4]; /* 0x80 */ short field_0x80[20]; /* 0xA8 */ short field_0xa8[4]; @@ -100,9 +100,9 @@ namespace JASystem { /* 0x108 */ short field_0x108; /* 0x10A */ u16 field_0x10a; /* 0x10C */ u32 field_0x10c; - /* 0x110 */ int field_0x110; - /* 0x114 */ int field_0x114; - /* 0x118 */ int field_0x118; + /* 0x110 */ u32 field_0x110; + /* 0x114 */ u32 field_0x114; + /* 0x118 */ u32 field_0x118; /* 0x11C */ int field_0x11c; /* 0x120 */ short field_0x120[8]; /* 0x130 */ u8 field_0x130[0x148 - 0x130]; diff --git a/src/JSystem/JAudio/JAIBasic.cpp b/src/JSystem/JAudio/JAIBasic.cpp index c05ba7632..6d1484132 100644 --- a/src/JSystem/JAudio/JAIBasic.cpp +++ b/src/JSystem/JAudio/JAIBasic.cpp @@ -297,7 +297,7 @@ f32 JAIBasic::getMapInfoFxParameter(u32 param_1) { } /* 80290DC4-80290E14 .text getSoundOffsetNumberFromID__8JAIBasicFUl */ -void JAIBasic::getSoundOffsetNumberFromID(u32) { +int JAIBasic::getSoundOffsetNumberFromID(u32) { /* Nonmatching */ } diff --git a/src/JSystem/JAudio/JAISound.cpp b/src/JSystem/JAudio/JAISound.cpp index 6f5b58c5f..33245bb48 100644 --- a/src/JSystem/JAudio/JAISound.cpp +++ b/src/JSystem/JAudio/JAISound.cpp @@ -632,7 +632,7 @@ int JAISound::getTrackPortRoute(u8, u8) { } /* 8029AE88-8029AEF8 .text checkSoundHandle__8JAISoundFUlPv */ -int JAISound::checkSoundHandle(u32, void*) { +u32 JAISound::checkSoundHandle(u32, void*) { /* Nonmatching */ } diff --git a/src/JSystem/JAudio/JAISoundTable.cpp b/src/JSystem/JAudio/JAISoundTable.cpp index b08671bff..3c0a5d018 100644 --- a/src/JSystem/JAudio/JAISoundTable.cpp +++ b/src/JSystem/JAudio/JAISoundTable.cpp @@ -5,13 +5,14 @@ #include "JSystem/JAudio/JAISoundTable.h" #include "JSystem/JAudio/JAIBasic.h" +#include "JSystem/JAudio/JAIGlobalParameter.h" #include "JSystem/JKernel/JKRSolidHeap.h" u8 JAInter::SoundTable::mVersion; u8 JAInter::SoundTable::mCategotyMax; -s16* JAInter::SoundTable::mSoundMax; +u16* JAInter::SoundTable::mSoundMax; u32 JAInter::SoundTable::mDatasize; -int* JAInter::SoundTable::mPointerCategory; +u8** JAInter::SoundTable::mPointerCategory; u8* JAInter::SoundTable::mAddress; /* 8029B570-8029B6FC .text init__Q27JAInter10SoundTableFPUcUl */ @@ -20,21 +21,62 @@ void JAInter::SoundTable::init(u8* param_1, u32 param_2) { mAddress = param_1; mDatasize = param_2; mVersion = param_1[3]; - mSoundMax = new (JAIBasic::getCurrentJAIHeap(), 4) s16[18]; - mPointerCategory = new (JAIBasic::getCurrentJAIHeap(), 4) int[18]; - for (int i = 0; i < 18; i++) { - // TODO + mSoundMax = new (JAIBasic::getCurrentJAIHeap(), 4) u16[18]; + mPointerCategory = new (JAIBasic::getCurrentJAIHeap(), 4) u8*[18]; + for (u8 i = 0; i < 18; i++) { + mSoundMax[i] = *(u16*)(mAddress + i * 4 + 6); + mPointerCategory[i] = mAddress + *(u16*)(mAddress + i * 4 + 8) * 16 + 80; + if (i < 16 && mSoundMax[i] != 0) { + mCategotyMax = i + 1; + } } } /* 8029B6FC-8029B8CC .text getInfoPointer__Q27JAInter10SoundTableFUl */ -void JAInter::SoundTable::getInfoPointer(u32) { - /* Nonmatching */ +u8* JAInter::SoundTable::getInfoPointer(u32 param_1) { + JUT_ASSERT_MSG(52, mAddress, "getInfoPointer サウンドテーブルがありません\n"); + u8* r31 = NULL; + u32 _category; + switch (param_1 & 0xC0000000) { + case 0: + _category = param_1 >> 12 & 0xff; + JUT_ASSERT_MSG(61, (_categorymakeSound(JAIGlobalParameter::getParamStreamControlBufferMax()); + JUT_ASSERT_MSG(46, soundObjects, "JAIStreamMgr::initHeap Cannot Alloc Heap!!\n"); + streamControl.init(soundObjects, JAIGlobalParameter::getParamStreamControlBufferMax()); + for (int i = 0; i < JAIGlobalParameter::getParamStreamParameterBufferMax(); i++) { + StreamParameter* _para = new (JAIBasic::getCurrentJAIHeap(), 32) StreamParameter(); + JUT_ASSERT_MSG(52, _para, "JAIStreamMgr::initHeap Cannot Alloc Heap!!\n"); + _para->pan = new (JAIBasic::getCurrentJAIHeap(), 32) MoveParaSet[JAIGlobalParameter::getParamStreamParameterLines()]; + JUT_ASSERT_MSG(54, _para->pan, "JAIStreamMgr::initHeap Cannot Alloc Heap!!\n"); + _para->pitch = new (JAIBasic::getCurrentJAIHeap(), 32) MoveParaSet[JAIGlobalParameter::getParamStreamParameterLines()]; + JUT_ASSERT_MSG(56, _para->pitch, "JAIStreamMgr::initHeap Cannot Alloc Heap!!\n"); + streamControl.Buffer[i].field_0x3c = _para; + } + streamUpdate = new (JAIBasic::getCurrentJAIHeap(), 32) streamUpdate_t(); + JUT_ASSERT_MSG(61, streamUpdate, "JAIStreamMgr::initHeap Cannot Alloc Heap!!\n"); + streamUpdate_t* tmp = streamUpdate; + tmp->field_0x0 = 0; + tmp->field_0x1 = 0; + tmp->field_0x4 = 1.0f; + tmp->field_0x8 = 1.0f; + tmp->field_0xc = 0.5f; + tmp->field_0x10 = 0; + tmp->field_0x14 = 0; } /* 8029BEB4-8029C04C .text storeStreamBuffer__Q27JAInter9StreamMgrFPP8JAISoundPQ27JAInter5ActorUlUlUcPv */ -void JAInter::StreamMgr::storeStreamBuffer(JAISound**, JAInter::Actor*, u32, u32, u8, void*) { +void JAInter::StreamMgr::storeStreamBuffer(JAISound** param_1, JAInter::Actor* param_2, u32 param_3, u32 param_4, u8 param_5, void* param_6) { /* Nonmatching */ + if (param_1 && param_1[0] && param_1[0]->checkSoundHandle(param_3, param_6)) { + return; + } + if (streamControl.field_0x4) { + releaseStreamBuffer(streamControl.field_0x4, 0); + } + JAISound* sound = streamControl.getSound(); + StreamParameter* para = sound->getStreamParameter(); + para->field_0x0 = 0; + para->field_0x4 = 0; + para->field_0x8 = 0; + para->field_0xc = 0; + para->field_0x10 = 0; + for (u32 i = 0; i < 20; i++) { + MoveParaSet* movePara = ¶->field_0x14[i]; + movePara->init(1.0f); + } + for (u32 i = 0; i < JAIGlobalParameter::getParamStreamParameterLines(); i++) { + para->pitch[i].init(1.0f); + para->pan[i].init(0.5f); + } + sound->field_0x5 = 1; + sound->field_0x6 = 10; + streamUpdate->field_0x2 = 0; + sound->initParameter(param_1, param_2, param_3, param_4, param_5, param_6); } /* 8029C04C-8029C0F0 .text releaseStreamBuffer__Q27JAInter9StreamMgrFP8JAISoundUl */ -void JAInter::StreamMgr::releaseStreamBuffer(JAISound*, u32) { - /* Nonmatching */ +void JAInter::StreamMgr::releaseStreamBuffer(JAISound* param_1, u32 param_2) { + if (param_2 == 0 || param_1->field_0x5 < 4) { + StreamLib::stop(); + param_1->field_0x5 = 0; + streamUpdate->field_0x14 = 0; + param_1->clearMainSoundPPointer(); + streamControl.releaseSound(param_1); + JASystem::Dvd::unpauseDvdT(); + } else { + if (param_1->getStreamParameter()->field_0x15c) { + param_1->getStreamParameter()->field_0x15c->field_0x10 |= 2; + param_1->field_0x14 = param_2; + } + } } /* 8029C0F0-8029C128 .text processGFrameStream__Q27JAInter9StreamMgrFv */ void JAInter::StreamMgr::processGFrameStream() { - /* Nonmatching */ - if ((flags >> 6 & 1) == 0) { + if (!flags.flag2) { checkPlayingStream(); checkRequestStream(); checkWaitStream(); @@ -105,17 +177,63 @@ void JAInter::StreamMgr::processGFrameStream() { /* 8029C128-8029C1D8 .text checkEntriedStream__Q27JAInter9StreamMgrFv */ void JAInter::StreamMgr::checkEntriedStream() { - /* Nonmatching */ + for (JAISound* sound = streamControl.field_0x4; sound; sound = sound->field_0x34) { + if (sound->field_0x5 != 1 || StreamLib::getPlayingFlag() == 1) { + continue; + } + sound->field_0x5 = 2; + sound->getStreamParameter()->field_0x15c = streamUpdate; + streamUpdate_t* tmp = streamUpdate; + tmp->field_0x0 = 0; + tmp->field_0x1 = 0; + tmp->field_0x4 = 1.0f; + tmp->field_0x8 = 1.0f; + tmp->field_0xc = 0.5f; + tmp->field_0x10 = 0; + tmp->field_0x14 = 0; + streamUpdate->field_0x14 = sound; + } } /* 8029C1D8-8029C2AC .text checkWaitStream__Q27JAInter9StreamMgrFv */ void JAInter::StreamMgr::checkWaitStream() { /* Nonmatching */ + JAISound* sound = streamUpdate->field_0x14; + if (!sound) { + return; + } + if (sound->field_0x5 != 2) { + return; + } + char buffer[64]; + strcpy(buffer, JAIGlobalParameter::getParamStreamPath()); + //strcat(buffer, streamList[JAIBasic::getInterface()->getSoundOffsetNumberFromID(sound->field_0xc)].field_0x10); + JAIBasic::getInterface()->setSeExtParameter(sound); + sound->field_0x5 = 3; + checkPlayingStream(); + //StreamLib::start(buffer, sound->getStreamParameter()->field_0x4, streamList[sound->field_0xc]->field_0x20); + StreamLib::setPrepareFlag(1); } /* 8029C2AC-8029C344 .text checkRequestStream__Q27JAInter9StreamMgrFv */ void JAInter::StreamMgr::checkRequestStream() { - /* Nonmatching */ + JAISound* sound = streamUpdate->field_0x14; + if (!sound) { + return; + } + if (sound->field_0x5 != 3) { + return; + } + if (streamUpdate->field_0x2) { + return; + } + sound->field_0x5 = 4; + if (sound->field_0x14 > 1) { + sound->setStreamInterVolume(7, 0.0, 0); + sound->setStreamInterVolume(7, 1.0, sound->field_0x14); + StreamLib::setVolume(0.0); + } + StreamLib::setPrepareFlag(0); } /* 8029C344-8029C730 .text checkPlayingStream__Q27JAInter9StreamMgrFv */ @@ -124,8 +242,29 @@ void JAInter::StreamMgr::checkPlayingStream() { } /* 8029C730-8029C858 .text Play_DirectPCM__Q27JAInter9StreamLibFPQ28JASystem11TDSPChannelPsUsUlsUs */ -void JAInter::StreamLib::Play_DirectPCM(JASystem::TDSPChannel*, s16*, u16, u32, s16, u16) { - /* Nonmatching */ +void JAInter::StreamLib::Play_DirectPCM(JASystem::TDSPChannel* param_1, s16* param_2, u16 param_3, u32 param_4, s16 param_5, u16 param_6) { + JASystem::DSPInterface::DSPBuffer* buffer = JASystem::DSPInterface::getDSPHandle(param_1->mNumber); + buffer->field_0x118 = (u32)param_2; + buffer->field_0x102 = 0; + buffer->field_0x100 = 33; + if (JAInter::StreamLib::header.field_0x10 != 0) { + buffer->field_0x74 = -1; + } else { + buffer->field_0x74 = param_4; + } + buffer->field_0x110 = (u32)param_2; + buffer->field_0x114 = param_3 << 16; + JASystem::DSPInterface::getDSPHandle(param_1->mNumber)->setMixerInitDelayMax(0); + for (u8 i = 0; i < 6; i++) { + if (i < 2) { + JASystem::DSPInterface::getDSPHandle(param_1->mNumber)->setMixerInitVolume(i, param_5, 0); + } else { + JASystem::DSPInterface::getDSPHandle(param_1->mNumber)->setMixerInitVolume(i, 0, 0); + } + JASystem::DSPInterface::getDSPHandle(param_1->mNumber)->setBusConnect(i, i + 1); + } + JASystem::DSPInterface::getDSPHandle(param_1->mNumber)->setPitch(param_6); + param_1->play(); } /* 8029C858-8029C864 .text Get_DirectPCM_LoopRemain__Q27JAInter9StreamLibFPQ38JASystem12DSPInterface9DSPBuffer */ @@ -148,8 +287,31 @@ void JAInter::StreamLib::init(bool param_1) { } /* 8029C8BC-8029CBF0 .text allocBuffer__Q27JAInter9StreamLibFPvl */ -void JAInter::StreamLib::allocBuffer(void*, s32) { - /* Nonmatching */ +void JAInter::StreamLib::allocBuffer(void* param_1, s32 param_2) { + if (allocFlag) { + return; + } + streamHeap.init((u8*)param_1, param_2); + loop_buffer = (s16***)streamHeap.alloc(8); + JUT_ASSERT_3(555, loop_buffer); + for (u32 i = 0; i < 2; i++) { + loop_buffer[i] = (s16**)streamHeap.alloc(LOOP_BLOCKS << 2); + JUT_ASSERT_3(559, loop_buffer[i]); + for (int j = 0; j < LOOP_BLOCKS; j++) { + loop_buffer[i][j] = (s16*)streamHeap.alloc(0x2800); + JUT_ASSERT_3(563, loop_buffer[i][j]); + } + }; + store_buffer = (void**)streamHeap.alloc(8); + JUT_ASSERT_3(568, store_buffer); + for (u32 i = 0; i < 2; i++) { + store_buffer[i] = streamHeap.alloc(0x5000); + JUT_ASSERT_3(572, store_buffer[i]); + } + JUT_ASSERT_3(575, loop_buffer); + adpcm_buffer = (s16*)streamHeap.alloc(0x5000); + JUT_ASSERT_3(577, adpcm_buffer); + allocFlag = true; } /* 8029CBF0-8029CC50 .text deallocBuffer__Q27JAInter9StreamLibFv */ @@ -165,6 +327,19 @@ bool JAInter::StreamLib::deallocBuffer() { /* 8029CC50-8029CCA4 .text getNeedBufferSize__Q27JAInter9StreamLibFv */ u32 JAInter::StreamLib::getNeedBufferSize() { /* Nonmatching */ + u32 size = 0x20; + for (u32 i = 0; i < 2; i++) { + size += ((LOOP_BLOCKS << 2) & ~0x1F) + 0x20; + for (u32 j = 0; j < LOOP_BLOCKS; j++) { + size += 0x2820; + } + } + size += 0x20; + for (u32 i = 0; i < 2; i++) { + size += 0x5020; + } + size += 0x5020; + return size; } /* 8029CCA4-8029CCAC .text setAllocBufferCallback__Q27JAInter9StreamLibFPFv_v */ @@ -186,6 +361,16 @@ void JAInter::StreamLib::sync(s32 param_1) { /* 8029CCD0-8029CD8C .text __DecodePCM__Q27JAInter9StreamLibFv */ void JAInter::StreamLib::__DecodePCM() { /* Nonmatching */ + s16* dst1 = loop_buffer[0][playside]; + s16* dst2 = loop_buffer[1][playside]; + s16* src = adpcm_buffer; + for (int i = 0; i < loadsize >> 2; dst2++, i++, dst1++, src += 2) { + dst1[0] = src[0]; + dst2[0] = src[1]; + } + loadup_samples += loadsize >> 2; + DCStoreRange(loop_buffer[0][playside], loadsize >> 1); + DCStoreRange(loop_buffer[1][playside], loadsize >> 1); } /* 8029CD8C-8029D134 .text __DecodeADPCM__Q27JAInter9StreamLibFv */ @@ -195,7 +380,15 @@ void JAInter::StreamLib::__DecodeADPCM() { /* 8029D134-8029D1C8 .text __Decode__Q27JAInter9StreamLibFv */ void JAInter::StreamLib::__Decode() { - /* Nonmatching */ + switch (header.field_0xa) { + case 2: + __DecodePCM(); + return; + case 4: + __DecodeADPCM(); + return; + } + JUT_ASSERT_3(948, 0); } /* 8029D1C8-8029D1E8 .text __LoadFin__Q27JAInter9StreamLibFlP11DVDFileInfo */ @@ -265,6 +458,7 @@ u8 JAInter::StreamLib::getPlayingFlag() { /* 8029D3BC-8029D424 .text setDecodedBufferBlocks__Q27JAInter9StreamLibFUl */ void JAInter::StreamLib::setDecodedBufferBlocks(u32 param_1) { + /* Nonmatching */ if (param_1 < 3) { OSReport("setDecodedBufferBlocks : 3ブロック以上必要ですので、使用ブロックを%dから3に変更します。\n"); param_1 = 3; @@ -277,7 +471,11 @@ void JAInter::StreamLib::setDecodedBufferBlocks(u32 param_1) { /* 8029D424-8029D464 .text LoopInit__Q27JAInter9StreamLibFv */ void JAInter::StreamLib::LoopInit() { - /* Nonmatching */ + loop_start_flag = true; + u32 var1 = (header.field_0x14 - (header.field_0x14 & 0x7F) >> 4) * 18 + 32; + adpcm_loadpoint = var1; + var1 -= 32; + adpcm_remain = header.field_0x0 - var1; } /* 8029D464-8029D4C0 .text directPlayWait__Q27JAInter9StreamLibFPv */