Fix floating point crash with pitch bend table + various audio optimizations (#746)

* Move audio TTLs to improve dcache

Saves over 100us even when audio is idle

* Improve additional audio runtime by reducing some unnecessary float math

* Pause channel/layer processing on sfx channels when idle

* Fix possible floating point UB/crash with gPitchBendFrequencyScale
This commit is contained in:
Gregory Heskett
2024-02-04 02:29:38 -05:00
committed by GitHub
parent 88c2cdb0a0
commit 1de4b9144b
12 changed files with 113 additions and 177 deletions

View File

@@ -475,8 +475,8 @@
.byte \a
.endm
.macro chan_testlayerfinished a
.byte 0x80 + \a
.macro chan_testlayersfinished
.byte 0x80
.endm
.macro chan_setlayer a, b
@@ -488,14 +488,14 @@
.byte 0x60 + \a
.endm
.macro chan_freelayer a
.byte 0x90 + \a
.macro chan_freelayers
.byte 0x90
.endm
#else
.macro chan_testlayerfinished a
.byte 0x0 + \a
.macro chan_testlayersfinished
.byte 0x00
.endm
.macro chan_ioreadval a
@@ -507,8 +507,8 @@
.byte (\b - sequence_start) >> 8, (\b - sequence_start) & 0xff
.endm
.macro chan_freelayer a
.byte 0xa0 + \a
.macro chan_freelayers
.byte 0xa0
.endm
#ifdef VERSION_EU

View File

@@ -73,13 +73,11 @@ chan_jump .main_loop_023589
// Main loop for standard, non-continuous sound effects
.main_loop_023589:
chan_delay1
chan_hang
chan_ioreadval 0
chan_bltz .main_loop_023589
.start_playing_023589:
chan_freelayer 0
chan_freelayer 1
chan_freelayer 2
chan_freelayers
chan_setval 0
chan_iowriteval 5
chan_ioreadval 4
@@ -93,13 +91,11 @@ chan_bltz .skip_023589 // if we have a signal:
chan_beqz .force_stop_023589 // told to stop
chan_jump .start_playing_023589 // told to play something else
.skip_023589:
chan_testlayerfinished 0
chan_beqz .poll_023589 // if layer 0 hasn't finished, keep polling
chan_testlayersfinished
chan_beqz .poll_023589 // if all layers haven't finished, keep polling
chan_jump .main_loop_023589 // otherwise go back to the main loop
.force_stop_023589:
chan_freelayer 0
chan_freelayer 1
chan_freelayer 2
chan_freelayers
chan_jump .main_loop_023589
.channel1:
@@ -140,13 +136,11 @@ chan_jump .main_loop_146
// Main loop for moving, env and air sound effects, which play continuously
.main_loop_146:
chan_delay1
chan_hang
chan_ioreadval 0
chan_bltz .main_loop_146
.start_playing_146:
chan_freelayer 0
chan_freelayer 1
chan_freelayer 2
chan_freelayers
chan_setvolscale 127
chan_setval 0
chan_iowriteval 5
@@ -161,9 +155,7 @@ chan_bltz .poll_146
chan_beqz .force_stop_146
chan_jump .start_playing_146
.force_stop_146:
chan_freelayer 0
chan_freelayer 1
chan_freelayer 2
chan_freelayers
chan_jump .main_loop_146
.channel7:
@@ -177,13 +169,11 @@ chan_setdyntable .channel7_table
// Loop for menu sound effects
.main_loop_7:
chan_delay1
chan_hang
chan_ioreadval 0
chan_bltz .main_loop_7
.start_playing_7:
chan_freelayer 0
chan_freelayer 1
chan_freelayer 2
chan_freelayers
chan_setval 0
chan_iowriteval 5
chan_setreverb 0
@@ -201,14 +191,12 @@ chan_bltz .skip_7 // if we have a signal:
chan_unreservenotes
chan_jump .start_playing_7 // told to play something else
.skip_7:
chan_testlayerfinished 0
chan_beqz .poll_7 // if layer 0 hasn't finished, keep polling
chan_testlayersfinished
chan_beqz .poll_7 // if all layers haven't finished, keep polling
chan_unreservenotes
chan_jump .main_loop_7 // otherwise go back to the main loop
.force_stop_7:
chan_freelayer 0
chan_freelayer 1
chan_freelayer 2
chan_freelayers
chan_unreservenotes
chan_jump .main_loop_7

View File

@@ -244,41 +244,36 @@ u16 gAudioCosineTable[128] = {
// between -1 and +1 octave.
// gPitchBendFrequencyScale[k] = (0.5 * 2^(k/127))
#ifndef VERSION_SH
#if defined(VERSION_EU)
f32 gPitchBendFrequencyScale[256] = {
0.5f,
#else
f32 gPitchBendFrequencyScale[255] = {
#endif
0.500000f, 0.502736f, 0.505488f, 0.508254f, 0.511036f, 0.513833f, 0.516645f, 0.519472f, 0.522315f,
0.525174f, 0.528048f, 0.530938f, 0.533843f, 0.536765f, 0.539702f, 0.542656f, 0.545626f, 0.548612f,
0.551614f, 0.554633f, 0.557669f, 0.560721f, 0.563789f, 0.566875f, 0.569977f, 0.573097f, 0.576233f,
0.579387f, 0.582558f, 0.585746f, 0.588951f, 0.592175f, 0.595415f, 0.598674f, 0.601950f, 0.605245f,
0.608557f, 0.611888f, 0.615236f, 0.618603f, 0.621989f, 0.625393f, 0.628815f, 0.632257f, 0.635717f,
0.639196f, 0.642694f, 0.646212f, 0.649748f, 0.653304f, 0.656880f, 0.660475f, 0.664089f, 0.667724f,
0.671378f, 0.675052f, 0.678747f, 0.682461f, 0.686196f, 0.689952f, 0.693727f, 0.697524f, 0.701341f,
0.705180f, 0.709039f, 0.712919f, 0.716821f, 0.720744f, 0.724689f, 0.728655f, 0.732642f, 0.736652f,
0.740684f, 0.744737f, 0.748813f, 0.752911f, 0.757031f, 0.761175f, 0.765340f, 0.769529f, 0.773740f,
0.777975f, 0.782232f, 0.786513f, 0.790818f, 0.795146f, 0.799497f, 0.803873f, 0.808272f, 0.812696f,
0.817144f, 0.821616f, 0.826112f, 0.830633f, 0.835179f, 0.839750f, 0.844346f, 0.848966f, 0.853613f,
0.858284f, 0.862982f, 0.867704f, 0.872453f, 0.877228f, 0.882029f, 0.886856f, 0.891709f, 0.896590f,
0.901496f, 0.906430f, 0.911391f, 0.916379f, 0.921394f, 0.926436f, 0.931507f, 0.936604f, 0.941730f,
0.946884f, 0.952066f, 0.957277f, 0.962516f, 0.967783f, 0.973080f, 0.978405f, 0.983760f, 0.989144f,
0.994557f, 1.000000f, 1.005473f, 1.010975f, 1.016508f, 1.022071f, 1.027665f, 1.033289f, 1.038944f,
1.044630f, 1.050347f, 1.056095f, 1.061875f, 1.067687f, 1.073530f, 1.079405f, 1.085312f, 1.091252f,
1.097224f, 1.103229f, 1.109267f, 1.115337f, 1.121441f, 1.127579f, 1.133750f, 1.139955f, 1.146193f,
1.152466f, 1.158773f, 1.165115f, 1.171491f, 1.177903f, 1.184349f, 1.190831f, 1.197348f, 1.203901f,
1.210489f, 1.217114f, 1.223775f, 1.230473f, 1.237207f, 1.243978f, 1.250786f, 1.257631f, 1.264514f,
1.271434f, 1.278392f, 1.285389f, 1.292423f, 1.299497f, 1.306608f, 1.313759f, 1.320949f, 1.328178f,
1.335447f, 1.342756f, 1.350104f, 1.357493f, 1.364922f, 1.372392f, 1.379903f, 1.387455f, 1.395048f,
1.402683f, 1.410360f, 1.418078f, 1.425839f, 1.433642f, 1.441488f, 1.449377f, 1.457309f, 1.465285f,
1.473304f, 1.481367f, 1.489474f, 1.497626f, 1.505822f, 1.514063f, 1.522349f, 1.530681f, 1.539058f,
1.547481f, 1.555950f, 1.564465f, 1.573027f, 1.581636f, 1.590292f, 1.598995f, 1.607746f, 1.616545f,
1.625392f, 1.634287f, 1.643231f, 1.652224f, 1.661266f, 1.670358f, 1.679500f, 1.688691f, 1.697933f,
1.707225f, 1.716569f, 1.725963f, 1.735409f, 1.744906f, 1.754456f, 1.764058f, 1.773712f, 1.783419f,
1.793179f, 1.802993f, 1.812860f, 1.822782f, 1.832757f, 1.842788f, 1.852873f, 1.863013f, 1.873209f,
1.883461f, 1.893768f, 1.904132f, 1.914553f, 1.925031f, 1.935567f, 1.946159f, 1.956810f, 1.967520f,
1.978287f, 1.989114f, 2.000000f
0.500000f, 0.500000f, 0.502736f, 0.505488f, 0.508254f, 0.511036f, 0.513833f, 0.516645f, 0.519472f,
0.522315f, 0.525174f, 0.528048f, 0.530938f, 0.533843f, 0.536765f, 0.539702f, 0.542656f, 0.545626f,
0.548612f, 0.551614f, 0.554633f, 0.557669f, 0.560721f, 0.563789f, 0.566875f, 0.569977f, 0.573097f,
0.576233f, 0.579387f, 0.582558f, 0.585746f, 0.588951f, 0.592175f, 0.595415f, 0.598674f, 0.601950f,
0.605245f, 0.608557f, 0.611888f, 0.615236f, 0.618603f, 0.621989f, 0.625393f, 0.628815f, 0.632257f,
0.635717f, 0.639196f, 0.642694f, 0.646212f, 0.649748f, 0.653304f, 0.656880f, 0.660475f, 0.664089f,
0.667724f, 0.671378f, 0.675052f, 0.678747f, 0.682461f, 0.686196f, 0.689952f, 0.693727f, 0.697524f,
0.701341f, 0.705180f, 0.709039f, 0.712919f, 0.716821f, 0.720744f, 0.724689f, 0.728655f, 0.732642f,
0.736652f, 0.740684f, 0.744737f, 0.748813f, 0.752911f, 0.757031f, 0.761175f, 0.765340f, 0.769529f,
0.773740f, 0.777975f, 0.782232f, 0.786513f, 0.790818f, 0.795146f, 0.799497f, 0.803873f, 0.808272f,
0.812696f, 0.817144f, 0.821616f, 0.826112f, 0.830633f, 0.835179f, 0.839750f, 0.844346f, 0.848966f,
0.853613f, 0.858284f, 0.862982f, 0.867704f, 0.872453f, 0.877228f, 0.882029f, 0.886856f, 0.891709f,
0.896590f, 0.901496f, 0.906430f, 0.911391f, 0.916379f, 0.921394f, 0.926436f, 0.931507f, 0.936604f,
0.941730f, 0.946884f, 0.952066f, 0.957277f, 0.962516f, 0.967783f, 0.973080f, 0.978405f, 0.983760f,
0.989144f, 0.994557f, 1.000000f, 1.005473f, 1.010975f, 1.016508f, 1.022071f, 1.027665f, 1.033289f,
1.038944f, 1.044630f, 1.050347f, 1.056095f, 1.061875f, 1.067687f, 1.073530f, 1.079405f, 1.085312f,
1.091252f, 1.097224f, 1.103229f, 1.109267f, 1.115337f, 1.121441f, 1.127579f, 1.133750f, 1.139955f,
1.146193f, 1.152466f, 1.158773f, 1.165115f, 1.171491f, 1.177903f, 1.184349f, 1.190831f, 1.197348f,
1.203901f, 1.210489f, 1.217114f, 1.223775f, 1.230473f, 1.237207f, 1.243978f, 1.250786f, 1.257631f,
1.264514f, 1.271434f, 1.278392f, 1.285389f, 1.292423f, 1.299497f, 1.306608f, 1.313759f, 1.320949f,
1.328178f, 1.335447f, 1.342756f, 1.350104f, 1.357493f, 1.364922f, 1.372392f, 1.379903f, 1.387455f,
1.395048f, 1.402683f, 1.410360f, 1.418078f, 1.425839f, 1.433642f, 1.441488f, 1.449377f, 1.457309f,
1.465285f, 1.473304f, 1.481367f, 1.489474f, 1.497626f, 1.505822f, 1.514063f, 1.522349f, 1.530681f,
1.539058f, 1.547481f, 1.555950f, 1.564465f, 1.573027f, 1.581636f, 1.590292f, 1.598995f, 1.607746f,
1.616545f, 1.625392f, 1.634287f, 1.643231f, 1.652224f, 1.661266f, 1.670358f, 1.679500f, 1.688691f,
1.697933f, 1.707225f, 1.716569f, 1.725963f, 1.735409f, 1.744906f, 1.754456f, 1.764058f, 1.773712f,
1.783419f, 1.793179f, 1.802993f, 1.812860f, 1.822782f, 1.832757f, 1.842788f, 1.852873f, 1.863013f,
1.873209f, 1.883461f, 1.893768f, 1.904132f, 1.914553f, 1.925031f, 1.935567f, 1.946159f, 1.956810f,
1.967520f, 1.978287f, 1.989114f, 2.000000f
};
// Frequencies for notes using the standard twelve-tone equal temperament scale.

View File

@@ -65,11 +65,7 @@ extern u8 gReverbMultsArrCount;
#endif // PUPPYPRINT_DEBUG
#endif // BETTER_REVERB
#if defined(VERSION_EU) || defined(VERSION_SH)
extern f32 gPitchBendFrequencyScale[256];
#else
extern f32 gPitchBendFrequencyScale[255];
#endif
extern f32 gNoteFrequencies[128];
extern u8 gDefaultShortNoteVelocityTable[16];

View File

@@ -55,19 +55,26 @@ void sequence_channel_process_sound(struct SequenceChannel *seqChannel, s32 reca
}
#else
static void sequence_channel_process_sound(struct SequenceChannel *seqChannel) {
s32 i;
s32 hasProcessedChannel = FALSE;
f32 channelVolume;
f32 panFromChannel;
f32 panLayerWeight;
f32 channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->fadeVolume;
if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & MUTE_BEHAVIOR_SOFTEN) != 0) {
channelVolume *= seqChannel->seqPlayer->muteVolumeScale;
}
f32 panFromChannel = seqChannel->pan * seqChannel->panChannelWeight;
f32 panLayerWeight = 1.0f - seqChannel->panChannelWeight;
for (i = 0; i < 4; i++) {
for (s32 i = 0; i < LAYERS_MAX; i++) {
struct SequenceChannelLayer *layer = seqChannel->layers[i];
if (layer != NULL && layer->enabled && layer->note != NULL) {
if (!hasProcessedChannel) {
hasProcessedChannel = TRUE;
channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->fadeVolume;
if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & MUTE_BEHAVIOR_SOFTEN) != 0) {
channelVolume *= seqChannel->seqPlayer->muteVolumeScale;
}
panFromChannel = seqChannel->pan * seqChannel->panChannelWeight;
panLayerWeight = 1.0f - seqChannel->panChannelWeight;
}
layer->noteFreqScale = layer->freqScale * seqChannel->freqScale;
layer->noteVelocity = layer->velocitySquare * channelVolume;
layer->notePan = (layer->pan * panLayerWeight) + panFromChannel;
@@ -143,19 +150,11 @@ f32 get_portamento_freq_scale(struct Portamento *p) {
p->cur += p->speed;
u32 v0 = (u32) p->cur;
#if defined(VERSION_EU) || defined(VERSION_SH)
if (v0 > 127) {
#else
if (v0 >= 127) {
#endif
v0 = 127;
}
#if defined(VERSION_EU) || defined(VERSION_SH)
return (1.0f + (p->extent * (gPitchBendFrequencyScale[v0 + 128] - 1.0f)));
#else
return (1.0f + (p->extent * (gPitchBendFrequencyScale[v0 + 127] - 1.0f)));
#endif
}
s32 get_vibrato_pitch_change(struct VibratoState *vib) {
@@ -242,11 +241,7 @@ f32 get_vibrato_freq_scale(struct VibratoState *vib) {
s32 pitchChange = get_vibrato_pitch_change(vib);
f32 extent = (f32) vib->extent / 4096.0f;
#if defined(VERSION_EU) || defined(VERSION_SH)
return 1.0f + extent * (gPitchBendFrequencyScale[pitchChange + 128] - 1.0f);
#else
return 1.0f + extent * (gPitchBendFrequencyScale[pitchChange + 127] - 1.0f);
#endif
}
void note_vibrato_update(struct Note *note) {

View File

@@ -1236,6 +1236,7 @@ static void update_game_sound(void) {
// Begin playing the sound
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->soundScriptIO[4] = soundId;
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->soundScriptIO[0] = 1;
gSequencePlayers[SEQ_PLAYER_SFX].channels[channelIndex]->stopScript = FALSE;
switch (bank) {
case SOUND_BANK_MOVING:

View File

@@ -1431,7 +1431,7 @@ void audio_reset_session(void) {
init_reverb_us(reverbPresetId);
#endif
init_sample_dma_buffers(gMaxSimultaneousNotes);
init_sample_dma_buffers();
#if defined(VERSION_EU)
build_vol_rampings_table(0, gAudioBufferParameters.samplesPerUpdate);

View File

@@ -12,11 +12,9 @@
struct SharedDma {
/*0x0*/ u8 *buffer; // target, points to pre-allocated buffer
/*0x4*/ uintptr_t source; // device address
/*0x8*/ u16 sizeUnused; // set to bufSize, never read
/*0xA*/ u16 bufSize; // size of buffer
/*0xC*/ u8 unused2; // set to 0, never read
/*0xD*/ u8 reuseIndex; // position in sSampleDmaReuseQueue1/2, if ttl == 0
/*0xE*/ u8 ttl; // duration after which the DMA can be discarded
/*0x8*/ u32 bufSize; // size of buffer (converted from u16 for intentional padding to size 0x10)
/*0xC*/ u8 reuseIndex; // position in sSampleDmaReuseQueue1/2, if ttl == 0
/* */ // u8 pad[3];
}; // size = 0x10
// EU only
@@ -43,6 +41,7 @@ OSMesg gAudioDmaMesg;
OSIoMesg gAudioDmaIoMesg;
struct SharedDma sSampleDmas[MAX_SIMULTANEOUS_NOTES * 4];
u8 sSampleTTLs[MAX_SIMULTANEOUS_NOTES * 4];
u32 gSampleDmaNumListItems; // sh: 0x803503D4
u32 sSampleDmaListSize1; // sh: 0x803503D8
@@ -71,7 +70,6 @@ struct AudioBufferParametersEU gAudioBufferParameters;
s32 gAiFrequency;
#endif
u32 sDmaBufSize;
s32 gMaxAudioCmds;
s32 gMaxSimultaneousNotes;
@@ -158,30 +156,20 @@ void decrease_sample_dma_ttls() {
u32 i;
for (i = 0; i < sSampleDmaListSize1; i++) {
#if defined(VERSION_EU)
struct SharedDma *temp = &sSampleDmas[i];
#else
struct SharedDma *temp = sSampleDmas + i;
#endif
if (temp->ttl != 0) {
temp->ttl--;
if (temp->ttl == 0) {
temp->reuseIndex = sSampleDmaReuseQueueHead1;
if (sSampleTTLs[i] != 0) {
sSampleTTLs[i]--;
if (sSampleTTLs[i] == 0) {
sSampleDmas[i].reuseIndex = sSampleDmaReuseQueueHead1;
sSampleDmaReuseQueue1[sSampleDmaReuseQueueHead1++] = (u8) i;
}
}
}
for (i = sSampleDmaListSize1; i < gSampleDmaNumListItems; i++) {
#if defined(VERSION_EU)
struct SharedDma *temp = &sSampleDmas[i];
#else
struct SharedDma *temp = sSampleDmas + i;
#endif
if (temp->ttl != 0) {
temp->ttl--;
if (temp->ttl == 0) {
temp->reuseIndex = sSampleDmaReuseQueueHead2;
if (sSampleTTLs[i] != 0) {
sSampleTTLs[i]--;
if (sSampleTTLs[i] == 0) {
sSampleDmas[i].reuseIndex = sSampleDmaReuseQueueHead2;
sSampleDmaReuseQueue2[sSampleDmaReuseQueueHead2++] = (u8) i;
}
}
@@ -203,7 +191,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
bufferPos = devAddr - dma->source;
if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) {
// We already have a DMA request for this memory range.
if (dma->ttl == 0 && sSampleDmaReuseQueueTail2 != sSampleDmaReuseQueueHead2) {
if (sSampleTTLs[i] == 0 && sSampleDmaReuseQueueTail2 != sSampleDmaReuseQueueHead2) {
// Move the DMA out of the reuse queue, by swapping it with the
// tail, and then incrementing the tail.
if (dma->reuseIndex != sSampleDmaReuseQueueTail2) {
@@ -214,7 +202,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
}
sSampleDmaReuseQueueTail2++;
}
dma->ttl = 60;
sSampleTTLs[i] = 60;
*dmaIndexRef = (u8) i;
return (devAddr - dma->source) + dma->buffer;
}
@@ -226,6 +214,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
dmaIndex = sSampleDmaReuseQueue2[sSampleDmaReuseQueueTail2];
sSampleDmaReuseQueueTail2++;
dma = sSampleDmas + dmaIndex;
sSampleTTLs[dmaIndex] = 2;
hasDma = TRUE;
}
} else {
@@ -233,7 +222,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
bufferPos = devAddr - dma->source;
if (0 <= bufferPos && (size_t) bufferPos <= dma->bufSize - size) {
// We already have DMA for this memory range.
if (dma->ttl == 0) {
if (sSampleTTLs[*dmaIndexRef] == 0) {
// Move the DMA out of the reuse queue, by swapping it with the
// tail, and then incrementing the tail.
if (dma->reuseIndex != sSampleDmaReuseQueueTail1) {
@@ -244,7 +233,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
}
sSampleDmaReuseQueueTail1++;
}
dma->ttl = 2;
sSampleTTLs[*dmaIndexRef] = 2;
return dma->buffer + (devAddr - dma->source);
}
}
@@ -254,14 +243,13 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
// be empty, since TTL 2 is so small.
dmaIndex = sSampleDmaReuseQueue1[sSampleDmaReuseQueueTail1++];
dma = sSampleDmas + dmaIndex;
sSampleTTLs[dmaIndex] = 2;
hasDma = TRUE;
}
transfer = dma->bufSize;
dmaDevAddr = devAddr & ~0xF;
dma->ttl = 2;
dma->source = dmaDevAddr;
dma->sizeUnused = transfer;
#ifdef VERSION_US // TODO: Is there a reason this only exists in US?
osInvalDCache(dma->buffer, transfer);
#endif
@@ -272,14 +260,10 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef) {
}
void init_sample_dma_buffers(UNUSED s32 arg0) {
void init_sample_dma_buffers() {
s32 i;
#if defined(VERSION_EU)
#define j i
#else
s32 j;
#endif
s32 sDmaBufSize;
sDmaBufSize = DMA_BUF_SIZE_0;
#if defined(VERSION_EU)
@@ -289,30 +273,21 @@ void init_sample_dma_buffers(UNUSED s32 arg0) {
#endif
sSampleDmas[gSampleDmaNumListItems].buffer = soundAlloc(&gNotesAndBuffersPool, sDmaBufSize);
if (sSampleDmas[gSampleDmaNumListItems].buffer == NULL) {
#if defined(VERSION_EU)
break;
#else
goto out1;
#endif
}
sSampleDmas[gSampleDmaNumListItems].bufSize = sDmaBufSize;
sSampleDmas[gSampleDmaNumListItems].source = 0;
sSampleDmas[gSampleDmaNumListItems].sizeUnused = 0;
sSampleDmas[gSampleDmaNumListItems].unused2 = 0;
sSampleDmas[gSampleDmaNumListItems].ttl = 0;
sSampleTTLs[gSampleDmaNumListItems] = 0;
gSampleDmaNumListItems++;
}
#if defined(VERSION_JP) || defined(VERSION_US)
out1:
#endif
for (i = 0; (u32) i < gSampleDmaNumListItems; i++) {
sSampleDmaReuseQueue1[i] = (u8) i;
sSampleDmas[i].reuseIndex = (u8) i;
}
for (j = gSampleDmaNumListItems; j < 0x100; j++) {
sSampleDmaReuseQueue1[j] = 0;
for (i = gSampleDmaNumListItems; i < ARRAY_COUNT(sSampleDmaReuseQueue1); i++) {
sSampleDmaReuseQueue1[i] = 0;
}
sSampleDmaReuseQueueTail1 = 0;
@@ -324,22 +299,13 @@ out1:
for (i = 0; i < gMaxSimultaneousNotes; i++) {
sSampleDmas[gSampleDmaNumListItems].buffer = soundAlloc(&gNotesAndBuffersPool, sDmaBufSize);
if (sSampleDmas[gSampleDmaNumListItems].buffer == NULL) {
#if defined(VERSION_EU)
break;
#else
goto out2;
#endif
}
sSampleDmas[gSampleDmaNumListItems].bufSize = sDmaBufSize;
sSampleDmas[gSampleDmaNumListItems].source = 0;
sSampleDmas[gSampleDmaNumListItems].sizeUnused = 0;
sSampleDmas[gSampleDmaNumListItems].unused2 = 0;
sSampleDmas[gSampleDmaNumListItems].ttl = 0;
sSampleTTLs[gSampleDmaNumListItems] = 0;
gSampleDmaNumListItems++;
}
#if defined(VERSION_JP) || defined(VERSION_US)
out2:
#endif
for (i = sSampleDmaListSize1; (u32) i < gSampleDmaNumListItems; i++) {
sSampleDmaReuseQueue2[i - sSampleDmaListSize1] = (u8) i;
@@ -348,15 +314,12 @@ out2:
// This probably meant to touch the range size1..size2 as well... but it
// doesn't matter, since these values are never read anyway.
for (j = gSampleDmaNumListItems; j < 0x100; j++) {
sSampleDmaReuseQueue2[j] = sSampleDmaListSize1;
for (i = gSampleDmaNumListItems; i < ARRAY_COUNT(sSampleDmaReuseQueue2); i++) {
sSampleDmaReuseQueue2[i] = sSampleDmaListSize1;
}
sSampleDmaReuseQueueTail2 = 0;
sSampleDmaReuseQueueHead2 = gSampleDmaNumListItems - sSampleDmaListSize1;
#if defined(VERSION_EU)
#undef j
#endif
}
#if defined(VERSION_JP) || defined(VERSION_US)

View File

@@ -87,7 +87,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef, s3
#else
void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef);
#endif
void init_sample_dma_buffers(s32 arg0);
void init_sample_dma_buffers();
#if defined(VERSION_SH)
void patch_audio_bank(s32 bankId, struct AudioBank *mem, struct PatchStruct *patchInfo);
#else

View File

@@ -237,7 +237,7 @@ void *dma_sample_data(uintptr_t devAddr, u32 size, s32 arg2, u8 *dmaIndexRef, s3
return (devAddr - dmaDevAddr) + dma->buffer;
}
void init_sample_dma_buffers(UNUSED s32 arg0) {
void init_sample_dma_buffers() {
s32 i;
sDmaBufSize = 0x2D0;

View File

@@ -6,6 +6,7 @@
#include "heap.h"
#include "load.h"
#include "seqplayer.h"
#include "game/debug.h"
#include "game/main.h"
#ifdef VERSION_SH
@@ -1693,11 +1694,7 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) {
case 0xd3: // chan_pitchbend; pitch bend by <= 1 octave in either direction (-127..127)
// (m64_read_u8(state) is really s8 here)
#ifdef VERSION_SH
cmd = m64_read_u8(state) + 128;
#else
cmd = m64_read_u8(state) + 127;
#endif
seqChannel->freqScale = gPitchBendFrequencyScale[cmd] * gConfig.audioFrequency;
#if defined(VERSION_EU) || defined(VERSION_SH)
seqChannel->changes.as_bitfields.freqScale = TRUE;
@@ -2075,15 +2072,14 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) {
}
break;
#else
case 0x00: // chan_testlayerfinished
if (seqChannel->layers[loBits] != NULL) {
value = seqChannel->layers[loBits]->finished;
case 0x00: // chan_testlayersfinished (NOTE: does not use loBits)
value = TRUE;
for (i = 0; i < LAYERS_MAX; i++) {
if (seqChannel->layers[i] != NULL && !seqChannel->layers[i]->finished) {
value = FALSE;
break;
}
}
#ifdef VERSION_EU
else {
value = -1;
}
#endif
break;
#endif
@@ -2123,8 +2119,10 @@ void sequence_channel_process_script(struct SequenceChannel *seqChannel) {
}
break;
case 0xa0: // chan_freelayer
seq_channel_layer_free(seqChannel, loBits);
case 0xa0: // chan_freelayers (NOTE: does not use loBits)
for (i = 0; i < LAYERS_MAX; i++) {
seq_channel_layer_free(seqChannel, i);
}
break;
case 0xb0: // chan_dynsetlayer

View File

@@ -712,7 +712,7 @@ u64 *synthesis_process_notes(s16 *aiBuf, u32 bufLen, u64 *cmd) {
aClearBuffer(cmd++, DMEM_ADDR_UNCOMPRESSED_NOTE + s5,
(samplesLenAdjusted - nAdpcmSamplesProcessed) * 2);
note->samplePosInt = 0;
note->finished = 1;
note->finished = TRUE;
((struct vNote *)note)->enabled = 0;
break;
}
@@ -737,7 +737,7 @@ u64 *synthesis_process_notes(s16 *aiBuf, u32 bufLen, u64 *cmd) {
aResample(cmd++, A_INIT, 0xff60, VIRTUAL_TO_PHYSICAL2(note->synthesisBuffers->dummyResampleState));
resampledTempLen = samplesLenAdjusted + 4;
noteSamplesDmemAddrBeforeResampling = DMEM_ADDR_RESAMPLED + 4;
if (note->finished != FALSE) {
if (note->finished) {
aClearBuffer(cmd++, DMEM_ADDR_RESAMPLED + resampledTempLen, samplesLenAdjusted + 16);
}
break;
@@ -756,7 +756,7 @@ u64 *synthesis_process_notes(s16 *aiBuf, u32 bufLen, u64 *cmd) {
}
}
if (note->finished != FALSE) {
if (note->finished) {
break;
}
}