SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
SpkSpeakerCtrl.cpp
1#include "Game/Speaker/SpkSpeakerCtrl.hpp"
2#include <revolution/wpad.h>
3#include <mem.h>
4
5SpkSoundHandle sAdjustSoundHandle[4];
6
7void SpkSpeakerCtrl::setMixingBuffer(SpkMixingBuffer *pMixingBuffer) {
8 BOOL status = OSDisableInterrupts();
9 sMixingBuffer = pMixingBuffer;
10 OSRestoreInterrupts(status);
11}
12
13// SpkSpeakerCtrl::setup
14
15void SpkSpeakerCtrl::connect(s32 idx) {
16 BOOL state = OSDisableInterrupts();
17 sSpeakerInfo[idx]._0 = 1;
18 sSpeakerInfo[idx]._1 = 0;
19 sSpeakerInfo[idx]._24 = 0;
20 SpkSpeakerCtrl::initReconnect(idx);
21 sSpeakerInfo[idx]._30 = -1;
22 SpkSpeakerCtrl::setSpeakerOn(idx);
23 OSRestoreInterrupts(state);
24}
25
26void SpkSpeakerCtrl::setSpeakerOn(s32 idx) {
27 BOOL state = OSDisableInterrupts();
28 s32 val = WPADControlSpeaker(idx, 1, SpkSpeakerCtrl::setSpeakerOnCallback);
29
30 if (val == -2) {
31 sSpeakerInfo[idx]._24 = 1;
32 }
33 else {
34 sSpeakerInfo[idx]._24 = 0;
35 }
36
37 OSRestoreInterrupts(state);
38}
39
40void SpkSpeakerCtrl::setSpeakerOnCallback(s32 idx, s32 a2) {
41 BOOL state = OSDisableInterrupts();
42 if (a2 == 0) {
43 sSpeakerInfo[idx]._24 = 0;
44 SpkSpeakerCtrl::setSpeakerPlay(idx);
45 }
46 else {
47 if (a2 == -3) {
48 sSpeakerInfo[idx]._24 = 1;
49 }
50 }
51
52 OSRestoreInterrupts(state);
53}
54
55void SpkSpeakerCtrl::setSpeakerPlay(s32 idx) {
56 BOOL state = OSDisableInterrupts();
57 s32 val = WPADControlSpeaker(idx, 4, SpkSpeakerCtrl::startPlayCallback);
58
59 if (val == -2) {
60 sSpeakerInfo[idx]._24 = 2;
61 }
62 else {
63 sSpeakerInfo[idx]._24 = 0;
64 }
65
66 OSRestoreInterrupts(state);
67}
68
69#ifdef NON_MATCHING
70void SpkSpeakerCtrl::startPlayCallback(s32 idx, s32 a2) {
71 BOOL enabled = OSDisableInterrupts();
72
73 if (!enabled) {
74 SpeakerInfo* inf = &sSpeakerInfo[idx];
75 inf->_1 = 1;
76 inf->_22 = 1;
77 inf->_24 = 0;
78 inf->_30 = 28800;
79 memset(&sSpeakerInfo[idx]._2, 0, 0x20);
80 }
81 else {
82 if (enabled == -3) {
83 sSpeakerInfo[idx]._24 = 2;
84 }
85 }
86
87 OSRestoreInterrupts(enabled);
88}
89#endif
90
91void SpkSpeakerCtrl::setSpeakerOff(s32 idx) {
92 sSpeakerInfo[idx]._1 = 0;
93 sSpeakerInfo[idx]._24 = 0;
94 sSpeakerInfo[idx]._30 = -1;
95 WPADControlSpeaker(idx, 0, 0);
96}
97
98void SpkSpeakerCtrl::retryConnection(s32 idx) {
99 switch (sSpeakerInfo[idx]._24) {
100 case 0:
101 case 3:
102 break;
103 case 1:
104 SpkSpeakerCtrl::setSpeakerOn(idx);
105 break;
106 case 2:
107 SpkSpeakerCtrl::setSpeakerPlay(idx);
108 break;
109 }
110}
111
112void SpkSpeakerCtrl::reconnect(s32 idx) {
113 if (sSpeakerInfo[idx]._0) {
114 sSpeakerInfo[idx]._28 = 1;
115 }
116}
117
118void SpkSpeakerCtrl::framework() {
119 for (int i = 0; i < 4; i++) {
120 SpkSpeakerCtrl::continuousUsingProcess(i);
121 SpkSpeakerCtrl::reconnectProcess(i);
122 SpkSpeakerCtrl::retryConnection(i);
123 }
124}
125
126void SpkSpeakerCtrl::reconnectProcess(s32 idx) {
127 if (sSpeakerInfo[idx]._0) {
128 switch (sSpeakerInfo[idx]._28) {
129 case 0:
130 break;
131 case 1:
132 SpkSpeakerCtrl::setSpeakerOff(idx);
133 sSpeakerInfo[idx]._28 = 2;
134 sSpeakerInfo[idx]._2C = 0x14;
135 break;
136 case 2:
137 sSpeakerInfo[idx]._2C--;
138
139 if (sSpeakerInfo[idx]._2C > 0) {
140 sSpeakerInfo[idx]._2C = -1;
141 sSpeakerInfo[idx]._28 = 3;
142 }
143 break;
144 case 3:
145 SpkSpeakerCtrl::setSpeakerOn(idx);
146 sSpeakerInfo[idx]._28 = 0;
147 break;
148 }
149 }
150}
151
152void SpkSpeakerCtrl::initReconnect(s32 idx) {
153 sSpeakerInfo[idx]._28 = 0;
154 sSpeakerInfo[idx]._2C = -1;
155}
156
157void SpkSpeakerCtrl::continuousUsingProcess(s32 idx) {
158 if (sSpeakerInfo[idx]._30 >= 0) {
159 sSpeakerInfo[idx]._30 = sSpeakerInfo[idx]._30 - 1;
160 if (sSpeakerInfo[idx]._30 <= 0) {
161 sSpeakerInfo[idx]._30 = -1;
162 SpkSpeakerCtrl::reconnect(idx);
163 }
164 }
165}
166
167void SpkSpeakerCtrl::updateSpeaker(OSAlarm *, OSContext *) {
168 for (s32 i = 0; i < 4; i++) {
169 if (sMixingBuffer != nullptr) {
170 SpeakerInfo& inf = getSpeakerInfo(i);
171
172 if (inf._1) {
173 if (!inf._23) {
174 if (sMixingBuffer->update(i)) {
175 bool v5 = true;
176
177 if (inf._1 && sMixingBuffer != nullptr) {
178 BOOL en = OSDisableInterrupts();
179
180 if (!WPADCanSendStreamData(i)) {
181
182 OSRestoreInterrupts(en);
183 }
184 else {
185 if (inf._22) {
186 v5 = false;
187 inf._22 = 0;
188 }
189
190 const s16* samples = sMixingBuffer->getSamples(i);
191 u8 data[16];
192 WENCGetEncodeData(&inf._2, v5, samples, 40, data);
193 WPADSendStreamData(i, data, 0x14);
194 OSRestoreInterrupts(en);
195 }
196 }
197 }
198 else {
199 inf._22 = 1;
200 }
201 }
202 }
203 }
204 }
205}
206
207bool SpkSpeakerCtrl::isEnable(s32 idx) {
208 bool ret = false;
209
210 if (WPADIsSpeakerEnabled(idx) && sSpeakerInfo[idx]._1 != 0 && sSpeakerInfo[idx]._24 != 0 && sMixingBuffer != 0) {
211 ret = true;
212 }
213
214 return ret;
215}
216
217void SpkSpeakerCtrl::extensionProcess(s32, s32) {
218
219}
220
221f32 SpkSpeakerCtrl::getDeviceVolume(s32 channel) {
222 if (channel >= 0 && !WPADIsSpeakerEnabled(channel)) {
223 return 0.0f;
224 }
225
226 return WPADGetSpeakerVolume() / 127.0f;
227}