You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user