summaryrefslogtreecommitdiff
path: root/arm7/lib/src
diff options
context:
space:
mode:
authorMichael Panzlaff <michael.panzlaff@fau.de>2021-06-27 00:04:45 +0200
committerMichael Panzlaff <michael.panzlaff@fau.de>2021-08-25 18:03:40 +0200
commitf9aae26dd2155d78f111907f47feb0ec5be9f30c (patch)
tree415daaf7270b05950892b2b81a68bdb6982e4d63 /arm7/lib/src
parent83c92e11bdb440c80042ad7434966a03bc7b18c3 (diff)
arm7: decompile SND_lockChannel
Diffstat (limited to 'arm7/lib/src')
-rw-r--r--arm7/lib/src/SND_lockChannel.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c
new file mode 100644
index 00000000..cecfd871
--- /dev/null
+++ b/arm7/lib/src/SND_lockChannel.c
@@ -0,0 +1,79 @@
+#include "SND_lockChannel.h"
+
+#include "SND_work.h"
+#include "SND_exChannel.h"
+#include "SND.h"
+
+// TODO make these vars static after merging this file with exChannel
+u32 sUnlockedChannelMask;
+u32 sLockedChannelMask;
+
+void SND_StopUnlockedChannel(u32 channelMask) {
+ struct SNDExChannel *chn;
+
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) {
+ if ((channelMask & 1) == 0)
+ continue;
+
+ chn = &SNDi_Work.channels[i];
+
+ if (sUnlockedChannelMask & (1 << i))
+ continue;
+
+ if (chn->callback)
+ chn->callback(chn, 0, chn->callbackUserData);
+
+ SND_StopChannel(i, 0);
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ chn->flags.syncFlag = 0;
+ chn->flags.active = 0;
+ }
+}
+
+void SND_LockChannel(u32 channelMask, u32 locked) {
+ struct SNDExChannel *chn;
+ u32 j = channelMask;
+ int i = 0;
+
+ for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) {
+ if ((j & 1) == 0)
+ continue;
+
+ chn = &SNDi_Work.channels[i];
+
+ if (sUnlockedChannelMask & (1 << i))
+ continue;
+
+ if (chn->callback)
+ chn->callback(chn, 0, chn->callbackUserData);
+
+ SND_StopChannel(i, 0);
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ chn->flags.syncFlag = 0;
+ chn->flags.active = 0;
+ }
+
+ if (locked & 1) {
+ sLockedChannelMask |= channelMask;
+ } else {
+ sUnlockedChannelMask |= channelMask;
+ }
+}
+
+void SND_UnlockChannel(u32 channelMask, u32 locked) {
+ if (locked & 1) {
+ sLockedChannelMask &= ~channelMask;
+ } else {
+ sUnlockedChannelMask &= ~channelMask;
+ }
+}
+
+u32 SND_GetLockedChannel(u32 locked) {
+ if (locked & 1) {
+ return sLockedChannelMask;
+ } else {
+ return sUnlockedChannelMask;
+ }
+}