diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 938c9af2..8df1885b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -19872,7 +19872,7 @@ fn_8035BB20 = .text:0x8035BB20; // type:function size:0x8 fn_8035BB30 = .text:0x8035BB30; // type:function size:0x8 fn_8035BB40 = .text:0x8035BB40; // type:function size:0x8 fn_8035BB50 = .text:0x8035BB50; // type:function size:0x8 -fn_8035BB60 = .text:0x8035BB60; // type:function size:0x8 +@84@at_0x0c__Q34nw4r3snd12Sound3DActorFPvPQ44nw4r3snd6detail10BasicSound = .text:0x8035BB60; // type:function size:0x8 fn_8035BB70 = .text:0x8035BB70; // type:function size:0x8 fn_8035BB80 = .text:0x8035BB80; // type:function size:0x3C __dt__Q34nw4r3snd13Sound3DEngineFv = .text:0x8035BBC0; // type:function size:0x40 @@ -25437,9 +25437,9 @@ NoteOn__Q44nw4r3snd6detail8SeqTrackFiilb = .text:0x80474410; // type:function si __ct__Q34nw4r3snd12Sound3DActorFRQ34nw4r3snd18SoundArchivePlayerRQ34nw4r3snd14Sound3DManager = .text:0x80474820; // type:function size:0x90 __dt__Q34nw4r3snd12Sound3DActorFv = .text:0x804748B0; // type:function size:0xD4 SetupSound__Q34nw4r3snd12Sound3DActorFPQ34nw4r3snd11SoundHandleUlPCQ44nw4r3snd14SoundStartable9StartInfoPv = .text:0x80474990; // type:function size:0x1A8 -SetPosition_nw4r_snd_Sound3DActor = .text:0x80474B40; // type:function size:0x50 -FUN_80474b90 = .text:0x80474B90; // type:function size:0x3C -@84@__dt__Q34nw4r3snd12Sound3DActorFv = .text:0x80474BD0; // type:function size:0x8 +SetPosition__Q34nw4r3snd12Sound3DActorFRCQ34nw4r4math4VEC3 = .text:0x80474B40; // type:function size:0x50 +at_0x0c__Q34nw4r3snd12Sound3DActorFPvPQ44nw4r3snd6detail10BasicSound = .text:0x80474B90; // type:function size:0x3C +@84@__dt__Q34nw4r3snd12Sound3DActorFv = .text:0x80474BD0; // type:function size:0x8 scope:weak CalcVolumeAndPriority__Q34nw4r3snd17Sound3DCalculatorFRCQ34nw4r3snd14Sound3DManagerRCQ34nw4r3snd15Sound3DListenerRCQ34nw4r3snd12Sound3DParamPfPi = .text:0x80474BE0; // type:function size:0x13C CalcPan__Q34nw4r3snd17Sound3DCalculatorFRCQ34nw4r3snd14Sound3DManagerRCQ34nw4r3snd15Sound3DListenerRCQ34nw4r3snd12Sound3DParamRCQ44nw4r3snd17Sound3DCalculator12CalcPanParamPfPf = .text:0x80474D20; // type:function size:0x160 CalcPitch__Q34nw4r3snd17Sound3DCalculatorFRCQ34nw4r3snd14Sound3DManagerRCQ34nw4r3snd15Sound3DListenerRCQ34nw4r3snd12Sound3DParamPf = .text:0x80474E80; // type:function size:0x1B0 @@ -29158,7 +29158,7 @@ DecibelSquareTable__Q44nw4r3snd6detail12EnvGenerator = .rodata:0x804F8FB8; // ty @LOCAL@SetAttack__Q44nw4r3snd6detail12EnvGeneratorFi@attackTable = .rodata:0x804F90B8; // type:object size:0x200 scope:weak @LOCAL@GetSinIdx__Q44nw4r3snd6detail3LfoFi@sinTable = .rodata:0x804F92B8; // type:object size:0x21 scope:weak @2213 = .rodata:0x804F92E0; // type:object size:0x24 scope:local data:4byte -lbl_804F9308 = .rodata:0x804F9308; // type:object size:0x18 data:4byte +@4458 = .rodata:0x804F9308; // type:object size:0x14 scope:local data:4byte NoteTable__Q44nw4r3snd6detail4Util = .rodata:0x804F9320; // type:object size:0x30 PitchTable__Q44nw4r3snd6detail4Util = .rodata:0x804F9350; // type:object size:0x400 Decibel2RatioTable__Q44nw4r3snd6detail4Util = .rodata:0x804F9750; // type:object size:0xF14 @@ -38609,7 +38609,7 @@ __vt__Q44nw4r3snd6detail9SeqPlayer = .data:0x8056E024; // type:object size:0x64 __vt__Q44nw4r3snd6detail8SeqSound = .data:0x8056E088; // type:object size:0x38 __vt__Q54nw4r3snd6detail8SeqSound11SeqLoadTask = .data:0x8056E0C0; // type:object size:0x18 __vt__Q44nw4r3snd6detail8SeqTrack = .data:0x8056E0D8; // type:object size:0x10 -lbl_8056E0E8 = .data:0x8056E0E8; // type:object size:0x30 +__vt__Q34nw4r3snd12Sound3DActor = .data:0x8056E0E8; // type:object size:0x30 __vt__Q34nw4r3snd13Sound3DEngine = .data:0x8056E118; // type:object size:0x1C __vt__Q34nw4r3snd14Sound3DManager = .data:0x8056E138; // type:object size:0x34 __vt__Q34nw4r3snd10SoundActor = .data:0x8056E170; // type:object size:0x1C @@ -49717,7 +49717,7 @@ VOLUME_INIT__Q44nw4r3snd6detail12EnvGenerator = .sdata2:0x8057EFD0; // type:obje @3315 = .sdata2:0x8057F098; // type:object size:0x4 scope:local align:4 data:float @3319 = .sdata2:0x8057F0A0; // type:object size:0x8 scope:local align:8 data:double @3320 = .sdata2:0x8057F0A8; // type:object size:0x8 scope:local align:8 data:double -lbl_8057F0B0 = .sdata2:0x8057F0B0; // type:object size:0x4 align:4 data:float +@4796 = .sdata2:0x8057F0B0; // type:object size:0x4 scope:local align:4 data:float @2828 = .sdata2:0x8057F0B8; // type:object size:0x4 scope:local align:4 data:float @2829 = .sdata2:0x8057F0BC; // type:object size:0x4 scope:local align:4 data:float @2830 = .sdata2:0x8057F0C0; // type:object size:0x4 scope:local align:4 data:float diff --git a/configure.py b/configure.py index b2680f20..501b0a6d 100644 --- a/configure.py +++ b/configure.py @@ -1024,17 +1024,17 @@ config.libs = [ Object(Matching, "nw4r/snd/snd_BiquadFilterPreset.cpp"), Object(Matching, "nw4r/snd/snd_Channel.cpp"), Object(Matching, "nw4r/snd/snd_DisposeCallbackManager.cpp"), - Object(NonMatching, "nw4r/snd/snd_debug.cpp"), + # Object(NonMatching, "nw4r/snd/snd_debug.cpp"), Object(Matching, "nw4r/snd/snd_DvdSoundArchive.cpp"), Object(Matching, "nw4r/snd/snd_EnvGenerator.cpp"), Object(Matching, "nw4r/snd/snd_ExternalSoundPlayer.cpp"), Object(Matching, "nw4r/snd/snd_FrameHeap.cpp"), - Object(NonMatching, "nw4r/snd/snd_FxBase.cpp"), - Object(NonMatching, "nw4r/snd/snd_FxChorus.cpp"), - Object(NonMatching, "nw4r/snd/snd_FxDelay.cpp"), - Object(NonMatching, "nw4r/snd/snd_FxReverbHi.cpp"), - Object(NonMatching, "nw4r/snd/snd_FxReverbHiDpl2.cpp"), - Object(NonMatching, "nw4r/snd/snd_FxReverbStd.cpp"), + # Object(NonMatching, "nw4r/snd/snd_FxBase.cpp"), + # Object(NonMatching, "nw4r/snd/snd_FxChorus.cpp"), + # Object(NonMatching, "nw4r/snd/snd_FxDelay.cpp"), + # Object(NonMatching, "nw4r/snd/snd_FxReverbHi.cpp"), + # Object(NonMatching, "nw4r/snd/snd_FxReverbHiDpl2.cpp"), + # Object(NonMatching, "nw4r/snd/snd_FxReverbStd.cpp"), Object(Matching, "nw4r/snd/snd_FxReverbStdDpl2.cpp"), Object(Matching, "nw4r/snd/snd_InstancePool.cpp"), Object(Matching, "nw4r/snd/snd_Lfo.cpp"), @@ -1052,7 +1052,7 @@ config.libs = [ Object(Matching, "nw4r/snd/snd_SeqSound.cpp"), Object(Matching, "nw4r/snd/snd_SeqSoundHandle.cpp"), Object(Matching, "nw4r/snd/snd_SeqTrack.cpp"), - Object(NonMatching, "nw4r/snd/snd_Sound3DActor.cpp"), + Object(Matching, "nw4r/snd/snd_Sound3DActor.cpp"), Object(Matching, "nw4r/snd/snd_Sound3DCalculator.cpp"), Object(Matching, "nw4r/snd/snd_Sound3DEngine.cpp"), Object(Matching, "nw4r/snd/snd_Sound3DListener.cpp"), diff --git a/include/nw4r/snd/snd_BasicSound.h b/include/nw4r/snd/snd_BasicSound.h index fcfa1366..b36f3cc9 100644 --- a/include/nw4r/snd/snd_BasicSound.h +++ b/include/nw4r/snd/snd_BasicSound.h @@ -186,8 +186,8 @@ namespace nw4r { namespace snd { namespace detail public: // virtual function ordering // vtable AmbientArgUpdateCallback - virtual void at_0x08(); - virtual void at_0x0c(void *, void *); + virtual ~AmbientArgUpdateCallback() {} + virtual void at_0x0c(void *, BasicSound *); // members private: @@ -299,6 +299,10 @@ namespace nw4r { namespace snd { namespace detail PRIORITY_MAX); } + void ClearAmbientArgUpdateCallback() { + mAmbientInfo.argUpdateCallback = NULL; + } + static int GetAmbientPriority(AmbientInfo const &ambientInfo, u32 soundId); diff --git a/include/nw4r/snd/snd_ExternalSoundPlayer.h b/include/nw4r/snd/snd_ExternalSoundPlayer.h index 4da73373..d76e296f 100644 --- a/include/nw4r/snd/snd_ExternalSoundPlayer.h +++ b/include/nw4r/snd/snd_ExternalSoundPlayer.h @@ -6,6 +6,8 @@ */ #include "nw4r/snd/snd_BasicSound.h" +#include "nw4r/snd/snd_SoundHandle.h" +#include "nw4r/snd/snd_global.h" /******************************************************************************* * classes and functions @@ -35,6 +37,34 @@ namespace nw4r { namespace snd { namespace detail bool detail_CanPlaySound(int startPriority); + template + TForEachFunc ForEachSound(TForEachFunc pFunc, bool reverse) { + if (reverse) { + detail::BasicSound::ExtSoundPlayerPlayLinkList::ReverseIterator it = mSoundList.GetBeginReverseIter(); + + while (it != mSoundList.GetEndReverseIter()) { + detail::BasicSound::ExtSoundPlayerPlayLinkList::ReverseIterator curr = it; + + SoundHandle handle; + handle.detail_AttachSoundAsTempHandle(&*curr); + pFunc(handle); + + if (handle.IsAttachedSound()) { + ++it; + } + } + } else { + NW4R_RANGE_FOR_NO_AUTO_INC(it, mSoundList) { + decltype(it) curItr = it++; + SoundHandle handle; + handle.detail_AttachSoundAsTempHandle(&*curItr); + pFunc(handle); + } + } + + return pFunc; + } + private: BasicSound *GetLowestPrioritySound(); diff --git a/include/nw4r/snd/snd_Sound3DActor.h b/include/nw4r/snd/snd_Sound3DActor.h index 339377ac..a748bddd 100644 --- a/include/nw4r/snd/snd_Sound3DActor.h +++ b/include/nw4r/snd/snd_Sound3DActor.h @@ -2,11 +2,11 @@ #ifndef NW4R_SND_SOUND_3D_ACTOR_H #define NW4R_SND_SOUND_3D_ACTOR_H -#include "nw4r/math.h" #include "nw4r/snd/snd_BasicSound.h" #include "nw4r/snd/snd_SoundActor.h" #include "nw4r/types_nw4r.h" +#include "nw4r/math.h" namespace nw4r { namespace snd { @@ -14,16 +14,12 @@ namespace snd { class Sound3DActor : public SoundActor, public detail::BasicSound::AmbientInfo::AmbientArgUpdateCallback { public: Sound3DActor(SoundArchivePlayer &rPlayer, Sound3DManager &rManager); - virtual ~Sound3DActor(); // at 0x8 + virtual ~Sound3DActor(); - virtual StartResult detail_SetupSound( - SoundHandle *pHandle, u32 id, detail::BasicSound::AmbientInfo *pArgInfo, - detail::ExternalSoundPlayer *pPlayer, bool hold, - const StartInfo *pStartInfo - ); // at 0xC + virtual StartResult SetupSound(SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *) override; - virtual void detail_Update(void *pArg, - const detail::BasicSound *pSound); // at 0xC + // AmbientArgUpdateCallback + virtual void at_0x0c(void *arg, detail::BasicSound* sound) override; void SetPosition(const math::VEC3 &rPosition); @@ -31,10 +27,12 @@ private: static void ClearUpdateCallback(SoundHandle &rHandle); private: - Sound3DManager &m3DManager; // at 0xAC - SoundArchivePlayer &mSoundArchivePlayer; // at 0xB0 - u32 mUserParam; // at 0xB4 - math::VEC3 mPosition; // at 0xB8 + Sound3DManager &m3DManager; // at 0x58 + SoundArchivePlayer *mSoundArchivePlayer; // at 0x5C + u32 mUserParam; // at 0x60 + math::VEC3 mPosition; // at 0x64 + math::VEC3 mVelocity; // at 0x70 + bool mSkipVelocityUpdate; // at 0x7C }; } // namespace snd diff --git a/include/nw4r/snd/snd_Sound3DManager.h b/include/nw4r/snd/snd_Sound3DManager.h index f3674247..9bfa470c 100644 --- a/include/nw4r/snd/snd_Sound3DManager.h +++ b/include/nw4r/snd/snd_Sound3DManager.h @@ -14,12 +14,12 @@ namespace snd { struct Sound3DParam { /* 0x00 */ math::VEC3 position; - /* 0x0C */ math::VEC3 field_0x0C; + /* 0x0C */ math::VEC3 velocity; /* 0x18 */ UNKWORD field_0x18; /* 0x1C */ u8 decayCurve; /* 0x1D */ u8 decayRatio; /* 0x1E */ u8 field_0x1E; - /* 0x20 */ UNKWORD field_0x20; + /* 0x20 */ u32 userParam; /* 0x24 */ UNKWORD field_0x24; Sound3DParam(); diff --git a/include/nw4r/snd/snd_SoundActor.h b/include/nw4r/snd/snd_SoundActor.h index 1a608e2e..044772a7 100644 --- a/include/nw4r/snd/snd_SoundActor.h +++ b/include/nw4r/snd/snd_SoundActor.h @@ -50,6 +50,16 @@ namespace nw4r { namespace snd return &mActorPlayer[actorPlayerId]; } + + template + TForEachFunc ForEachSound(TForEachFunc pFunc, bool reverse) { + for (int i = 0; i < ACTOR_PLAYER_COUNT; i++) { + mActorPlayer[i].ForEachSound(pFunc, reverse); + } + + return pFunc; + } + detail::SoundActorParam const &detail_GetActorParam() const { return mActorParam; diff --git a/include/nw4r/snd/snd_SoundArchive.h b/include/nw4r/snd/snd_SoundArchive.h index 6ebf3a5a..8904ddf8 100644 --- a/include/nw4r/snd/snd_SoundArchive.h +++ b/include/nw4r/snd/snd_SoundArchive.h @@ -123,6 +123,7 @@ namespace nw4r { namespace snd u32 flags; // at 0x0 u8 decayCurve; // at 0x4 u8 decayRatio; // at 0x5 + u8 field_0x06; // at 0x6 }; // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x256dc diff --git a/src/nw4r/snd/snd_Sound3DActor.cpp b/src/nw4r/snd/snd_Sound3DActor.cpp index 5dc4b760..f5e30860 100644 --- a/src/nw4r/snd/snd_Sound3DActor.cpp +++ b/src/nw4r/snd/snd_Sound3DActor.cpp @@ -1 +1,87 @@ #include "nw4r/snd/snd_Sound3DActor.h" + +#include "nw4r/snd/snd_BasicSound.h" +#include "nw4r/snd/snd_ExternalSoundPlayer.h" +#include "nw4r/snd/snd_Sound3DManager.h" +#include "nw4r/snd/snd_SoundArchive.h" +#include "nw4r/snd/snd_SoundArchivePlayer.h" +#include "nw4r/snd/snd_SoundHandle.h" +#include "nw4r/snd/snd_SoundStartable.h" +#include "nw4r/snd/snd_global.h" + +namespace nw4r { +namespace snd { + +Sound3DActor::Sound3DActor(SoundArchivePlayer &rPlayer, Sound3DManager &rManager) + : SoundActor(rPlayer), + m3DManager(rManager), + mSoundArchivePlayer(&rPlayer), + mUserParam(0), + mPosition(0.0f, 0.0f, 0.0f), + mVelocity(0.0f, 0.0f, 0.0f), + mSkipVelocityUpdate(true) {} + + +Sound3DActor::~Sound3DActor() { + ForEachSound(ClearUpdateCallback, false); +} + +SoundStartable::StartResult +Sound3DActor::SetupSound(SoundHandle *pHandle, u32 soundId, const StartInfo *pStartInfo, void *pArg) { + Sound3DParam param; + param.position = mPosition; + param.velocity = mVelocity; + param.userParam = mUserParam; + + if (mSoundArchivePlayer != NULL) { + const SoundArchive &archive = mSoundArchivePlayer->GetSoundArchive(); + nw4r::snd::SoundArchive::Sound3DParam arParam; + if (archive.detail_ReadSound3DParam(soundId, &arParam)) { + param.field_0x18 = arParam.flags; + param.decayRatio = arParam.decayRatio; + param.field_0x1E = arParam.field_0x06; + switch (arParam.decayCurve) { + case 1: param.decayCurve = 1; break; + case 2: param.decayCurve = 2; break; + default: param.decayCurve = 1; break; + } + } + param.field_0x24 = archive.GetSoundUserParam(soundId); + } + + detail::BasicSound::AmbientInfo info = { + &m3DManager, this, &m3DManager, ¶m, sizeof(Sound3DParam), + + }; + SoundStartable::StartResult result = + SoundActor::detail_SetupSoundWithAmbientInfo(pHandle, soundId, pStartInfo, &info, pArg); + if (pHandle->detail_GetAttachedSound() != NULL) { + pHandle->detail_GetAttachedSound()->SetPanCurve(PAN_CURVE_SINCOS); + } + return result; +} + +void Sound3DActor::SetPosition(const math::VEC3 &position) { + if (!mSkipVelocityUpdate) { + VEC3Sub(&mVelocity, &position, &mPosition); + } + + mPosition = position; + mSkipVelocityUpdate = 0; +} + +void Sound3DActor::at_0x0c(void *arg, detail::BasicSound *sound) { + Sound3DParam *p = static_cast(arg); + p->position = mPosition; + p->velocity = mVelocity; + p->userParam = mUserParam; +} + +void Sound3DActor::ClearUpdateCallback(SoundHandle& rHandle) { + if (rHandle.IsAttachedSound()) { + rHandle.detail_GetAttachedSound()->ClearAmbientArgUpdateCallback(); + } +} + +} // namespace snd +} // namespace nw4r diff --git a/src/nw4r/snd/snd_Sound3DCalculator.cpp b/src/nw4r/snd/snd_Sound3DCalculator.cpp index 59b27a18..8c1c1b9d 100644 --- a/src/nw4r/snd/snd_Sound3DCalculator.cpp +++ b/src/nw4r/snd/snd_Sound3DCalculator.cpp @@ -131,10 +131,10 @@ void Sound3DCalculator::CalcPitch( f32 f3 = param.field_0x1E / 32.0f; f32 f1, f2; if (distance > 0.0f) { - f1 = -math::VEC3Dot(&relativePos, ¶m.field_0x0C); + f1 = -math::VEC3Dot(&relativePos, ¶m.velocity); f2 = -math::VEC3Dot(&relativePos, &listener.GetVelocity()); } else { - f1 = -math::VEC3Len(¶m.field_0x0C); + f1 = -math::VEC3Len(¶m.velocity); f2 = math::VEC3Len(&listener.GetVelocity()); } f32 pitch; diff --git a/src/nw4r/snd/snd_Sound3DManager.cpp b/src/nw4r/snd/snd_Sound3DManager.cpp index 1c8172e7..5a65c99a 100644 --- a/src/nw4r/snd/snd_Sound3DManager.cpp +++ b/src/nw4r/snd/snd_Sound3DManager.cpp @@ -94,7 +94,7 @@ Sound3DParam::Sound3DParam() { decayCurve = Sound3DManager::DECAY_CURVE_LOGARITHMIC; decayRatio = 128; field_0x1E = 0; - field_0x20 = 0; + userParam = 0; field_0x24 = 0; }