diff options
Diffstat (limited to 'arm7/lib')
-rw-r--r-- | arm7/lib/include/SND_exChannel.h | 3 | ||||
-rw-r--r-- | arm7/lib/include/SND_lockChannel.h | 11 | ||||
-rw-r--r-- | arm7/lib/src/SND_lockChannel.c | 79 |
3 files changed, 93 insertions, 0 deletions
diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 976d2786..8450a629 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -3,9 +3,12 @@ #include "nitro/types.h" +#include "nitro/SND_main_shared.h" + void SND_ExChannelInit(void); BOOL SND_IsChannelActive(s32 idx); void SND_UpdateExChannel(void); void SND_ExChannelMain(BOOL update); +void SND_FreeExChannel(struct SNDExChannel *chn); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_lockChannel.h b/arm7/lib/include/SND_lockChannel.h new file mode 100644 index 00000000..ed7fd872 --- /dev/null +++ b/arm7/lib/include/SND_lockChannel.h @@ -0,0 +1,11 @@ +#ifndef GUARD_SND_LOCKCHANNEL_H +#define GUARD_SND_LOCKCHANNEL_H + +#include "nitro/types.h" + +void SND_StopUnlockedChannel(u32 channelMask); +void SND_LockChannel(u32 channelMask, u32 locked); +void SND_UnlockChannel(u32 channelMask, u32 locked); +u32 SND_GetLockedChannel(u32 locked); + +#endif //GUARD_SND_LOCKCHANNEL_H 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; + } +} |