summaryrefslogtreecommitdiff
path: root/src/m4a.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/m4a.c')
-rw-r--r--src/m4a.c128
1 files changed, 77 insertions, 51 deletions
diff --git a/src/m4a.c b/src/m4a.c
index b8f9e21c1..f061ba9b9 100644
--- a/src/m4a.c
+++ b/src/m4a.c
@@ -22,7 +22,8 @@ u8 gMPlayMemAccArea[0x10];
u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
{
- u32 val1, val2;
+ u32 val1;
+ u32 val2;
u32 fineAdjustShifted = fineAdjust << 24;
if (key > 178)
@@ -314,7 +315,7 @@ void MPlayExtender(struct CgbChannel *cgbChans)
void MusicPlayerJumpTableCopy(void)
{
- asm("svc 0x2A");
+ asm("swi 0x2A");
}
void ClearChain(void *x)
@@ -351,25 +352,25 @@ void SoundInit(struct SoundInfo *soundInfo)
| SOUND_ALL_MIX_FULL;
REG_SOUNDBIAS_H = (REG_SOUNDBIAS_H & 0x3F) | 0x40;
- REG_DMA1SAD = (u32)soundInfo->pcmBuffer;
- REG_DMA1DAD = (u32)&REG_FIFO_A;
- REG_DMA2SAD = (u32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;
- REG_DMA2DAD = (u32)&REG_FIFO_B;
+ REG_DMA1SAD = (s32)soundInfo->pcmBuffer;
+ REG_DMA1DAD = (s32)&REG_FIFO_A;
+ REG_DMA2SAD = (s32)soundInfo->pcmBuffer + PCM_DMA_BUF_SIZE;
+ REG_DMA2DAD = (s32)&REG_FIFO_B;
SOUND_INFO_PTR = soundInfo;
CpuFill32(0, soundInfo, sizeof(struct SoundInfo));
soundInfo->maxChans = 8;
soundInfo->masterVolume = 15;
- soundInfo->plynote = ply_note;
+ soundInfo->plynote = (u32)ply_note;
soundInfo->CgbSound = DummyFunc;
soundInfo->CgbOscOff = (void (*)(u8))DummyFunc;
soundInfo->MidiKeyToCgbFreq = (u32 (*)(u8, u8, u8))DummyFunc;
- soundInfo->ExtVolPit = (void (*)(struct MusicPlayerInfo *, struct MusicPlayerTrack *))DummyFunc;
+ soundInfo->ExtVolPit = (u32)DummyFunc;
MPlayJumpTableCopy(gMPlayJumpTable);
- soundInfo->MPlayJumpTable = (void (**)())gMPlayJumpTable;
+ soundInfo->MPlayJumpTable = (u32)gMPlayJumpTable;
SampleFreqSet(SOUND_MODE_FREQ_13379);
@@ -380,7 +381,7 @@ void SampleFreqSet(u32 freq)
{
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- freq = (freq & SOUND_MODE_FREQ) >> SOUND_MODE_FREQ_SHIFT;
+ freq = (freq & 0xF0000) >> 16;
soundInfo->freq = freq;
soundInfo->pcmSamplesPerVBlank = gPcmSamplesPerVBlankTable[freq - 1];
soundInfo->pcmDmaPeriod = PCM_DMA_BUF_SIZE / soundInfo->pcmSamplesPerVBlank;
@@ -431,9 +432,14 @@ void m4aSoundMode(u32 mode)
soundInfo->maxChans = temp >> SOUND_MODE_MAXCHN_SHIFT;
- for (temp = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; temp != 0; temp--,chan++)
+ temp = MAX_DIRECTSOUND_CHANNELS;
+ chan = &soundInfo->chans[0];
+
+ while (temp != 0)
{
chan->status = 0;
+ temp--;
+ chan++;
}
}
@@ -463,28 +469,37 @@ void m4aSoundMode(u32 mode)
void SoundClear(void)
{
- s32 i;
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- struct SoundChannel *chan;
+ s32 i;
+ void *chan;
if (soundInfo->ident != ID_NUMBER)
return;
soundInfo->ident++;
- for (i = MAX_DIRECTSOUND_CHANNELS, chan = soundInfo->chans; i > 0; i--,chan++)
+ i = MAX_DIRECTSOUND_CHANNELS;
+ chan = &soundInfo->chans[0];
+
+ while (i > 0)
{
- chan->status = 0;
+ ((struct SoundChannel *)chan)->status = 0;
+ i--;
+ chan = (void *)((s32)chan + sizeof(struct SoundChannel));
}
- chan = (struct SoundChannel *)soundInfo->cgbChans;
+ chan = soundInfo->cgbChans;
if (chan)
{
- for (i=1; i<=4; i++,chan++)
+ i = 1;
+
+ while (i <= 4)
{
soundInfo->CgbOscOff(i);
- chan->status = 0;
+ ((struct CgbChannel *)chan)->sf = 0;
+ i++;
+ chan = (void *)((s32)chan + sizeof(struct CgbChannel));
}
}
@@ -495,20 +510,21 @@ void m4aSoundVSyncOff(void)
{
struct SoundInfo *soundInfo = SOUND_INFO_PTR;
- if (soundInfo->ident < ID_NUMBER || soundInfo->ident > ID_NUMBER + 1)
- return;
- soundInfo->ident += 10;
+ if (soundInfo->ident >= ID_NUMBER && soundInfo->ident <= ID_NUMBER + 1)
+ {
+ soundInfo->ident += 10;
- if (REG_DMA1CNT & (DMA_REPEAT << 16))
- REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
+ if (REG_DMA1CNT & (DMA_REPEAT << 16))
+ REG_DMA1CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
- if (REG_DMA2CNT & (DMA_REPEAT << 16))
- REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
+ if (REG_DMA2CNT & (DMA_REPEAT << 16))
+ REG_DMA2CNT = ((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4;
- REG_DMA1CNT_H = DMA_32BIT;
- REG_DMA2CNT_H = DMA_32BIT;
+ REG_DMA1CNT_H = DMA_32BIT;
+ REG_DMA2CNT_H = DMA_32BIT;
- CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));
+ CpuFill32(0, soundInfo->pcmBuffer, sizeof(soundInfo->pcmBuffer));
+ }
}
void m4aSoundVSyncOn(void)
@@ -564,7 +580,7 @@ void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track
}
soundInfo->intp = (u32)mplayInfo;
- soundInfo->func = MPlayMain;
+ soundInfo->func = (u32)MPlayMain;
soundInfo->ident = ID_NUMBER;
mplayInfo->ident = ID_NUMBER;
}
@@ -598,18 +614,25 @@ void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader
mplayInfo->tempoC = 0;
mplayInfo->fadeOI = 0;
- for (i = 0, track = mplayInfo->tracks; i < songHeader->trackCount && i < mplayInfo->trackCount; i++, track++)
+ i = 0;
+ track = mplayInfo->tracks;
+
+ while (i < songHeader->trackCount && i < mplayInfo->trackCount)
{
TrackStop(mplayInfo, track);
track->flags = MPT_FLG_EXIST | MPT_FLG_START;
track->chan = 0;
track->cmdPtr = songHeader->part[i];
+ i++;
+ track++;
}
- for (; i < mplayInfo->trackCount; i++, track++)
+ while (i < mplayInfo->trackCount)
{
TrackStop(mplayInfo, track);
track->flags = 0;
+ i++;
+ track++;
}
if (songHeader->reverb & SOUND_MODE_REVERB_SET)
@@ -630,9 +653,14 @@ void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo)
mplayInfo->ident++;
mplayInfo->status |= MUSICPLAYER_STATUS_PAUSE;
- for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++)
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+
+ while (i > 0)
{
TrackStop(mplayInfo, track);
+ i--;
+ track++;
}
mplayInfo->ident = ID_NUMBER;
@@ -643,28 +671,17 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
s32 i;
struct MusicPlayerTrack *track;
u16 fadeOV;
-#ifdef NONMATCHING
- u16 mask;
-#else
- register u16 mask asm("r2");
-#endif // NONMATCHING
if (mplayInfo->fadeOI == 0)
return;
-
- mplayInfo->fadeOC--;
- mask = 0xFFFF;
-
- if (mplayInfo->fadeOC != 0)
+ if (--mplayInfo->fadeOC != 0)
return;
mplayInfo->fadeOC = mplayInfo->fadeOI;
if (mplayInfo->fadeOV & FADE_IN)
{
- mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT);
-
- if ((u16)(mplayInfo->fadeOV & mask) >= (64 << FADE_VOL_SHIFT))
+ if ((u16)(mplayInfo->fadeOV += (4 << FADE_VOL_SHIFT)) >= (64 << FADE_VOL_SHIFT))
{
mplayInfo->fadeOV = (64 << FADE_VOL_SHIFT);
mplayInfo->fadeOI = 0;
@@ -672,12 +689,12 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
}
else
{
- mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT);
-
- if ((s16)(mplayInfo->fadeOV & mask) <= 0)
+ if ((s16)(mplayInfo->fadeOV -= (4 << FADE_VOL_SHIFT)) <= 0)
{
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
- for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++)
+ while (i > 0)
{
u32 val;
@@ -689,6 +706,9 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
if (!val)
track->flags = 0;
+
+ i--;
+ track++;
}
if (mplayInfo->fadeOV & TEMPORARY_FADE)
@@ -701,7 +721,10 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
}
}
- for (i = mplayInfo->trackCount, track = mplayInfo->tracks; i > 0; i--, track++)
+ i = mplayInfo->trackCount;
+ track = mplayInfo->tracks;
+
+ while (i > 0)
{
if (track->flags & MPT_FLG_EXIST)
{
@@ -710,6 +733,9 @@ void FadeOutBody(struct MusicPlayerInfo *mplayInfo)
track->volX = (fadeOV >> FADE_VOL_SHIFT);
track->flags |= MPT_FLG_VOLCHG;
}
+
+ i--;
+ track++;
}
}
@@ -717,7 +743,7 @@ void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tr
{
if (track->flags & MPT_FLG_VOLSET)
{
- u32 x;
+ s32 x;
s32 y;
x = (u32)(track->vol * track->volX) >> 5;