Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
AxVoice.h
Go to the documentation of this file.
1#ifndef NW4HBM_SND_AX_VOICE_H
2#define NW4HBM_SND_AX_VOICE_H
3
4#include <revolution/ax.h>
5#include <revolution/wpad.h>
7#include <climits>
8#include "snd_global.h"
9#include "snd_types.h"
10
11#include "../ut/LinkList.h"
12
13#include "global.h"
14
15namespace nw4hbm {
16 namespace snd {
17 namespace detail {
18
20 return (target - init) / AX_SAMPLES_PER_FRAME;
21 }
22
23 inline u16 CalcMixVolume(f32 volume) {
24 return ut::Min<u32>(USHRT_MAX, AX_MAX_VOLUME * volume);
25 }
26
28 public:
30
31 operator AXVPB*() { return mVpb; }
32
33 bool IsAvailable() const { return mVpb != NULL; }
34
35 bool IsRun() const { return IsAvailable() && mVpb->pb.state == AX_VOICE_RUN; }
36
38 if (!IsAvailable()) {
39 return 0;
40 }
41
43 }
44
46 if (!IsAvailable()) {
47 return 0;
48 }
49
50 return (mVpb->pb.addr.loopAddressHi << 16) + mVpb->pb.addr.loopAddressLo;
51 }
52
54 if (!IsAvailable()) {
55 return 0;
56 }
57
58 return (mVpb->pb.addr.endAddressHi << 16) + mVpb->pb.addr.endAddressLo;
59 }
60
61 void SetVoiceAddr(const AXPBADDR& rAddr) {
62 if (IsAvailable()) {
63 // AXSetVoiceAddr doesn't actually modify the object
64 AXSetVoiceAddr(mVpb, const_cast<AXPBADDR*>(&rAddr));
65 }
66 }
67
68 void SetVoicePriority(u32 priority) {
69 if (IsAvailable()) {
70 AXSetVoicePriority(mVpb, priority);
71 }
72 }
73
75 if (IsAvailable()) {
76 AXSetVoiceState(mVpb, AX_VOICE_RUN);
77 }
78 }
79
81 if (IsRun()) {
82 AXSetVoiceState(mVpb, AX_VOICE_STOP);
83 }
84 }
85
86 void Sync();
87 bool IsRmtIirEnable() const;
88
89 void Set(AXVPB* pVpb);
90 void Clear();
91
92 void SetVoiceType(u16 type);
93 void SetVoiceVe(u16 volume, u16 initVolume);
94 void SetVoiceMix(const AXPBMIX& rMix, bool syncNow);
95 void SetVoiceLoop(u16 loop);
98 void SetVoiceAdpcm(const AXPBADPCM& rAdpcm);
99 void SetVoiceSrcType(u32 type);
100 void SetVoiceSrc(const AXPBSRC& rSrc);
103 void SetVoiceLpf(const AXPBLPF& rLpf);
106 void SetVoiceRmtMix(const AXPBRMTMIX& rMix);
107 void SetVoiceRmtIIR(const AXPBRMTIIR& rIir);
108 void SetVoiceRmtIIRCoefs(u16 type, ...);
110
111 private:
112 static const u16 DEFAULT_VOLUME = AX_MAX_VOLUME;
113
114 private:
115 /* 0x00 */ AXVPB* mVpb;
116 /* 0x04 */ u32 mSync;
117 /* 0x08 */ volatile AXPBVE mPrevVeSetting;
118 /* 0x0C */ bool mFirstVeUpdateFlag;
119 /* 0x0E */ u16 mVolume;
120 };
121
122 class WaveData;
123 class AxVoice : public DisposeCallback {
124 friend class AxManager;
125
126 public:
133
134 typedef enum VoiceSyncFlag {
136 SYNC_AX_VOICE = (1 << 1),
137 SYNC_AX_SRC = (1 << 3),
138 SYNC_AX_VE = (1 << 4),
139 SYNC_AX_MIX = (1 << 5),
140 SYNC_AX_LPF = (1 << 6),
141 SYNC_AX_REMOTE = (1 << 7),
142 SYNC_AX_BIQUAD = (1 << 8),
144
145 typedef enum Format {
148 FORMAT_ADPCM = 0
150
152
161
162 typedef void (*AxVoiceCallback)(AxVoice* drovoice, CallbackStatus status,
163 void* callbackArg);
164
166
167 /* 0x08 */ virtual ~AxVoice();
168 /* 0x0C */ virtual void InvalidateData(const void* start, const void* end) {}
169 /* 0x10 */ virtual void InvalidateWaveData(const void* start, const void* end);
170
171 void Setup(const WaveData& waveParam);
172 void Update();
173 void Free();
174
175 void Start();
176 void Stop();
177
178 void Pause(bool flag);
179
180 void SetVolume(f32 volume);
181 void SetVeVolume(f32 targetVolume, f32 initVolume);
182 void SetMainOutVolume(f32 volume);
183 void SetRemoteOutVolume(int remoteIndex, f32 volume);
184
185 void SetPitch(f32 pitch);
186 void SetPan(f32 pan);
187 void SetPan2(f32 pan);
188 void SetSurroundPan(f32 surroundPan);
189 void SetSurroundPan2(f32 surroundPan);
190
191 void SetLpfFreq(f32 lpfFreq);
192
193 void SetOutputLine(int lineFlag);
194
195 void SetMainSend(f32 send);
196 void SetFxSend(AuxBus bus, f32 send);
197 void SetRemoteSend(int remoteIndex, f32 send);
198 void SetRemoteFxSend(int remoteIndex, f32 send);
199
200 void SetPriority(int priority);
201 int GetPriority() const { return mPriority; }
202
206
208
209 void SetAdpcmLoop(int channelIndex, Format format, const AdpcmLoopParam* param);
210 void SetBaseAddress(int channelIndex, const void* baseAddress);
211
212 bool IsPlayFinished() const;
213 bool IsRun();
214
215 void SetAxAddr(int channelIndex, bool loopFlag, Format format, const void* waveAddr,
216 u32 loopStart, u32 loopEnd);
217
218 void SetLoopStart(int channelIndex, const void* baseAddress, u32 samples);
219 void SetLoopEnd(int channelIndex, const void* baseAddress, u32 samples);
220 void SetLoopFlag(bool loopFlag);
221
222 void StopAtPoint(int channelIndex, const void* baseAddress, u32 samples);
224
225 void UpdateAxSrc(bool initialUpdate);
227
228 void SetAxAdpcm(int channelIndex, Format format, const AdpcmParam* param);
229 void SetAxAdpcmLoop(int channelIndex, Format format,
230 const AdpcmLoopParam* param) NO_INLINE;
231
235
236 void InitParam(int channelCount, int voiceOutCount, AxVoiceCallback callback,
237 void* callbackData);
238 bool Acquire(int channelCount, int voiceOutCount, int priority,
239 AxVoiceCallback callback, void* callbackData);
240
242
243 static u32 GetDspAddressBySample(const void* baseAddress, u32 samples,
244 Format format);
245 static u32 GetSampleByDspAddress(const void* baseAddress, u32 addr, Format format);
246 static u32 GetSampleByByte(u32 byte, Format format);
247
248 template <typename T>
249 void SetAxParam(void (*func)(AXVPB*, T), T param) {
250 for (int i = 0; i < mChannelCount; i++) {
251 for (int j = 0; j < mVoiceOutCount; j++) {
252 if (mVpb[i][j] != NULL) {
253 func(mVpb[i][j], param);
254 }
255 }
256 }
257 }
258
260
261 static const int VOICES_MAX = 4;
262 static const int PRIORITY_MAX = 255;
263
264 protected:
265 static void VoiceCallback(void* callbackData);
266
267 void TransformDpl2Pan(f32* outPan, f32* outSurroundPan, f32 inPan,
268 f32 inSurroundPan);
269
270 void CalcAXPBMIX(int channelIndex, int voiceIndex, AXPBMIX* mix);
271 void CalcAXPBRMTMIX(int channelIndex, int voiceIndex, AXPBRMTMIX* mix);
272
273 /* 0x000 (base) */
277 /* 0x104 */ s32 mChannelCount;
278 /* 0x108 */ s32 mVoiceOutCount;
280 /* 0x110 */ void* mCallbackData;
281 /* 0x114 */ int mSampleRate;
282 /* 0x118 */ Format mFormat;
283 /* 0x11C */ bool mActiveFlag;
284 /* 0x11D */ bool mStartFlag;
285 /* 0x11E */ bool mStartedFlag;
286 /* 0x11F */ bool mPauseFlag;
287 /* 0x120 */ bool mPausingFlag;
288 /* 0x121 */ bool mFirstVeUpdateFlag;
289 /* 0x122 */ bool mHomeButtonMuteFlag;
290 /* 0x123 */ u8 mSyncFlag;
291 /* 0x124 */ int mPriority;
292 /* 0x128 */ f32 mPan;
293 /* 0x12C */ f32 mSurroundPan;
294 /* 0x130 */ f32 mPan2;
295 /* 0x134 */ f32 mSurroundPan2;
296 /* 0x138 */ f32 mLpfFreq;
297 /* 0x13C */ int mOutputLineFlag;
298 /* 0x140 */ f32 mMainOutVolume;
299 /* 0x144 */ f32 mMainSend;
300 /* 0x148 */ f32 mFxSend[AUX_BUS_NUM];
304 /* 0x184 */ f32 mPitch;
305 /* 0x188 */ f32 mVolume;
307 /* 0x19C */ f32 mVeInitVolume;
308 /* 0x1A0 */ f32 mVeTargetVolume;
309 /* 0x1A4 */ u16 mGainPrev;
310
311 public:
313 };
314
315 typedef ut::LinkList<AxVoice, offsetof(AxVoice, mLinkNode)> AxVoiceList;
316
317 } // namespace detail
318 } // namespace snd
319} // namespace nw4hbm
320
321#endif
void AXSetVoicePriority(AXVPB *p, u32 priority)
Definition AXAlloc.c:234
void AXSetVoiceAddr(AXVPB *p, AXPBADDR *addr)
Definition AXVPB.c:733
void AXSetVoiceState(AXVPB *p, u16 state)
Definition AXVPB.c:578
static BOOL flag
Definition DEMOAVX.c:20
static u32 addr
Definition WUD.c:1668
Definition AxManager.h:18
u32 mSync
Definition AxVoice.h:116
void SetVoiceAdpcmLoop(const AXPBADPCMLOOP &rLoop)
void SetVoiceAdpcm(const AXPBADPCM &rAdpcm)
u32 GetLoopAddress() const
Definition AxVoice.h:45
void SetVoiceAddr(const AXPBADDR &rAddr)
Definition AxVoice.h:61
u32 GetEndAddress() const
Definition AxVoice.h:53
void SetVoiceSrc(const AXPBSRC &rSrc)
void SetVoiceRmtMix(const AXPBRMTMIX &rMix)
AXVPB * mVpb
Definition AxVoice.h:115
void SetVoiceMix(const AXPBMIX &rMix, bool syncNow)
bool mFirstVeUpdateFlag
Definition AxVoice.h:118
volatile AXPBVE mPrevVeSetting
Definition AxVoice.h:117
void SetVoiceStateStop()
Definition AxVoice.h:80
void SetVoiceLpf(const AXPBLPF &rLpf)
void SetVoicePriority(u32 priority)
Definition AxVoice.h:68
static const u16 DEFAULT_VOLUME
Definition AxVoice.h:112
u32 GetCurrentAddress() const
Definition AxVoice.h:37
void SetVoiceRmtIIR(const AXPBRMTIIR &rIir)
void SetVoiceVe(u16 volume, u16 initVolume)
void SetVoiceStateRun()
Definition AxVoice.h:74
u16 mVolume
Definition AxVoice.h:119
bool IsRun() const
Definition AxVoice.h:35
bool IsAvailable() const
Definition AxVoice.h:33
Definition AxVoice.h:123
f32 mVolume
Definition AxVoice.h:305
static u32 GetSampleByByte(u32 byte, Format format)
int GetAxVoiceCount() const
Definition AxVoice.h:241
f32 mPan
Definition AxVoice.h:292
static const int PRIORITY_MAX
Definition AxVoice.h:262
void SetVolume(f32 volume)
f32 mRemoteSend[VOICES_MAX]
Definition AxVoice.h:302
void SetLoopEnd(int channelIndex, const void *baseAddress, u32 samples)
bool mStartFlag
Definition AxVoice.h:284
u8 mSyncFlag
Definition AxVoice.h:290
AxVoiceCallback mCallback
Definition AxVoice.h:279
f32 mRemoteFxSend[VOICES_MAX]
Definition AxVoice.h:303
CallbackStatus
Definition AxVoice.h:127
@ CALLBACK_STATUS_DROP_DSP
Definition AxVoice.h:131
@ CALLBACK_STATUS_DROP_VOICE
Definition AxVoice.h:130
@ CALLBACK_STATUS_INVALIDATE_WAVE
Definition AxVoice.h:129
@ CALLBACK_STATUS_FINISH_WAVE
Definition AxVoice.h:128
f32 mVeTargetVolume
Definition AxVoice.h:308
static void VoiceCallback(void *callbackData)
bool mFirstVeUpdateFlag
Definition AxVoice.h:288
f32 mSurroundPan
Definition AxVoice.h:293
VoiceChannelParam mVoiceChannelParam[CHANNEL_MAX]
Definition AxVoice.h:275
u16 mGainPrev
Definition AxVoice.h:309
static const int VOICES_MAX
Definition AxVoice.h:261
void Setup(const WaveData &waveParam)
AXVPB * mVpb[CHANNEL_MAX][VOICES_MAX]
Definition AxVoice.h:274
void SetLoopStart(int channelIndex, const void *baseAddress, u32 samples)
void SetRemoteOutVolume(int remoteIndex, f32 volume)
void SetAxSrcType(SrcType type)
bool mActiveFlag
Definition AxVoice.h:283
bool mPausingFlag
Definition AxVoice.h:287
int mSampleRate
Definition AxVoice.h:281
void SetMainOutVolume(f32 volume)
int GetPriority() const
Definition AxVoice.h:201
static u32 GetDspAddressBySample(const void *baseAddress, u32 samples, Format format)
void SetBaseAddress(int channelIndex, const void *baseAddress)
void CalcAXPBMIX(int channelIndex, int voiceIndex, AXPBMIX *mix)
void SetAxAdpcm(int channelIndex, Format format, const AdpcmParam *param)
void SetVoiceType(VoiceType type)
ut::LinkListNode mLinkNode
Definition AxVoice.h:312
void UpdateAxSrc(bool initialUpdate)
VoiceType
Definition AxVoice.h:151
@ VOICE_TYPE_STREAM
Definition AxVoice.h:151
@ VOICE_TYPE_NORMAL
Definition AxVoice.h:151
void SetRemoteFxSend(int remoteIndex, f32 send)
f32 mVeInitVolume
Definition AxVoice.h:307
bool mHomeButtonMuteFlag
Definition AxVoice.h:289
void TransformDpl2Pan(f32 *outPan, f32 *outSurroundPan, f32 inPan, f32 inSurroundPan)
f32 mPan2
Definition AxVoice.h:294
void SetSurroundPan(f32 surroundPan)
Format mFormat
Definition AxVoice.h:282
f32 mRemoteOutVolume[VOICES_MAX]
Definition AxVoice.h:301
bool Acquire(int channelCount, int voiceOutCount, int priority, AxVoiceCallback callback, void *callbackData)
virtual void InvalidateWaveData(const void *start, const void *end)
void SetAxAddr(int channelIndex, bool loopFlag, Format format, const void *waveAddr, u32 loopStart, u32 loopEnd)
void SetPriority(int priority)
void * mCallbackData
Definition AxVoice.h:280
SoundParam mVoiceOutParam[VOICES_MAX]
Definition AxVoice.h:276
int mOutputLineFlag
Definition AxVoice.h:297
Format
Definition AxVoice.h:145
@ FORMAT_PCM16
Definition AxVoice.h:146
@ FORMAT_PCM8
Definition AxVoice.h:147
@ FORMAT_ADPCM
Definition AxVoice.h:148
f32 mMainOutVolume
Definition AxVoice.h:298
void InitParam(int channelCount, int voiceOutCount, AxVoiceCallback callback, void *callbackData)
bool mStartedFlag
Definition AxVoice.h:285
static u32 GetSampleByDspAddress(const void *baseAddress, u32 addr, Format format)
void SetVeVolume(f32 targetVolume, f32 initVolume)
void StopAtPoint(int channelIndex, const void *baseAddress, u32 samples)
s32 mChannelCount
Definition AxVoice.h:277
void SetLpfFreq(f32 lpfFreq)
s32 mVoiceOutCount
Definition AxVoice.h:278
void SetAxParam(void(*func)(AXVPB *, T), T param)
Definition AxVoice.h:249
void CalcAXPBRMTMIX(int channelIndex, int voiceIndex, AXPBRMTMIX *mix)
void SetFxSend(AuxBus bus, f32 send)
f32 mMainSend
Definition AxVoice.h:299
f32 mVolumePrev[VOICES_MAX]
Definition AxVoice.h:306
VoiceSyncFlag
Definition AxVoice.h:134
@ SYNC_AX_LPF
Definition AxVoice.h:140
@ SYNC_AX_VOICE
Definition AxVoice.h:136
@ SYNC_AX_MIX
Definition AxVoice.h:139
@ SYNC_AX_BIQUAD
Definition AxVoice.h:142
@ SYNC_AX_SRC_INITIAL
Definition AxVoice.h:135
@ SYNC_AX_REMOTE
Definition AxVoice.h:141
@ SYNC_AX_SRC
Definition AxVoice.h:137
@ SYNC_AX_VE
Definition AxVoice.h:138
f32 mSurroundPan2
Definition AxVoice.h:295
void SetOutputLine(int lineFlag)
f32 mLpfFreq
Definition AxVoice.h:296
void SetSurroundPan2(f32 surroundPan)
void SetAxAdpcmLoop(int channelIndex, Format format, const AdpcmLoopParam *param) NO_INLINE
void SetAdpcmLoop(int channelIndex, Format format, const AdpcmLoopParam *param)
void(*) AxVoiceCallback(AxVoice *drovoice, CallbackStatus status, void *callbackArg)
Definition AxVoice.h:162
int mPriority
Definition AxVoice.h:291
virtual void InvalidateData(const void *start, const void *end)
Definition AxVoice.h:168
void SetRemoteSend(int remoteIndex, f32 send)
f32 mFxSend[AUX_BUS_NUM]
Definition AxVoice.h:300
bool mPauseFlag
Definition AxVoice.h:286
Format GetFormat()
Definition AxVoice.h:259
u32 GetCurrentPlayingDspAddress() const
f32 mPitch
Definition AxVoice.h:304
SrcType
Definition AxVoice.h:153
@ SRC_4TAP_AUTO
Definition AxVoice.h:159
@ SRC_4TAP_12K
Definition AxVoice.h:157
@ SRC_NONE
Definition AxVoice.h:154
@ SRC_4TAP_8K
Definition AxVoice.h:156
@ SRC_LINEAR
Definition AxVoice.h:155
@ SRC_4TAP_16K
Definition AxVoice.h:158
void SetLoopFlag(bool loopFlag)
Definition LinkList.h:23
static void end(b_oh_class *i_this)
Definition d_a_b_oh.cpp:343
static void * target
Definition d_a_npc_cd2.cpp:886
static initFunc init[]
Definition d_menu_collect.cpp:39
int i
Definition e_log.c:92
int j
Definition e_log.c:92
static u32 status
Definition fstload.c:9
unsigned long u32
Definition types.h:12
float f32
Definition types.h:25
unsigned short int u16
Definition types.h:10
signed long s32
Definition types.h:11
unsigned char u8
Definition types.h:8
ut::LinkList< AxVoice, offsetof(AxVoice, mLinkNode)> AxVoiceList
Definition AxVoice.h:315
u16 CalcMixVolume(f32 volume)
Definition AxVoice.h:23
int CalcAxvpbDelta(u16 init, u16 target)
Definition AxVoice.h:19
static const int CHANNEL_MAX
Definition snd_types.h:48
AuxBus
Definition snd_types.h:73
@ AUX_BUS_NUM
Definition snd_types.h:73
T Min(T a, T b)
Definition inlines.h:20
Definition HBMAnmController.h:6
static void callback(u32 param_0)
Definition OSExec.c:308
@ start
Definition strtold.c:23
Definition ax.h:73
u16 currentAddressHi
Definition ax.h:80
u16 loopAddressHi
Definition ax.h:76
u16 currentAddressLo
Definition ax.h:81
u16 loopAddressLo
Definition ax.h:77
u16 endAddressLo
Definition ax.h:79
u16 endAddressHi
Definition ax.h:78
Definition ax.h:99
Definition ax.h:84
Definition ax.h:105
Definition ax.h:13
Definition ax.h:223
Definition ax.h:92
Definition ax.h:62
u16 state
Definition ax.h:120
AXPBADDR addr
Definition ax.h:128
Definition ax.h:136
AXPB pb
Definition ax.h:152
Definition snd_types.h:82
Definition snd_types.h:101
Definition snd_types.h:93
Definition snd_types.h:113
Definition WaveFile.h:47
Definition ax.h:255