mirror of
https://github.com/zeldaret/ss
synced 2026-08-12 11:52:22 -04:00
131 lines
3.4 KiB
C++
131 lines
3.4 KiB
C++
#ifndef D_SND_SE_SOUND_H
|
|
#define D_SND_SE_SOUND_H
|
|
|
|
#include "common.h"
|
|
#include "d/snd/d_snd_sound.h"
|
|
#include "d/snd/d_snd_types.h"
|
|
#include "nw4r/snd/snd_SoundHandle.h"
|
|
#include "nw4r/ut/ut_list.h"
|
|
|
|
/**
|
|
* A sound effect handle. Typically acquired by sound sources from a pool.
|
|
* This allows sound sources to play sounds with no pre-determined limit
|
|
* on the number of sounds. It also allows the source to handle the statefulness
|
|
* of holdSound without requiring users to manage handles.
|
|
*
|
|
* Additionally, some sound sources will register callbacks to customize
|
|
* sound parameters (pitch, volume, ...). These callbacks can additionally
|
|
* write and read context parameters (see above). The game will shift these
|
|
* parameters with each call, so a lot of this is obviously frame-rate dependent.
|
|
*/
|
|
class dSndSeSound_c {
|
|
public:
|
|
dSndSeSound_c();
|
|
~dSndSeSound_c();
|
|
|
|
enum Type_e {
|
|
SE_HANDLE_TYPE_1 = 0,
|
|
SE_HANDLE_TYPE_2 = 1,
|
|
};
|
|
|
|
// vtable at 0x000
|
|
/* vt 0x08 */ virtual void setSource(dSoundSource_c *source, u32 soundId);
|
|
// TODO these names are probably wrong
|
|
/* vt 0x0C */ virtual void onStart(dSoundSource_c *source);
|
|
/* vt 0x10 */ virtual void onCalc(dSoundSource_c *source);
|
|
|
|
void calc(dSoundSource_c *source);
|
|
void clear();
|
|
|
|
// not sure what this does
|
|
void shiftParam(const dSndSoundCtxParam *p);
|
|
void shiftFloatParam(f32 value);
|
|
|
|
typedef void Callback(dSndSeSound_c *sound, dSoundSource_c *source, nw4r::snd::SoundHandle &handle);
|
|
|
|
void stop(s32 fadeFrames) {
|
|
mpSoundHandle->Stop(fadeFrames);
|
|
}
|
|
|
|
Type_e getHandleType() const {
|
|
return mHandleType;
|
|
}
|
|
|
|
// cannot be const...
|
|
bool isAttachedSound() {
|
|
return mpSoundHandle->IsAttachedSound();
|
|
}
|
|
|
|
nw4r::snd::SoundHandle *getHandle() {
|
|
return mpSoundHandle;
|
|
}
|
|
|
|
dSndSoundCtxParam *getCtxParams() const {
|
|
return mpCtxParam;
|
|
}
|
|
|
|
s32 getField0x114() const {
|
|
return field_0x114;
|
|
}
|
|
|
|
void setHandle(nw4r::snd::SoundHandle *handle) {
|
|
if (handle != nullptr) {
|
|
mpSoundHandle = handle;
|
|
field_0x11C = 0;
|
|
} else {
|
|
mpSoundHandle = &mSound;
|
|
field_0x11C = 1;
|
|
}
|
|
}
|
|
|
|
void attachSource(dSoundSource_c *source) {
|
|
mpSource = source;
|
|
}
|
|
|
|
bool isAttachedSource() const {
|
|
return mpSource != nullptr;
|
|
}
|
|
|
|
bool unkRemovalCheck() const {
|
|
return !field_0x11D && !field_0x11E;
|
|
}
|
|
|
|
bool isSoundId(u32 id) const {
|
|
return mSoundId == id;
|
|
}
|
|
|
|
void setAcquiredMaybe(bool value) {
|
|
field_0x11D = value;
|
|
}
|
|
|
|
void setInUseMaybe(bool value) {
|
|
field_0x11E = value;
|
|
}
|
|
|
|
void setCallback1(Callback cb) {
|
|
mpStartCallback = cb;
|
|
}
|
|
|
|
void setCallback2(Callback cb) {
|
|
mpCalcCallback = cb;
|
|
}
|
|
|
|
protected:
|
|
/* 0x004 */ nw4r::ut::Node mSourceLink;
|
|
/* 0x00C */ nw4r::ut::Node mPoolLink;
|
|
/* 0x014 */ dSoundSource_c *mpSource;
|
|
/* 0x018 */ dSndSound_c mSound;
|
|
/* 0x108 */ nw4r::snd::SoundHandle *mpSoundHandle;
|
|
/* 0x10C */ Type_e mHandleType;
|
|
/* 0x110 */ u32 mSoundId;
|
|
/* 0x114 */ s32 field_0x114;
|
|
/* 0x118 */ dSndSoundCtxParam *mpCtxParam;
|
|
/* 0x11C */ u8 field_0x11C;
|
|
/* 0x11D */ u8 field_0x11D;
|
|
/* 0x11E */ u8 field_0x11E;
|
|
/* 0x120 */ Callback *mpStartCallback;
|
|
/* 0x124 */ Callback *mpCalcCallback;
|
|
};
|
|
|
|
#endif
|