#ifndef NW4R_SND_BASIC_SOUND_H #define NW4R_SND_BASIC_SOUND_H /******************************************************************************* * headers */ #include "common.h" #include "nw4r/snd/snd_global.h" #include "nw4r/snd/snd_MoveValue.h" #include "nw4r/ut/ut_algorithm.h" // ut::Clamp #include "nw4r/ut/ut_LinkList.h" /******************************************************************************* * types */ // forward declarations namespace nw4r { namespace snd { namespace detail { class BasicPlayer; }}} namespace nw4r { namespace snd { namespace detail { class ExternalSoundPlayer; }}} namespace nw4r { namespace snd { namespace detail { class PlayerHeap; }}} namespace nw4r { namespace snd { class SoundActor; }} namespace nw4r { namespace snd { class SoundHandle; }} namespace nw4r { namespace snd { class SoundPlayer; }} namespace nw4r { namespace ut { namespace detail { class RuntimeTypeInfo; }}} namespace nw4r { namespace snd { // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x27a05 struct SoundParam { // methods public: // cdtors SoundParam() : volume (1.0f), pitch (1.0f), pan (0.0f), surroundPan (0.0f), fxSend (0.0f), lpf (0.0f), biquadFilterValue (0.0f), biquadFilterType (0), priority (0), field_0x24 (0) { } // members public: f32 volume; // size 0x04, offset 0x00 f32 pitch; // size 0x04, offset 0x04 f32 pan; // size 0x04, offset 0x08 f32 surroundPan; // size 0x04, offset 0x0c f32 fxSend; // size 0x04, offset 0x10 f32 lpf; // size 0x04, offset 0x14 f32 biquadFilterValue; // size 0x04, offset 0x18 int biquadFilterType; // size 0x04, offset 0x1c int priority; // size 0x04, offset 0x20 UNKWORD field_0x24; }; // size 0x24 // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x27514 struct SoundAmbientParam { // methods public: // cdtors SoundAmbientParam() : // where is my nsdmi !!! volume (1.0f), pitch (1.0f), pan (0.0f), surroundPan (0.0f), fxSend (0.0f), lpf (0.0f), biquadFilterValue (0.0f), biquadFilterType (0), priority (0), field_0x24 (0) { } // members public: f32 volume; // size 0x04, offset 0x00 f32 pitch; // size 0x04, offset 0x04 f32 pan; // size 0x04, offset 0x08 f32 surroundPan; // size 0x04, offset 0x0c f32 fxSend; // size 0x04, offset 0x10 f32 lpf; // size 0x04, offset 0x14 f32 biquadFilterValue; // size 0x04, offset 0x18 int biquadFilterType; // size 0x04, offset 0x1c int priority; // size 0x04, offset 0x20 UNKWORD field_0x24; VoiceOutParam voiceOutParam[4]; // size 0x60, offset 0x24 }; // size 0x84 namespace detail { // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x270f1 struct SoundActorParam { // methods public: // cdtors SoundActorParam() : volume (1.0f), pitch (1.0f), pan (0.0f) { } // members public: f32 volume; // size 0x04, offset 0x00 f32 pitch; // size 0x04, offset 0x04 f32 pan; // size 0x04, offset 0x08 }; // size 0x0c } // namespace detail }} // namespace nw4r::snd /******************************************************************************* * classes and functions */ namespace nw4r { namespace snd { namespace detail { // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x28177 // NOTE: different from ketteiban: no remote fields. something else instead class BasicSound { // enums public: // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x27c51 enum PauseState { PAUSE_STATE_NORMAL, PAUSE_STATE_PAUSING, PAUSE_STATE_PAUSED, PAUSE_STATE_UNPAUSING, }; // typedefs public: typedef ut::LinkList PriorityLinkList; typedef ut::LinkList SoundPlayerPlayLinkList; typedef ut::LinkList SoundPlayerPriorityLinkList; typedef ut::LinkList ExtSoundPlayerPlayLinkList; // nested types public: // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x277e5 struct AmbientInfo { // nested types public: // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x276d8 class AmbientParamUpdateCallback { public: enum ParamUpdateFlags { PARAM_UPDATE_VOLUME = (1 << 0), PARAM_UPDATE_PAN = (1 << 1), PARAM_UPDATE_SURROUND_PAN = (1 << 2), PARAM_UPDATE_PRIORITY = (1 << 3), }; // methods public: virtual ~AmbientParamUpdateCallback() {} virtual void detail_UpdateAmbientParam(const void*, u32, int, SoundAmbientParam*); virtual int detail_GetAmbientPriority(const void*, u32); virtual int detail_GetRequiredVoiceOutCount(const void*, u32); // members private: /* vtable */ // size 0x04, offset 0x00 }; // size 0x04 // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x27732 class AmbientArgUpdateCallback { // methods public: // virtual function ordering // vtable AmbientArgUpdateCallback virtual ~AmbientArgUpdateCallback() {} virtual void at_0x0c(void *, BasicSound *); // members private: /* vtable */ // size 0x04, offset 0x00 }; // size 0x04 // NOTE: "Allocator" is misspelled as "Allocater" // [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2778a class AmbientArgAllocaterCallback { // methods public: // virtual function ordering // vtable AmbientArgAllocaterCallback virtual ~AmbientArgAllocaterCallback() {} virtual void *detail_AllocAmbientArg(u32 size); // at 0x8 virtual void detail_FreeAmbientArg(void *pArg, const detail::BasicSound *pSound); // at 0xC // members private: /* vtable */ // size 0x04, offset 0x00 }; // size 0x04 // members public: AmbientParamUpdateCallback *paramUpdateCallback; // size 0x04, offset 0x00 AmbientArgUpdateCallback *argUpdateCallback; // size 0x04, offset 0x04 AmbientArgAllocaterCallback *argAllocaterCallback; // size 0x04, offset 0x08 void *arg; // size 0x04, offset 0x0c u32 argSize; // size 0x04, offset 0x10 }; // size 0x14 // methods public: // cdtors BasicSound(int priority, int ambientPriority); /* virtual ~BasicSound() {} */ // virtual function ordering // virtual function ordering // vtable BasicSound virtual ut::detail::RuntimeTypeInfo const *GetRuntimeTypeInfo() const { return &typeInfo; } virtual ~BasicSound() {} virtual void Shutdown(); virtual bool IsPrepared() const = 0; virtual bool IsAttachedTempSpecialHandle() = 0; virtual void DetachTempSpecialHandle() = 0; virtual void InitParam(); virtual BasicPlayer &GetBasicPlayer() = 0; virtual BasicPlayer const &GetBasicPlayer() const = 0; virtual void OnUpdatePlayerPriority() {} virtual void UpdateMoveValue(); virtual void UpdateParam(); // methods void StartPrepared(); void Update(); void Pause(bool flag, int fadeFrames); bool IsPause() const; void Stop(int fadeFrames); void SetAutoStopCounter(int count); void FadeIn(int fadeFrames); bool GetStartedFlag() const { return mStartedFlag; } u32 GetId() const { return mId; } PlayerHeap *GetPlayerHeap() { return mPlayerHeap; } SoundPlayer *GetSoundPlayer() { return mSoundPlayer; } int GetVoiceOutCount() const; int GetPriority() const { return mPriority; } void SetPlayerPriority(int priority); void SetInitialVolume(f32 volume); void SetVolume(f32 volume, int frames); void SetPitch(f32 pitch); void SetPan(f32 pan); void SetSurroundPan(f32 pan); void SetLpfFreq(f32 freq); void SetFxSend(AuxBus bus, f32 send); void SetRemoteFilter(int filter); void SetPanMode(PanMode mode); void SetPanCurve(PanCurve curve); void SetAmbientInfo(AmbientInfo const &ambientArgInfo); void SetId(u32 id); void SetOutputLineFlag(int flag); void AttachPlayerHeap(PlayerHeap *heap); void AttachSoundPlayer(SoundPlayer *player); void AttachSoundActor(SoundActor *actor); void AttachExternalSoundPlayer(ExternalSoundPlayer *extPlayer); bool IsAttachedGeneralHandle(); bool IsAttachedTempGeneralHandle(); void DetachPlayerHeap(PlayerHeap *heap); void DetachSoundPlayer(SoundPlayer *player); void DetachSoundActor(SoundActor *actor); void DetachExternalSoundPlayer(ExternalSoundPlayer *extPlayer); void DetachGeneralHandle(); void DetachTempGeneralHandle(); int GetRemainingFadeFrames() const; int CalcCurrentPlayerPriority() const { return ut::Clamp(mPriority + mAmbientParam.priority, PRIORITY_MIN, PRIORITY_MAX); } void ClearAmbientArgUpdateCallback() { mAmbientInfo.argUpdateCallback = NULL; } static int GetAmbientPriority(AmbientInfo const &ambientInfo, u32 soundId); // static members public: // NOTE: PRIORITY_MAX is a dependent name (see SoundInstanceManager) static u32 const INVALID_ID = -1; static int const PRIORITY_MAX = 127; static int const PRIORITY_MIN = 0; static ut::detail::RuntimeTypeInfo const typeInfo; // members private: /* vtable */ // size 0x04, offset 0x00 PlayerHeap *mPlayerHeap; // size 0x04, offset 0x04 SoundHandle *mGeneralHandle; // size 0x04, offset 0x08 SoundHandle *mTempGeneralHandle; // size 0x04, offset 0x0c SoundPlayer *mSoundPlayer; // size 0x04, offset 0x10 SoundActor *mSoundActor; // size 0x04, offset 0x14 ExternalSoundPlayer *mExtSoundPlayer; // size 0x04, offset 0x18 AmbientInfo mAmbientInfo; // size 0x14, offset 0x1c SoundParam mAmbientParam; // size 0x24, offset 0x30 SoundActorParam mActorParam; // size 0x0c, offset 0x58 MoveValue mFadeVolume; // size 0x10, offset 0x64 MoveValue mPauseFadeVolume; // size 0x10, offset 0x74 bool mStartFlag; // size 0x01, offset 0x84 bool mStartedFlag; // size 0x01, offset 0x85 bool mAutoStopFlag; // size 0x01, offset 0x86 bool mFadeOutFlag; // size 0x01, offset 0x87 PauseState mPauseState; // size 0x04, offset 0x88 bool mUnPauseFlag; // size 0x01, offset 0x8c /* 3 bytes padding */ s32 mAutoStopCounter; // size 0x04, offset 0x90 u32 mUpdateCounter; // size 0x04, offset 0x94 u8 mPriority; // size 0x01, offset 0x98 u8 mVoiceOutCount; // size 0x01, offset 0x99 u8 mBiquadFilterType; // size 0x01, offset 0x9a /* 1 byte padding */ u32 mId; // size 0x04, offset 0x9c MoveValue mExtMoveVolume; // size 0x10, offset 0xa0 f32 mInitVolume; // size 0x04, offset 0xb0 f32 mExtPan; // size 0x04, offset 0xb4 f32 mExtSurroundPan; // size 0x04, offset 0xb8 f32 mExtPitch; // size 0x04, offset 0xbc f32 mLpfFreq; // size 0x04, offset 0xc0 f32 mBiquadFilterValue; // size 0x04, offset 0xc4 int mOutputLineFlag; // size 0x04, offset 0xc8 f32 mMainOutVolume; // size 0x04, offset 0xcc f32 mMainSend; // size 0x04, offset 0xd0 f32 mFxSend[AUX_BUS_NUM]; // size 0x0c, offset 0xd4 f32 mRemoteOutVolume[4]; // size 0x10, offset 0xe0 public: ut::LinkListNode mPriorityLink; // size 0x08, offset 0xf0 ut::LinkListNode mSoundPlayerPlayLink; // size 0x08, offset 0xf8 ut::LinkListNode mSoundPlayerPriorityLink; // size 0x08, offset 0x100 ut::LinkListNode mExtSoundPlayerPlayLink; // size 0x08, offset 0x108 // friends private: friend class snd::SoundHandle; }; // size 0x100 }}} // namespace nw4r::snd::detail #endif // NW4R_SND_BASIC_SOUND_H