summaryrefslogtreecommitdiff
path: root/arm7/lib/src/SND_channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/lib/src/SND_channel.c')
-rw-r--r--arm7/lib/src/SND_channel.c107
1 files changed, 74 insertions, 33 deletions
diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c
index 99b80a7c..be0bba3a 100644
--- a/arm7/lib/src/SND_channel.c
+++ b/arm7/lib/src/SND_channel.c
@@ -1,7 +1,7 @@
#include "SND_channel.h"
-#include "registers.h"
#include "SND_work.h"
+#include "registers.h"
static int sMasterPan = -1;
@@ -11,50 +11,67 @@ static int sSurroundDecay;
static int CalcSurroundDecay(int vol, int pan);
-void SND_SetupChannelPcm(int chnIdx, const void *data, int format, int loop, int loopStart, int loopLength, int volume, int volumeDiv, int timer, int pan) {
+void SND_SetupChannelPcm(int chnIdx,
+ const void *data,
+ int format,
+ int loop,
+ int loopStart,
+ int loopLength,
+ int volume,
+ int volumeDiv,
+ int timer,
+ int pan)
+{
int off = chnIdx * 0x10;
sOrgPan[chnIdx] = (u8)pan;
if (sMasterPan >= 0)
pan = sMasterPan;
-
+
sOrgVolume[chnIdx] = (u8)volume;
- if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) {
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
volume = CalcSurroundDecay(volume, pan);
}
- reg_SOUNDoffCNT(off) = (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume));
+ reg_SOUNDoffCNT(off) =
+ (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume));
reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer);
reg_SOUNDoffPNT(off) = (u16)loopStart;
reg_SOUNDoffLEN(off) = (u32)loopLength;
reg_SOUNDoffSAD(off) = (u32)data;
}
-void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan) {
+void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan)
+{
int off = chnIdx * 0x10;
sOrgPan[chnIdx] = (u8)pan;
if (sMasterPan >= 0)
pan = sMasterPan;
-
+
sOrgVolume[chnIdx] = (u8)volume;
- if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) {
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
volume = CalcSurroundDecay(volume, pan);
}
- reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume);
+ reg_SOUNDoffCNT(off) =
+ (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume);
reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer);
}
-void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan) {
+void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan)
+{
int off = chnIdx * 0x10;
sOrgPan[chnIdx] = (u8)pan;
if (sMasterPan >= 0)
pan = sMasterPan;
-
+
sOrgVolume[chnIdx] = (u8)volume;
- if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) {
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
volume = CalcSurroundDecay(volume, pan);
}
@@ -62,7 +79,8 @@ void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int
reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer);
}
-void SND_StopChannel(int idx, int hold) {
+void SND_StopChannel(int idx, int hold)
+{
vu32 *reg = &reg_SOUNDxCNT(idx);
u32 v = *reg;
@@ -77,10 +95,12 @@ void SND_StopChannel(int idx, int hold) {
*reg = v;
}
-void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) {
+void SND_SetChannelVolume(int chnIdx, int vol, int volDiv)
+{
sOrgVolume[chnIdx] = (u8)vol;
- if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) {
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
int pan = reg_SOUNDxCNT_PAN(chnIdx);
vol = CalcSurroundDecay(vol, pan);
}
@@ -88,64 +108,85 @@ void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) {
reg_SOUNDxCNT_VOLS(chnIdx) = (u16)((volDiv << 8) | vol);
}
-void SND_SetChannelTimer(int chnIdx, int timer) {
+void SND_SetChannelTimer(int chnIdx, int timer)
+{
reg_SOUNDxTMR(chnIdx) = (u16)(0x10000 - timer);
}
-void SND_SetChannelPan(int chnIdx, int pan) {
+void SND_SetChannelPan(int chnIdx, int pan)
+{
sOrgPan[chnIdx] = (u8)pan;
- if (sMasterPan >= 0) {
+ if (sMasterPan >= 0)
+ {
pan = sMasterPan;
}
reg_SOUNDxCNT_PAN(chnIdx) = (u8)pan;
- if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) {
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
reg_SOUNDxCNT_VOL(chnIdx) = (u8)CalcSurroundDecay(sOrgVolume[chnIdx], pan);
}
}
-BOOL SND_IsChannelActive(int chnIdx) {
+BOOL SND_IsChannelActive(int chnIdx)
+{
return (reg_SOUNDxCNT_STAT(chnIdx) & 0x80) != 0;
}
-void SND_SetMasterPan(int pan) {
+void SND_SetMasterPan(int pan)
+{
sMasterPan = pan;
- if (pan >= 0) {
- for (int i = 0; i < SND_CHANNEL_COUNT; i++) {
+ if (pan >= 0)
+ {
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
reg_SOUNDxCNT_PAN(i) = (u8)pan;
}
- } else {
- for (int i = 0; i < SND_CHANNEL_COUNT; i++) {
+ }
+ else
+ {
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
reg_SOUNDxCNT_PAN(i) = sOrgPan[i];
}
}
}
-u32 SND_GetChannelControl(int chnIdx) {
+u32 SND_GetChannelControl(int chnIdx)
+{
return reg_SOUNDxCNT(chnIdx);
}
-void SNDi_SetSurroundDecay(int decay) {
+void SNDi_SetSurroundDecay(int decay)
+{
sSurroundDecay = decay;
- for (int i = 0; i < SND_CHANNEL_COUNT; i++) {
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
// do not process channel 1+3 (capture playback channels)
- if ((1 << i) & 0xFFF5) {
+ if ((1 << i) & 0xFFF5)
+ {
int pan = reg_SOUNDxCNT_PAN(i);
reg_SOUNDxCNT_VOL(i) = (u8)CalcSurroundDecay(sOrgVolume[i], pan);
}
}
}
-static int CalcSurroundDecay(int vol, int pan) {
- if (pan < 24) {
+static int CalcSurroundDecay(int vol, int pan)
+{
+ if (pan < 24)
+ {
return vol * (sSurroundDecay * (pan + 40) + ((0x7FFF - sSurroundDecay) << 6)) >> 21;
- } else if (pan <= 104) {
+ }
+ else if (pan <= 104)
+ {
return vol;
- } else {
+ }
+ else
+ {
return vol * (-sSurroundDecay * (pan - 40) + ((sSurroundDecay + 0x7FFF) << 6)) >> 21;
}
}