summaryrefslogtreecommitdiff
path: root/arm9/lib/src/SND_interface.c
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-05-29 18:45:08 +0100
committerred031000 <rubenru09@aol.com>2020-05-29 18:45:08 +0100
commit0d8876b37adebcda571659089dcff343fccdfc8b (patch)
tree0fc796c2d9a711cd8ba6f1919391a57174aa5b3f /arm9/lib/src/SND_interface.c
parent83d33f36fcf46dec8ea99b86563a19885be4bd8e (diff)
parentd6fd8d1ed926feebffab4154a84eb70a84083bfc (diff)
Merge branch 'master' of https://github.com/martmists/pokediamond
Diffstat (limited to 'arm9/lib/src/SND_interface.c')
-rw-r--r--arm9/lib/src/SND_interface.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/arm9/lib/src/SND_interface.c b/arm9/lib/src/SND_interface.c
new file mode 100644
index 00000000..e8369477
--- /dev/null
+++ b/arm9/lib/src/SND_interface.c
@@ -0,0 +1,172 @@
+#include "SND_interface.h"
+#include "SND_command.h"
+
+static void PushCommand_impl(s32 id, u32 par1, u32 par2, u32 par3, u32 par4);
+#define PushCmd1(id, a) PushCommand_impl(id, (u32)(a), 0, 0, 0)
+#define PushCmd2(id, a, b) PushCommand_impl(id, (u32)(a), (u32)(b), 0, 0)
+#define PushCmd3(id, a, b, c) PushCommand_impl(id, (u32)(a), (u32)(b), (u32)(c), 0)
+#define PushCmd4(id, a, b, c, d) PushCommand_impl(id, (u32)(a), (u32)(b), (u32)(c), (u32)(d))
+
+// TODO fill in "random" constants with macros
+
+// ARM_FUNC void SND_StartSeq(s32 player, const void *seqBasePtr, u32 seqOffset, struct SNDBankData *bankData) { }
+
+ARM_FUNC void SND_StopSeq(s32 player) {
+ PushCmd1(SND_CMD_STOP_SEQ, player);
+}
+
+ARM_FUNC void SND_PrepareSeq(s32 player, const void *seqBasePtr, u32 seqOffset, struct SNDBankData *bankData) {
+ PushCmd4(SND_CMD_PREPARE_SEQ, player, seqBasePtr, seqOffset, bankData);
+}
+
+ARM_FUNC void SND_StartPreparedSeq(s32 player) {
+ PushCmd1(SND_CMD_START_PREPARED_SEQ, player);
+}
+
+ARM_FUNC void SND_PauseSeq(s32 player, BOOL flag) {
+ PushCmd2(SND_CMD_PAUSE_SEQ, player, flag);
+}
+
+// ARM_FUNC void SND_SetPlayerTempoRatio(s32 player, s32 ratio) { }
+
+ARM_FUNC void SND_SetPlayerVolume(s32 player, s32 volume) {
+ SNDi_SetPlayerParam(player, 6, volume, 2);
+}
+
+ARM_FUNC void SND_SetPlayerChannelPriority(s32 player, s32 prio) {
+ SNDi_SetPlayerParam(player, 4, prio, 1);
+}
+
+// ARM_FUNC void SND_SetPlayerLocalVariable(s32 player, s32 varNo, s16 var) { }
+
+// ARM_FUNC void SND_SetPlayerGlobalVariable(s32 varNo, s16 var) { }
+
+// ARM_FUNC void SND_SetTrackVolume(s32 player, u32 trackBitMask, s32 volume) { }
+
+ARM_FUNC void SND_SetTrackPitch(s32 player, u32 trackBitMask, s32 pitch) {
+ SNDi_SetTrackParam(player, trackBitMask, 12, pitch, 2);
+}
+
+ARM_FUNC void SND_SetTrackPan(s32 player, u32 trackBitMask, s32 pan) {
+ SNDi_SetTrackParam(player, trackBitMask, 9, pan, 1);
+}
+
+ARM_FUNC void SND_SetTrackAllocatableChannel(s32 player, u32 trackBitMask, u32 chnBitMask) {
+ PushCmd3(SND_CMD_ALLOCATABLE_CHANNEL, player, trackBitMask, chnBitMask);
+}
+
+ARM_FUNC void SND_StartTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u32 flags) {
+ PushCmd4(SND_CMD_START_TIMER, chnBitMask, capBitMask, alarmBitMask, flags);
+}
+
+ARM_FUNC void SND_StopTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u32 flags) {
+ s32 i = 0;
+ u32 tmpMask = alarmBitMask;
+
+ while (i < SND_ALARM_COUNT && tmpMask != 0) {
+ if (tmpMask & 1)
+ SNDi_IncAlarmId(i);
+ i++;
+ tmpMask >>= 1;
+ }
+
+ PushCmd4(SND_CMD_STOP_TIMER, chnBitMask, capBitMask, alarmBitMask, flags);
+}
+
+ARM_FUNC void SND_SetupCapture(s32 capture, s32 format, void *bufferPtr, u32 length, BOOL loopFlag, s32 in, s32 out) {
+ PushCmd3(SND_CMD_SETUP_CAPTURE, bufferPtr, length,
+ (capture << 31) | (format << 30) | (loopFlag << 29) | (in << 28) | (out << 27));
+}
+
+ARM_FUNC void SND_SetupAlarm(s32 alarm, u32 tick, u32 period, SNDAlarmCallback cb, void *userData) {
+ PushCmd4(SND_CMD_SETUP_ALARM, alarm, tick, period, SNDi_SetAlarmHandler(alarm, cb, userData));
+}
+
+// ARM_FUNC void SND_SetTrackMute(s32 player, u32 trackBitMask, BOOL flag) { }
+
+// ARM_FUNC void SND_StopUnlockedChannel(u32 chnBitMask, u32 flags) { }
+
+ARM_FUNC void SND_LockChannel(u32 chnBitMask, u32 flags) {
+ PushCmd2(SND_CMD_LOCK_CHANNEL, chnBitMask, flags);
+}
+
+ARM_FUNC void SND_UnlockChannel(u32 chnBitMask, u32 flags) {
+ PushCmd2(SND_CMD_UNLOCK_CHANNEL, chnBitMask, flags);
+}
+
+ARM_FUNC void SND_SetChannelTimer(u32 chnBitMask, s32 timer) {
+ PushCmd2(SND_CMD_CHANNEL_TIMER, chnBitMask, timer);
+}
+
+ARM_FUNC void SND_SetChannelVolume(u32 chnBitMask, s32 volume, s32 chnDataShift) {
+ PushCmd3(SND_CMD_CHANNEL_VOLUME, chnBitMask, volume, chnDataShift);
+}
+
+ARM_FUNC void SND_SetChannelPan(u32 chnBitMask, s32 pan) {
+ PushCmd2(SND_CMD_CHANNEL_PAN, chnBitMask, pan);
+}
+
+ARM_FUNC void SND_SetupChannelPcm(s32 chn, s32 waveFormat, const void *dataAddr, s32 loopMode, s32 loopStart, s32 dataLen, s32 volume, s32 chnDataShift, s32 timer, s32 pan) {
+ PushCmd4(SND_CMD_SETUP_CHANNEL_PCM,
+ chn | (timer << 16),
+ dataAddr,
+ (volume << 24) | (chnDataShift << 22) | dataLen,
+ (loopMode << 26) | (waveFormat << 24) | (pan << 16) | loopStart);
+}
+
+// ARM_FUNC void SND_SetupChannelPsg(s32 chn, s32 sndDuty, s32 volume, s32 chnDataShift, s32 timer, s32 pan) { }
+
+// ARM_FUNC void SND_SetupChannelNoise(s32 chn, s32 volume, s32 chnDataShift, s32 timer, s32 pan) { }
+
+ARM_FUNC void SND_InvalidateSeqData(const void *start, const void *end) {
+ PushCmd2(SND_CMD_INVALIDATE_SEQ, start, end);
+}
+
+ARM_FUNC void SND_InvalidateBankData(const void *start, const void *end) {
+ PushCmd2(SND_CMD_INVALIDATE_BANK, start, end);
+}
+
+ARM_FUNC void SND_InvalidateWaveData(const void *start, const void *end) {
+ PushCmd2(SND_CMD_INVALIDATE_WAVE, start, end);
+}
+
+// ARM_FUNC void SND_SetMasterVolume(s32 volume) { }
+
+ARM_FUNC void SND_SetOutputSelector(s32 left, s32 right, s32 channel1, s32 channel3) {
+ PushCmd4(SND_CMD_OUTPUT_SELECTOR, left, right, channel1, channel3);
+}
+
+ARM_FUNC void SND_SetMasterPan(s32 pan) {
+ PushCmd1(SND_CMD_MASTER_PAN, pan);
+}
+
+ARM_FUNC void SND_ResetMasterPan(void) {
+ PushCmd1(SND_CMD_MASTER_PAN, -1);
+}
+
+// ARM_FUNC void SND_ReadDriverInfo(struct SNDDriverInfo *info) { }
+
+ARM_FUNC void SNDi_SetPlayerParam(s32 player, u32 offset, u32 data, s32 size) {
+ PushCmd4(SND_CMD_PLAYER_PARAM, player, offset, data, size);
+}
+
+ARM_FUNC void SNDi_SetTrackParam(s32 player, u32 trackBitMask, u32 offset, u32 data, s32 size) {
+ PushCmd4(SND_CMD_TRACK_PARAM, player | (size << 24), trackBitMask, offset, data);
+}
+
+// ARM_FUNC void SNDi_SetSurroundDecay(s32 decay) { }
+
+// ARM_FUNC void SNDi_SkipSeq(s32 player, u32 tick) { }
+
+ARM_FUNC static void PushCommand_impl(s32 id, u32 par1, u32 par2, u32 par3, u32 par4) {
+ struct SNDCommand *cmd = SND_AllocCommand(SND_CMD_FLAG_BLOCK);
+ if (cmd == NULL)
+ return;
+
+ cmd->id = id;
+ cmd->arg[0] = par1;
+ cmd->arg[1] = par2;
+ cmd->arg[2] = par3;
+ cmd->arg[3] = par4;
+ SND_PushCommand(cmd);
+}