summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/arm7.lsf1
-rw-r--r--arm7/lib/include/SND_channel.h51
-rw-r--r--arm7/lib/include/SND_exChannel.h42
-rw-r--r--arm7/lib/src/SND.c1
-rw-r--r--arm7/lib/src/SND_channel.c116
-rw-r--r--arm7/lib/src/SND_command.c1
-rw-r--r--arm7/lib/src/SND_exChannel.c114
7 files changed, 155 insertions, 171 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf
index e313647d..c8c7e318 100644
--- a/arm7/arm7.lsf
+++ b/arm7/arm7.lsf
@@ -44,7 +44,6 @@ Autoload WRAM
Object SND_util.o
Object SND_main.o
Object SND_capture.o
- Object SND_channel.o
Object SND_exChannel.o
Object SND_seq.o
Object SND_bank.o
diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h
deleted file mode 100644
index 9e015beb..00000000
--- a/arm7/lib/include/SND_channel.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef GUARD_SND_CHANNEL_H
-#define GUARD_SND_CHANNEL_H
-
-#include "nitro/types.h"
-
-#include "SND_exChannel.h"
-
-void SNDi_SetSurroundDecay(int decay);
-
-void SND_SetupChannelPcm(
- int chnIdx,
- const void *data,
- int format,
- int loop,
- int loopStart,
- int loopLen,
- int volume,
- int volumeDiv,
- int timer,
- int pan
-);
-
-void SND_SetupChannelPsg(
- int chnIdx,
- int waveDuty,
- int volume,
- int volumeDiv,
- int timer,
- int pan
-);
-
-void SND_SetupChannelNoise(
- int chnIdx,
- int volume,
- int volumeDiv,
- int timer,
- int pan
-);
-
-void SND_StopChannel(int chnIdx, int hold);
-
-void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv);
-void SND_SetChannelPan(int chnIdx, int pan);
-void SND_SetChannelTimer(int chnIdx, int timer);
-
-u32 SND_GetChannelControl(int idx);
-
-// TODO move this function to SND_exChannel.c
-u16 CalcDecayCoeff(int value);
-
-#endif //GUARD_SND_CHANNEL_H
diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h
index 03fd4b41..a2d19971 100644
--- a/arm7/lib/include/SND_exChannel.h
+++ b/arm7/lib/include/SND_exChannel.h
@@ -42,5 +42,47 @@ void SND_InitLfoParam(struct SNDLfoParam *lfoParam);
void SND_StartLfo(struct SNDLfo *lfo);
void SND_UpdateLfo(struct SNDLfo *lfo);
int SND_GetLfoValue(struct SNDLfo *lfo);
+void SNDi_SetSurroundDecay(int decay);
+
+void SND_SetupChannelPcm(
+ int chnIdx,
+ const void *data,
+ int format,
+ int loop,
+ int loopStart,
+ int loopLen,
+ int volume,
+ int volumeDiv,
+ int timer,
+ int pan
+);
+
+void SND_SetupChannelPsg(
+ int chnIdx,
+ int waveDuty,
+ int volume,
+ int volumeDiv,
+ int timer,
+ int pan
+);
+
+void SND_SetupChannelNoise(
+ int chnIdx,
+ int volume,
+ int volumeDiv,
+ int timer,
+ int pan
+);
+
+void SND_StopChannel(int chnIdx, int hold);
+
+void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv);
+void SND_SetChannelPan(int chnIdx, int pan);
+void SND_SetChannelTimer(int chnIdx, int timer);
+
+u32 SND_GetChannelControl(int idx);
+
+// TODO move this function to SND_exChannel.c
+u16 CalcDecayCoeff(int value);
#endif //GUARD_SND_EXCHANNEL_H
diff --git a/arm7/lib/src/SND.c b/arm7/lib/src/SND.c
index 6c17fa69..c4b9d900 100644
--- a/arm7/lib/src/SND.c
+++ b/arm7/lib/src/SND.c
@@ -7,7 +7,6 @@
#include "PM.h"
#include "SND_exChannel.h"
#include "SND_work.h"
-#include "SND_channel.h"
static int sMasterPan = -1;
diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c
deleted file mode 100644
index 66acf606..00000000
--- a/arm7/lib/src/SND_channel.c
+++ /dev/null
@@ -1,116 +0,0 @@
-#include "SND_channel.h"
-
-#include "SND_lfo.h"
-
-// TODO remove this extern once we actually know where this table is
-extern u8 sSampleDataShiftTable[4];
-
-u16 CalcDecayCoeff(int vol) {
- if (vol == 127)
- return 0xFFFF;
- else if (vol == 126)
- return 0x3C00;
- else if (vol < 50)
- return (u16)(vol * 2 + 1);
- else
- return (u16)(0x1E00 / (126 - vol));
-}
-
-void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) {
- chn->channelLLNext = NULL;
- chn->callback = callback;
- chn->callbackUserData = callbackUserData;
- chn->length = 0;
- chn->priority = (u8)priority;
- chn->volume = 127;
- chn->flags.start = FALSE;
- chn->flags.autoSweep = TRUE;
- chn->midiKey = 60;
- chn->rootMidiKey = 60;
- chn->velocity = 127;
- chn->initPan = 0;
- chn->userDecay = 0;
- chn->userDecay2 = 0;
- chn->userPitch = 0;
- chn->userPan = 0;
- chn->panRange = 127;
- chn->sweepPitch = 0;
- chn->sweepLength = 0;
- chn->sweepCounter = 0;
-
- SND_SetExChannelAttack(chn, 127);
- SND_SetExChannelDecay(chn, 127);
- SND_SetExChannelSustain(chn, 127);
- SND_SetExChannelRelease(chn, 127);
- SND_InitLfoParam(&chn->lfo.param);
-}
-
-void ExChannelStart(struct SNDExChannel *chn, int length) {
- chn->envAttenuation = -92544;
- chn->envStatus = 0;
- chn->length = length;
- SND_StartLfo(&chn->lfo);
- chn->flags.start = TRUE;
- chn->flags.active = TRUE;
-}
-
-int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) {
- int vol_a = chn_a->volume & 0xFF;
- int vol_b = chn_b->volume & 0xFF;
-
- vol_a <<= 4;
- vol_b <<= 4;
-
- vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8];
- vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8];
-
- if (vol_a != vol_b) {
- if (vol_a < vol_b)
- return 1;
- else
- return -1;
- }
- return 0;
-}
-
-int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) {
- s64 result;
-
- if (chn->sweepPitch == 0) {
- result = 0;
- } else if (chn->sweepCounter >= chn->sweepLength) {
- result = 0;
- } else {
- result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength;
-
- if (step && chn->flags.autoSweep)
- chn->sweepCounter++;
- }
-
- return (int)result;
-}
-
-int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) {
- s64 result = SND_GetLfoValue(&chn->lfo);
-
- if (result != 0) {
- switch (chn->lfo.param.target) {
- case SND_LFO_VOLUME:
- result *= 60;
- break;
- case SND_LFO_PITCH:
- result <<= 6;
- break;
- case SND_LFO_PAN:
- result <<= 6;
- break;
- }
- result >>= 14;
- }
-
- if (step) {
- SND_UpdateLfo(&chn->lfo);
- }
-
- return (int)result;
-}
diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c
index 1ffcb0d5..ada6161c 100644
--- a/arm7/lib/src/SND_command.c
+++ b/arm7/lib/src/SND_command.c
@@ -10,7 +10,6 @@
#include "SND.h"
#include "SND_alarm.h"
#include "SND_capture.h"
-#include "SND_channel.h"
#include "SND_exChannel.h"
#include "SND_main.h"
#include "SND_seq.h"
diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c
index 6081150f..7e41aea3 100644
--- a/arm7/lib/src/SND_exChannel.c
+++ b/arm7/lib/src/SND_exChannel.c
@@ -1,6 +1,5 @@
#include "SND_exChannel.h"
-#include "SND_channel.h"
#include "SND_main.h"
#include "SND_work.h"
#include "SND_util.h"
@@ -14,6 +13,9 @@ extern u8 sAttackCoeffTable[19];
static u32 sLockedChannelMask;
static u32 sWeakLockedChannelMask;
+// TODO remove this extern once we actually know where this table is
+extern u8 sSampleDataShiftTable[4];
+
void SND_ExChannelInit(void) {
struct SNDExChannel *chn;
s32 i;
@@ -468,3 +470,113 @@ int SND_GetLfoValue(struct SNDLfo *lfo) {
return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range;
}
}
+
+u16 CalcDecayCoeff(int vol) {
+ if (vol == 127)
+ return 0xFFFF;
+ else if (vol == 126)
+ return 0x3C00;
+ else if (vol < 50)
+ return (u16)(vol * 2 + 1);
+ else
+ return (u16)(0x1E00 / (126 - vol));
+}
+
+void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) {
+ chn->channelLLNext = NULL;
+ chn->callback = callback;
+ chn->callbackUserData = callbackUserData;
+ chn->length = 0;
+ chn->priority = (u8)priority;
+ chn->volume = 127;
+ chn->flags.start = FALSE;
+ chn->flags.autoSweep = TRUE;
+ chn->midiKey = 60;
+ chn->rootMidiKey = 60;
+ chn->velocity = 127;
+ chn->initPan = 0;
+ chn->userDecay = 0;
+ chn->userDecay2 = 0;
+ chn->userPitch = 0;
+ chn->userPan = 0;
+ chn->panRange = 127;
+ chn->sweepPitch = 0;
+ chn->sweepLength = 0;
+ chn->sweepCounter = 0;
+
+ SND_SetExChannelAttack(chn, 127);
+ SND_SetExChannelDecay(chn, 127);
+ SND_SetExChannelSustain(chn, 127);
+ SND_SetExChannelRelease(chn, 127);
+ SND_InitLfoParam(&chn->lfo.param);
+}
+
+void ExChannelStart(struct SNDExChannel *chn, int length) {
+ chn->envAttenuation = -92544;
+ chn->envStatus = 0;
+ chn->length = length;
+ SND_StartLfo(&chn->lfo);
+ chn->flags.start = TRUE;
+ chn->flags.active = TRUE;
+}
+
+int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) {
+ int vol_a = chn_a->volume & 0xFF;
+ int vol_b = chn_b->volume & 0xFF;
+
+ vol_a <<= 4;
+ vol_b <<= 4;
+
+ vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8];
+ vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8];
+
+ if (vol_a != vol_b) {
+ if (vol_a < vol_b)
+ return 1;
+ else
+ return -1;
+ }
+ return 0;
+}
+
+int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) {
+ s64 result;
+
+ if (chn->sweepPitch == 0) {
+ result = 0;
+ } else if (chn->sweepCounter >= chn->sweepLength) {
+ result = 0;
+ } else {
+ result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength;
+
+ if (step && chn->flags.autoSweep)
+ chn->sweepCounter++;
+ }
+
+ return (int)result;
+}
+
+int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) {
+ s64 result = SND_GetLfoValue(&chn->lfo);
+
+ if (result != 0) {
+ switch (chn->lfo.param.target) {
+ case SND_LFO_VOLUME:
+ result *= 60;
+ break;
+ case SND_LFO_PITCH:
+ result <<= 6;
+ break;
+ case SND_LFO_PAN:
+ result <<= 6;
+ break;
+ }
+ result >>= 14;
+ }
+
+ if (step) {
+ SND_UpdateLfo(&chn->lfo);
+ }
+
+ return (int)result;
+}