1#include "Game/Speaker/SpkSpeakerCtrl.hpp"
2#include <revolution/wpad.h>
8 BOOL status = OSDisableInterrupts();
9 sMixingBuffer = pMixingBuffer;
10 OSRestoreInterrupts(status);
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);
26void SpkSpeakerCtrl::setSpeakerOn(s32 idx) {
27 BOOL state = OSDisableInterrupts();
28 s32 val = WPADControlSpeaker(idx, 1, SpkSpeakerCtrl::setSpeakerOnCallback);
31 sSpeakerInfo[idx]._24 = 1;
34 sSpeakerInfo[idx]._24 = 0;
37 OSRestoreInterrupts(state);
40void SpkSpeakerCtrl::setSpeakerOnCallback(s32 idx, s32 a2) {
41 BOOL state = OSDisableInterrupts();
43 sSpeakerInfo[idx]._24 = 0;
44 SpkSpeakerCtrl::setSpeakerPlay(idx);
48 sSpeakerInfo[idx]._24 = 1;
52 OSRestoreInterrupts(state);
55void SpkSpeakerCtrl::setSpeakerPlay(s32 idx) {
56 BOOL state = OSDisableInterrupts();
57 s32 val = WPADControlSpeaker(idx, 4, SpkSpeakerCtrl::startPlayCallback);
60 sSpeakerInfo[idx]._24 = 2;
63 sSpeakerInfo[idx]._24 = 0;
66 OSRestoreInterrupts(state);
70void SpkSpeakerCtrl::startPlayCallback(s32 idx, s32 a2) {
71 BOOL enabled = OSDisableInterrupts();
79 memset(&sSpeakerInfo[idx]._2, 0, 0x20);
83 sSpeakerInfo[idx]._24 = 2;
87 OSRestoreInterrupts(enabled);
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);
98void SpkSpeakerCtrl::retryConnection(s32 idx) {
99 switch (sSpeakerInfo[idx]._24) {
104 SpkSpeakerCtrl::setSpeakerOn(idx);
107 SpkSpeakerCtrl::setSpeakerPlay(idx);
112void SpkSpeakerCtrl::reconnect(s32 idx) {
113 if (sSpeakerInfo[idx]._0) {
114 sSpeakerInfo[idx]._28 = 1;
118void SpkSpeakerCtrl::framework() {
119 for (
int i = 0; i < 4; i++) {
120 SpkSpeakerCtrl::continuousUsingProcess(i);
121 SpkSpeakerCtrl::reconnectProcess(i);
122 SpkSpeakerCtrl::retryConnection(i);
126void SpkSpeakerCtrl::reconnectProcess(s32 idx) {
127 if (sSpeakerInfo[idx]._0) {
128 switch (sSpeakerInfo[idx]._28) {
132 SpkSpeakerCtrl::setSpeakerOff(idx);
133 sSpeakerInfo[idx]._28 = 2;
134 sSpeakerInfo[idx]._2C = 0x14;
137 sSpeakerInfo[idx]._2C--;
139 if (sSpeakerInfo[idx]._2C > 0) {
140 sSpeakerInfo[idx]._2C = -1;
141 sSpeakerInfo[idx]._28 = 3;
145 SpkSpeakerCtrl::setSpeakerOn(idx);
146 sSpeakerInfo[idx]._28 = 0;
152void SpkSpeakerCtrl::initReconnect(s32 idx) {
153 sSpeakerInfo[idx]._28 = 0;
154 sSpeakerInfo[idx]._2C = -1;
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);
167void SpkSpeakerCtrl::updateSpeaker(OSAlarm *, OSContext *) {
168 for (s32 i = 0; i < 4; i++) {
169 if (sMixingBuffer !=
nullptr) {
174 if (sMixingBuffer->update(i)) {
177 if (inf._1 && sMixingBuffer !=
nullptr) {
178 BOOL en = OSDisableInterrupts();
180 if (!WPADCanSendStreamData(i)) {
182 OSRestoreInterrupts(en);
190 const s16* samples = sMixingBuffer->getSamples(i);
192 WENCGetEncodeData(&inf._2, v5, samples, 40, data);
193 WPADSendStreamData(i, data, 0x14);
194 OSRestoreInterrupts(en);
207bool SpkSpeakerCtrl::isEnable(s32 idx) {
210 if (WPADIsSpeakerEnabled(idx) && sSpeakerInfo[idx]._1 != 0 && sSpeakerInfo[idx]._24 != 0 && sMixingBuffer != 0) {
217void SpkSpeakerCtrl::extensionProcess(s32, s32) {
221f32 SpkSpeakerCtrl::getDeviceVolume(s32 channel) {
222 if (channel >= 0 && !WPADIsSpeakerEnabled(channel)) {
226 return WPADGetSpeakerVolume() / 127.0f;