summaryrefslogtreecommitdiff
path: root/arm9/lib/src/SND_bank.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/lib/src/SND_bank.c')
-rw-r--r--arm9/lib/src/SND_bank.c174
1 files changed, 0 insertions, 174 deletions
diff --git a/arm9/lib/src/SND_bank.c b/arm9/lib/src/SND_bank.c
deleted file mode 100644
index 44075454..00000000
--- a/arm9/lib/src/SND_bank.c
+++ /dev/null
@@ -1,174 +0,0 @@
-#include "SND_bank.h"
-#include "OS_mutex.h"
-
-void DC_StoreRange(const void *, u32);
-
-/*
- * WaveArc linking seems to work like the following:
- *
- * Each SNDBankData can have up to 4 WaveArcs assigned.
- * To avoid loading the same WaveArc by multiple banks,
- * a linked list using WaveArcLinks is chained through all banks
- * which use a WaveArc.
- *
- * That WaveArc has a head pointer, which points to the first
- * WaveArcLink in that chain of banks.
- */
-
-/*
- * Set bank's wavearc link at index to specified wavearc
- */
-ARM_FUNC void SND_AssignWaveArc(struct SNDBankData *bankData, s32 index, struct SNDWaveArc *waveArc) {
- SNDi_LockMutex();
- struct SNDWaveArc *selectedWaveArc = bankData->waveArcLinks[index].waveArc;
- if (selectedWaveArc != NULL) {
- if (waveArc == selectedWaveArc) {
- SNDi_UnlockMutex();
- return;
- }
-
- if (&bankData->waveArcLinks[index] == selectedWaveArc->waveArcLLHead) {
- selectedWaveArc->waveArcLLHead = bankData->waveArcLinks[index].waveArcLLnext;
- DC_StoreRange(bankData->waveArcLinks[index].waveArc, sizeof(struct SNDWaveArc));
- } else {
- struct SNDWaveArcLink *cur;
- for (cur = selectedWaveArc->waveArcLLHead; cur != NULL; cur = cur->waveArcLLnext) {
- if (&bankData->waveArcLinks[index] == cur->waveArcLLnext)
- break;
- }
- cur->waveArcLLnext = bankData->waveArcLinks[index].waveArcLLnext;
- DC_StoreRange(cur, sizeof(*cur));
- }
- }
- struct SNDWaveArcLink *oldHead = waveArc->waveArcLLHead;
- waveArc->waveArcLLHead = &bankData->waveArcLinks[index];
- bankData->waveArcLinks[index].waveArcLLnext = oldHead;
- bankData->waveArcLinks[index].waveArc = waveArc;
- // BUG: Shouldn't the mutex unlock be after writing to cache?
- SNDi_UnlockMutex();
- DC_StoreRange(bankData, sizeof(*bankData));
- DC_StoreRange(waveArc, sizeof(*waveArc));
-}
-
-ARM_FUNC void SND_DestroyBank(struct SNDBankData *bankData) {
- SNDi_LockMutex();
-
- for (s32 i = 0; i < SND_BANK_MAX_WAVEARC; i++) {
- struct SNDWaveArcLink *curWaveArcLink = &bankData->waveArcLinks[i];
- struct SNDWaveArc *curWaveArc = bankData->waveArcLinks[i].waveArc;
-
- if (curWaveArc == NULL)
- continue;
-
- if (curWaveArcLink == curWaveArc->waveArcLLHead) {
- curWaveArc->waveArcLLHead = bankData->waveArcLinks[i].waveArcLLnext;
- DC_StoreRange(curWaveArc, sizeof(*curWaveArc));
- } else {
- struct SNDWaveArcLink *cur;
- for (cur = curWaveArc->waveArcLLHead; cur != NULL; cur = cur->waveArcLLnext) {
- if (&bankData->waveArcLinks[i] == cur->waveArcLLnext)
- break;
- }
- cur->waveArcLLnext = bankData->waveArcLinks[i].waveArcLLnext;
- DC_StoreRange(cur, sizeof(*cur));
- }
- }
-
- SNDi_UnlockMutex();
-}
-
-ARM_FUNC void SND_DestroyWaveArc(struct SNDWaveArc *waveArc) {
- SNDi_LockMutex();
- struct SNDWaveArcLink *cur = waveArc->waveArcLLHead;
-
- while (cur != NULL) {
- struct SNDWaveArcLink *newCur = cur->waveArcLLnext;
- cur->waveArc = NULL;
- cur->waveArcLLnext = NULL;
- DC_StoreRange(cur, sizeof(*cur));
- cur = newCur;
- }
-
- SNDi_UnlockMutex();
-}
-
-ARM_FUNC struct SNDInstPos SND_GetFirstInstDataPos(const struct SNDBankData *bankData) {
-#pragma unused (bankData)
- struct SNDInstPos retval;
- retval.program = 0;
- retval.index = 0;
- return retval;
-}
-
-ARM_FUNC static inline struct SNDDrumSet *test(const struct SNDBankData *bank, u32 off) {
- return (struct SNDDrumSet *)((u8 *)bank + (off >> 8));
-}
-
-ARM_FUNC BOOL SND_GetNextInstData(const struct SNDBankData *bankData, struct SNDInstData *instData, struct SNDInstPos *instPos) {
- while (instPos->program < bankData->instCount) {
- struct SNDDrumSet *drums;
- struct SNDKeySplit *keySplit;
-
- u32 instOffset = bankData->instOffsets[instPos->program];
- instData->type = SND_INST_OFFSET_TYPE(instOffset);
-
- switch (instData->type) {
- case SND_INST_PCM:
- case SND_INST_PSG:
- case SND_INST_NOISE:
- case SND_INST_DIRECTPCM:
- case SND_INST_DUMMY:
- instData->param = *SND_INST_OFFSET_NORMAL(bankData, instOffset);
- instPos->program++;
- return TRUE;
- case SND_INST_DRUM_TABLE:
- drums = SND_INST_OFFSET_DRUMS(bankData, instOffset);
- // silly programming 101: put a loop in a place that never loops
- for (; instPos->index < drums->maxKey - drums->minKey + 1;) {
- *instData = drums->instruments[instPos->index];
- instPos->index++;
- return TRUE;
- }
- break;
- case SND_INST_KEY_SPLIT:
- keySplit = SND_INST_OFFSET_KEYSPL(bankData, instOffset);
- for (; instPos->index < SND_INST_MAX_KEYSPLIT;) {
- if (keySplit->key[instPos->index] == 0)
- break;
- *instData = keySplit->instruments[instPos->index];
- instPos->index++;
- return TRUE;
- }
- break;
- }
-
- instPos->program++;
- instPos->index = 0;
- }
- return FALSE;
-}
-
-ARM_FUNC u32 SND_GetWaveDataCount(const struct SNDWaveArc *waveArc) {
- return waveArc->waveCount;
-}
-
-ARM_FUNC void SND_SetWaveDataAddress(struct SNDWaveArc *waveArc, s32 index, const struct SNDWaveData *waveData) {
- SNDi_LockMutex();
- waveArc->waveOffsets[index] = (u32)waveData;
- DC_StoreRange(&waveArc->waveOffsets[index], sizeof(u32));
- SNDi_UnlockMutex();
-}
-
-ARM_FUNC const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 index) {
- SNDi_LockMutex();
- u32 retval = waveArc->waveOffsets[index];
- if (retval != 0) {
- // < 0x2000000 aka, not a pointer to main RAM
- if (retval < 0x2000000)
- retval = (u32)&((u8 *)waveArc)[retval];
- } else {
- retval = 0;
- }
- SNDi_UnlockMutex();
- return (struct SNDWaveData *)retval;
-}