diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-01 12:07:49 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:50 +0200 |
commit | 94657eec81f491a4d5925b2965bb1ea0d635705e (patch) | |
tree | 07aa909ca0aaa800b98c4c7156c75eba1fdfb210 /arm7/lib/src | |
parent | 5adc7017a33cf6d55cf76d95a72fc6f5d879bcc3 (diff) |
arm7: merge SND_channel into SND_exChannel
Diffstat (limited to 'arm7/lib/src')
-rw-r--r-- | arm7/lib/src/SND.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/SND_channel.c | 116 | ||||
-rw-r--r-- | arm7/lib/src/SND_command.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/SND_exChannel.c | 114 |
4 files changed, 113 insertions, 119 deletions
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; +} |