NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_audio.hpp
Go to the documentation of this file.
1#pragma once
3#include <game/snd/snd_2d_calc.hpp>
4#include <game/snd/snd_audio_mgr.hpp>
5#include <game/snd/snd_scene_manager.hpp>
6#include <game/mLib/m_vec.hpp>
7#include <lib/egg/core/eggHeap.h>
8#include <nw4r/snd.h>
9#include <nw4r/math.h>
10
11/// @file
12
13/// @ingroup bases
14
15class NMSndObjectBase : public nw4r::snd::SoundActor {
16public:
17 enum OBJ_TYPE {
18 OBJ_TYPE_0 = 0
19 };
20
21 NMSndObjectBase(OBJ_TYPE, nw4r::snd::SoundArchivePlayer &);
22 virtual ~NMSndObjectBase();
23 virtual u8 vf1C(ulong, int);
24
25 bool sendRemote(nw4r::snd::SoundHandle *p, unsigned long p1, unsigned long p2);
26
27 u32 getTotal() const { return mTotalCount; }
28
29 u32 mTotalCount;
30 u32 m_58;
31 Snd2DCalc *mpSnd2dCalc;
32 OBJ_TYPE mObjType;
33};
34
35template<int T>
36class NMSndObject : public NMSndObjectBase {
37public:
38 class SoundHandlePrm : public nw4r::snd::SoundHandle {
39 public:
40 SoundHandlePrm() : m_04(1.0f) {}
41
42 float m_04;
43 };
44
45 NMSndObject() :
46 NMSndObjectBase(NMSndObjectBase::OBJ_TYPE_0, SndAudioMgr::sInstance->mArcPlayer),
47 m_64(1.0f), m_68(0), m_6c(1.0f), m_70(0.0f)
48 {
49 SetPlayableSoundCount(0, T);
50 mTotalCount = T + 2;
51 m_58 = 1;
52 }
53
54 void processParams() {
55 for (int idx = 0; idx < mTotalCount; idx++) {
56 if (!mParams[idx].IsAttachedSound()) {
57 continue;
58 }
59 u32 flag = SndAudioMgr::sInstance->get3DCtrlFlag(mParams[idx].GetId());
60 if (~flag & 1) {
61 mParams[idx].SetVolume(m_64, 0);
62 } else if (
63 SndSceneMgr::sInstance->m_14 == 3 ||
64 (SndSceneMgr::sInstance->m_14 == 2 && SndSceneMgr::sInstance->m_10 == 3)
65 ) {
66 mParams[idx].SetVolume(m_64, 0);
67 }
68 if (~flag & 8) {
69 nw4r::snd::SoundArchive::SoundInfo info;
70 SndAudioMgr::sInstance->mpSndArc->ReadSoundInfo(mParams[idx].GetId(), &info);
71 if (m_68 < 0) {
72 mParams[idx].SetPlayerPriority(info.playerPriority + m_68);
73 } else {
74 mParams[idx].SetPlayerPriority(info.playerPriority);
75 }
76 }
77 if (~flag & 2) {
78 mParams[idx].SetPan(m_70);
79 }
80 }
81 }
82
83 void calc() {
84 for (int i = 0; i < T; i++) {
85 if (GetPlayingSoundCount(i) > 0) {
86 mpSnd2dCalc->fn_8019ee20(m_64, mPos, 0);
87 processParams();
88 break;
89 }
90 }
91 }
92
93 virtual void calc(const nw4r::math::VEC2 &pos) {
94 mPos = pos;
95 calc();
96 }
97
98 SoundHandlePrm *findHandle(int id) {
99 for (int i = 0; i < mTotalCount; i++) {
100 if (mParams[i].IsAttachedSound()) {
101 if (mParams[i].GetId() == id) {
102 return &mParams[i];
103 }
104 }
105 }
106 return nullptr;
107 }
108
109 SoundHandlePrm *getFreeHandle() {
110 for (int i = 0; i < mTotalCount; i++) {
111 if (!mParams[i].IsAttachedSound()) {
112 mParams[i].m_04 = 1.0f;
113 return &mParams[i];
114 }
115 }
116 return nullptr;
117 }
118
119 virtual SoundHandlePrm *startSound(unsigned long p1, unsigned long p2) {
120 SoundHandlePrm *p = getFreeHandle();
121 if (p != nullptr) {
122 detail_StartSound(p, p1, 0);
123 if (!p->IsAttachedSound()) {
124 return nullptr;
125 }
126 sendRemote(p, p1, p2);
127 return p;
128 }
129 return nullptr;
130 }
131 virtual SoundHandlePrm *holdSound(unsigned long p1, unsigned long p2) {
132 SoundHandlePrm *p = findHandle(p1);
133 if (p == nullptr) {
134 p = getFreeHandle();
135 }
136 if (p != nullptr) {
137 detail_HoldSound(p, p1, 0);
138 if (!p->IsAttachedSound()) {
139 return nullptr;
140 }
141 sendRemote(p, p1, p2);
142 return p;
143 }
144 return nullptr;
145 }
146
147 virtual SoundHandlePrm *prepareSound(unsigned long p1, unsigned long p2) {
148 SoundHandlePrm *p = getFreeHandle();
149 if (p != nullptr) {
150 detail_PrepareSound(p, p1, 0);
151 if (!p->IsAttachedSound()) {
152 return nullptr;
153 }
154 sendRemote(p, p1, p2);
155 return p;
156 }
157 return nullptr;
158 }
159
160 virtual SoundHandlePrm *startSound(unsigned long p1, short p2, unsigned long p3) {
161 SoundHandlePrm *p = getFreeHandle();
162 if (p != nullptr) {
163 detail_StartSound(p, p1, 0);
164 if (!p->IsAttachedSound()) {
165 return nullptr;
166 }
167 sendRemote(p, p1, p3);
168 if (SndAudioMgr::sInstance->mpSndArc->GetSoundType(p1) == 1) {
169 nw4r::snd::SeqSoundHandle handle(p);
170 handle.WriteVariable(0, p2);
171 }
172 return p;
173 }
174 return nullptr;
175 }
176 virtual SoundHandlePrm *holdSound(unsigned long p1, short p2, unsigned long p3) {
177 SoundHandlePrm *p = findHandle(p1);
178 if (p == nullptr) {
179 p = getFreeHandle();
180 }
181 if (p != nullptr) {
182 detail_HoldSound(p, p1, 0);
183 if (!p->IsAttachedSound()) {
184 return nullptr;
185 }
186 sendRemote(p, p1, p3);
187 if (SndAudioMgr::sInstance->mpSndArc->GetSoundType(p1) == 1) {
188 nw4r::snd::SeqSoundHandle handle(p);
189 handle.WriteVariable(0, p2);
190 }
191 return p;
192 }
193 return nullptr;
194 }
195
196 virtual SoundHandlePrm *startSound(unsigned long p1, const nw4r::math::VEC2 &p2, unsigned long p3) {
197 SoundHandlePrm *p = getFreeHandle();
198 if (p != nullptr) {
199 detail_StartSound(p, p1, 0);
200 if (!p->IsAttachedSound()) {
201 return nullptr;
202 }
203 SndAudioMgr::sInstance->setSoundPosition(p, p2);
204 sendRemote(p, p1, p3);
205 return p;
206 }
207 return nullptr;
208 }
209 virtual SoundHandlePrm *holdSound(unsigned long p1, const nw4r::math::VEC2 &p2, unsigned long p3) {
210 SoundHandlePrm *p = findHandle(p1);
211 if (p == nullptr) {
212 p = getFreeHandle();
213 }
214 if (p != nullptr) {
215 detail_HoldSound(p, p1, 0);
216 if (!p->IsAttachedSound()) {
217 return nullptr;
218 }
219 SndAudioMgr::sInstance->setSoundPosition(p, p2);
220 sendRemote(p, p1, p3);
221 return p;
222 }
223 return nullptr;
224 }
225
226 float m_64;
227 int m_68;
228 float m_6c;
229 float m_70;
230 SoundHandlePrm mParams[T + 2];
231 nw4r::math::VEC2 mPos;
232};
233
234class SndObjctPly : public NMSndObject<4> {
235public:
236 void calculate(const nw4r::math::VEC2 &pos) {
237 NMSndObject<4>::calc(pos);
238 }
239
240 virtual SoundHandlePrm *startSound(ulong p1, ulong p2);
241 virtual SoundHandlePrm *holdSound(ulong p1, ulong p2);
242 virtual SoundHandlePrm *startSound(ulong p1, short p2, ulong p3);
243 virtual SoundHandlePrm *holdSound(ulong p1, short p2, ulong p3);
244 virtual SoundHandlePrm *startSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
245 virtual SoundHandlePrm *holdSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
246
247 void stopPlyJumpSound();
248 void startFootSound(ulong, float, ulong);
249 void fn_8019AAB0(ulong, int);
250 void fn_8019ABB0(ulong, int);
251};
252
253class SndObjctEmy : public NMSndObject<4> {
254public:
255 virtual SoundHandlePrm *startSound(ulong p1, ulong p2);
256 virtual SoundHandlePrm *holdSound(ulong p1, ulong p2);
257 virtual SoundHandlePrm *startSound(ulong p1, short p2, ulong p3);
258 virtual SoundHandlePrm *holdSound(ulong p1, short p2, ulong p3);
259 virtual SoundHandlePrm *startSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
260 virtual SoundHandlePrm *holdSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
261};
262
263class SndObjctCmnEmy : public NMSndObject<4> {
264public:
265 virtual SoundHandlePrm *startSound(ulong p1, ulong p2);
266 virtual SoundHandlePrm *holdSound(ulong p1, ulong p2);
267 virtual SoundHandlePrm *startSound(ulong p1, short p2, ulong p3);
268 virtual SoundHandlePrm *holdSound(ulong p1, short p2, ulong p3);
269 virtual SoundHandlePrm *startSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
270 virtual SoundHandlePrm *holdSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
271};
272
273class SndObjctCmnMap : public NMSndObject<4> {
274public:
275 virtual SoundHandlePrm *startSound(ulong p1, ulong p2);
276 virtual SoundHandlePrm *holdSound(ulong p1, ulong p2);
277 virtual SoundHandlePrm *startSound(ulong p1, short p2, ulong p3);
278 virtual SoundHandlePrm *holdSound(ulong p1, short p2, ulong p3);
279 virtual SoundHandlePrm *startSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
280 virtual SoundHandlePrm *holdSound(ulong p1, const nw4r::math::VEC2 &p2, ulong p3);
281};
282
283namespace dAudio {
284 void init(EGG::Heap *heap);
285 void execute();
286 void requestStartScene(ProfileName sceneProf); ///< Sets up game audio for the given scene.
287 void createSndObjctCmn();
288 void deleteSndObjctCmn();
289 void setNextScene(ProfileName prof, unsigned long bgmIndex);
290 void pauseOffGameWithReset(); ///< @unofficial
291 void boot();
292 void loadSceneSnd();
293 bool isLoadedSceneSnd();
294 void FUN_8006a6a0(bool); ///< @unofficial
295 void setMainBgmNo(int);
296 void setBgmMode(int);
297 void updateBgmInfo();
298 bool isBgmAccentSign(u8);
299 void pauseOffMove(int);
300 void pauseMove(int);
301
302 int getRemotePlayer(int);
303 mVec2_c cvtSndObjctPos(const mVec2_c &);
304 mVec2_c cvtSndObjctPos(const mVec3_c &);
305
306 class SndObjctPlyBase_c : public SndObjctPly {
307 public:
308 SndObjctPlyBase_c() {
309 m_00 = 5;
310 m_04 = 6;
311 m_08 = 0;
312 }
313
314 u32 m_00;
315 u32 m_04;
316 u8 m_08;
317 };
318
319 class SndObjctPly_c : public SndObjctPlyBase_c {
320 public:
321 virtual SoundHandlePrm *startSound(ulong p1, ulong p2) {
322 return SndObjctPly::startSound(p1, p2);
323 }
324 virtual SoundHandlePrm *startSound(ulong p1, short p2, ulong p3) {
325 return SndObjctPly::startSound(p1, p2, p3);
326 }
327 virtual SoundHandlePrm *holdSound(ulong p1, ulong p2) {
328 return SndObjctPly::holdSound(p1, p2);
329 }
330 virtual SoundHandlePrm *holdSound(ulong p1, short p2, ulong p3) {
331 return SndObjctPly::holdSound(p1, p2, p3);
332 }
333 };
334
336 public:
337 SoundHandlePrm *startSound(unsigned long soundID, const nw4r::math::VEC2 &pos, int remPlayer) {
338 return SndObjctCmnEmy::startSound(soundID, pos, remPlayer);
339 }
340 SoundHandlePrm *startSound(unsigned long soundID, const mVec3_c &pos, int remPlayer) {
341 return SndObjctCmnEmy::startSound(soundID, dAudio::cvtSndObjctPos(pos), remPlayer);
342 }
343 };
344
345 class SndObjctEmy_c : public SndObjctEmy {
346 public:
347 virtual SoundHandlePrm *startSound(ulong p1, ulong p2) {
348 return SndObjctEmy::startSound(p1, p2);
349 }
350 virtual SoundHandlePrm *startSound(ulong p1, short p2, ulong p3) {
351 return SndObjctEmy::startSound(p1, p2, p3);
352 }
353 virtual SoundHandlePrm *holdSound(ulong p1, ulong p2) {
354 return SndObjctEmy::holdSound(p1, p2);
355 }
356 virtual SoundHandlePrm *holdSound(ulong p1, short p2, ulong p3) {
357 return SndObjctEmy::holdSound(p1, p2, p3);
358 }
359 };
360
362 public:
363 void startSound(unsigned long soundID, const nw4r::math::VEC2 &pos, int remPlayer) {
364 SndObjctCmnMap::startSound(soundID, pos, remPlayer);
365 }
366 void startSound(unsigned long soundID, const mVec3_c &pos, int remPlayer) {
367 SndObjctCmnMap::startSound(soundID, dAudio::cvtSndObjctPos(pos), remPlayer);
368 }
369 };
370
371 extern SndObjctCmnEmy_c *g_pSndObjEmy;
372 extern SndObjctCmnMap_c *g_pSndObjMap;
373
374 /// @unofficial
375 class SoundEffectID_t {
376 public:
377 SoundEffectID_t(u32 soundID) : id(soundID) {}
378
379 operator u32() const {
380 return id;
381 }
382
383 template<class T>
384 void playObjSound(T *obj, const mVec2_c &pos, int playerNo) const {
385 obj->startSound(id, dAudio::cvtSndObjctPos(pos), playerNo);
386 }
387
388 template<class T>
389 void playObjSound(T *obj, const mVec3_c &pos, int playerNo) const {
390 obj->startSound(id, dAudio::cvtSndObjctPos(pos), playerNo);
391 }
392
393 void playEmySound(const mVec2_c &pos, int playerNo) const {
394 playObjSound(dAudio::g_pSndObjEmy, pos, playerNo);
395 }
396
397 void playEmySound(const mVec3_c &pos, int playerNo) const {
398 playObjSound(dAudio::g_pSndObjEmy, pos, playerNo);
399 }
400
401 void playMapSound(const mVec2_c &pos, int playerNo) const {
402 playObjSound(dAudio::g_pSndObjMap, pos, playerNo);
403 }
404
405 void playMapSound(const mVec3_c &pos, int playerNo) const {
406 playObjSound(dAudio::g_pSndObjMap, pos, playerNo);
407 }
408
409 private:
410 u32 id;
411 };
412};
A two-dimensional floating point vector.
Definition m_vec.hpp:26
A three-dimensional floating point vector.
Definition m_vec.hpp:122
void requestStartScene(ProfileName sceneProf)
Sets up game audio for the given scene.
void FUN_8006a6a0(bool)
void pauseOffGameWithReset()
u16 ProfileName
The name of a profile. Value is a fProfile::PROFILE_NAME_e.
Definition f_profile.hpp:32