Audio and Message Fixes

This commit is contained in:
Nicholas Estelami 2024-11-14 23:53:56 -05:00
parent 11a148a047
commit f07a9b6c81
12 changed files with 109 additions and 72 deletions

View File

@ -34,7 +34,7 @@ void Audio_PlayPauseSfx(u8 active);
void Audio_PlayMapMenuSfx(u8 active); void Audio_PlayMapMenuSfx(u8 active);
void Audio_KillAllSfx(void); void Audio_KillAllSfx(void);
#define AUDIO_PLAY_SFX(sfxId, srcPos, token) //(Audio_PlaySfx((sfxId),(srcPos),(token),&gDefaultMod,&gDefaultMod,&gDefaultReverb)) #define AUDIO_PLAY_SFX(sfxId, srcPos, token) (Audio_PlaySfx((sfxId),(srcPos),(token),&gDefaultMod,&gDefaultMod,&gDefaultReverb))
#define SFX_FLAG_18 (1 << 18) // makes distance ignore z position? probably more #define SFX_FLAG_18 (1 << 18) // makes distance ignore z position? probably more
#define SFX_FLAG_19 (1 << 19) #define SFX_FLAG_19 (1 << 19)

View File

@ -692,7 +692,12 @@ void Audio_ProcessSeqCmd(u32 seqCmd) {
seqNumber = seqCmd & 0xFF; seqNumber = seqCmd & 0xFF;
seqArgs = (seqCmd & 0xFF00) >> 8; seqArgs = (seqCmd & 0xFF00) >> 8;
fadeTimer = (seqCmd & 0xFF0000) >> 13; fadeTimer = (seqCmd & 0xFF0000) >> 13;
if (!sActiveSequences[seqPlayId].isWaitingForFonts) {
seqArgs = 0;
//if (!sActiveSequences[seqPlayId].isWaitingForFonts)
if (true)
{
if (seqArgs < 0x80) { if (seqArgs < 0x80) {
Audio_StartSequence(seqPlayId, seqNumber, seqArgs, fadeTimer); Audio_StartSequence(seqPlayId, seqNumber, seqArgs, fadeTimer);
} else { } else {
@ -888,12 +893,14 @@ void Audio_ProcessSeqCmd(u32 seqCmd) {
oldSpecId = sAudioSpecId; oldSpecId = sAudioSpecId;
sAudioSpecId = specId; sAudioSpecId = specId;
if (oldSpecId != specId) { if (oldSpecId != specId)
{
AudioThread_ResetAudioHeap(specId); AudioThread_ResetAudioHeap(specId);
Audio_StartReset(oldSpecId); Audio_StartReset(oldSpecId);
AUDIOCMD_GLOBAL_STOP_AUDIOCMDS(); AUDIOCMD_GLOBAL_STOP_AUDIOCMDS();
}
} else { else
{
Audio_StopSequence(SEQ_PLAYER_BGM, 1); Audio_StopSequence(SEQ_PLAYER_BGM, 1);
Audio_StopSequence(SEQ_PLAYER_FANFARE, 1); Audio_StopSequence(SEQ_PLAYER_FANFARE, 1);
} }
@ -991,7 +998,8 @@ void Audio_UpdateActiveSequences(void) {
for (seqPlayId = 0; seqPlayId < SEQ_PLAYER_MAX; seqPlayId++) { for (seqPlayId = 0; seqPlayId < SEQ_PLAYER_MAX; seqPlayId++) {
if (sActiveSequences[seqPlayId].isWaitingForFonts) { if (sActiveSequences[seqPlayId].isWaitingForFonts) {
switch ((s32) AudioThread_GetAsyncLoadStatus(&out)) { switch ((s32) AudioThread_GetAsyncLoadStatus(&out))
{
case SEQ_PLAYER_BGM + 1: case SEQ_PLAYER_BGM + 1:
case SEQ_PLAYER_FANFARE + 1: case SEQ_PLAYER_FANFARE + 1:
case SEQ_PLAYER_SFX + 1: case SEQ_PLAYER_SFX + 1:
@ -1322,7 +1330,7 @@ void Audio_ProcessSfxRequest(void) {
SfxRequest* request = &sSfxRequests[sSfxRequestReadIndex]; SfxRequest* request = &sSfxRequests[sSfxRequestReadIndex];
u8 next; u8 next;
s32 bankId; s32 bankId;
u8 evict; u8 evict = 0;
u32 sfxId; u32 sfxId;
u8 count; u8 count;
SfxBankEntry* entry; SfxBankEntry* entry;
@ -1850,6 +1858,7 @@ void Audio_UpdateVoice(void) {
voiceId = sNextVoiceId % 1000; voiceId = sNextVoiceId % 1000;
voiceIdHi = voiceId / 256; voiceIdHi = voiceId / 256;
voiceIdLo = voiceId % 256; voiceIdLo = voiceId % 256;
AUDIOCMD_CHANNEL_SET_IO(SEQ_PLAYER_VOICE, 15, 0, 1); AUDIOCMD_CHANNEL_SET_IO(SEQ_PLAYER_VOICE, 15, 0, 1);
AUDIOCMD_CHANNEL_SET_IO(SEQ_PLAYER_VOICE, 15, 4, voiceBank); AUDIOCMD_CHANNEL_SET_IO(SEQ_PLAYER_VOICE, 15, 4, voiceBank);
AUDIOCMD_CHANNEL_SET_IO(SEQ_PLAYER_VOICE, 15, 5, voiceIdHi); AUDIOCMD_CHANNEL_SET_IO(SEQ_PLAYER_VOICE, 15, 5, voiceIdHi);
@ -2570,6 +2579,7 @@ void Audio_SetBgmParam(s8 bgmParam) {
} }
void Audio_PlaySequence(u8 seqPlayId, u16 seqId, u8 fadeinTime, u8 bgmParam) { void Audio_PlaySequence(u8 seqPlayId, u16 seqId, u8 fadeinTime, u8 bgmParam) {
//seqId &= 0xFF;
SEQCMD_SET_SEQPLAYER_IO(seqPlayId, 0, bgmParam); SEQCMD_SET_SEQPLAYER_IO(seqPlayId, 0, bgmParam);
SEQCMD_PLAY_SEQUENCE(seqPlayId, fadeinTime, 0, seqId); SEQCMD_PLAY_SEQUENCE(seqPlayId, fadeinTime, 0, seqId);
} }

View File

@ -451,7 +451,7 @@ uintptr_t AudioHeap_SearchCaches(s32 tableType, s32 cache, s32 id) {
return (uintptr_t) ramAddr; return (uintptr_t) ramAddr;
} }
if (cache == CACHE_PERMANENT) { if (cache == CACHE_PERMANENT) {
return (uintptr_t) NULL; //return (uintptr_t) NULL;
} }
return (uintptr_t) AudioHeap_SearchRegularCaches(tableType, cache, id); return (uintptr_t) AudioHeap_SearchRegularCaches(tableType, cache, id);
} }
@ -667,9 +667,17 @@ void AudioHeap_Init(void) {
gNumNotes = spec->numNotes; gNumNotes = spec->numNotes;
D_8014C1B0 = spec->unk_14; D_8014C1B0 = spec->unk_14;
gMaxTempo = (u16) ((gAudioBufferParams.ticksPerUpdate * 2880000.0f / gSeqTicksPerBeat) / gMaxTempoTvTypeFactors);
// STARTODO: The game was originally designed to use either 1 or 2 buffers depending on the scenario
// Using 1 buffer has caused issues, so we hardcoded it to 2.
// To prevent sequences from going too fast, we added a * 2 here.
// This is not an optimal fix but it works. We may wish to find something better in the future.
gMaxTempo = (u16) ((gAudioBufferParams.ticksPerUpdate * 2 * 2880000.0f / gSeqTicksPerBeat) / gMaxTempoTvTypeFactors);
//gMaxTempo = (u16) ((gAudioBufferParams.ticksPerUpdate * 2880000.0f / gSeqTicksPerBeat) / gMaxTempoTvTypeFactors);
gAudioBufferParams.numBuffers = spec->numBuffers; gAudioBufferParams.numBuffers = spec->numBuffers;
gAudioBufferParams.numBuffers = 2;
gAudioBufferParams.samplesPerFrameTarget *= gAudioBufferParams.numBuffers; gAudioBufferParams.samplesPerFrameTarget *= gAudioBufferParams.numBuffers;
gAudioBufferParams.maxAiBufferLength *= gAudioBufferParams.numBuffers; gAudioBufferParams.maxAiBufferLength *= gAudioBufferParams.numBuffers;
gAudioBufferParams.minAiBufferLength *= gAudioBufferParams.numBuffers; gAudioBufferParams.minAiBufferLength *= gAudioBufferParams.numBuffers;

View File

@ -522,9 +522,12 @@ void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate) {
switch (tableType) { switch (tableType) {
case SEQUENCE_TABLE: case SEQUENCE_TABLE:
gSeqLoadStatus[id] = LOAD_STATUS_COMPLETE; gSeqLoadStatus[id] = LOAD_STATUS_COMPLETE;
//ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, id);
return Audio_LoadBlob(gAudioSeq, table->entries[id].romAddr); return Audio_LoadBlob(gAudioSeq, table->entries[id].romAddr);
case FONT_TABLE: case FONT_TABLE:
gFontLoadStatus[id] = LOAD_STATUS_COMPLETE; gFontLoadStatus[id] = LOAD_STATUS_COMPLETE;
//ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, id);
return Audio_LoadFont(table->entries[id]); return Audio_LoadFont(table->entries[id]);
case SAMPLE_TABLE: case SAMPLE_TABLE:
loadStatus = 0; loadStatus = 0;
@ -708,7 +711,7 @@ void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData,
switch (tableType) { switch (tableType) {
case SEQUENCE_TABLE: case SEQUENCE_TABLE:
gFontLoadStatus[id] = LOAD_STATUS_COMPLETE; gSeqLoadStatus[id] = LOAD_STATUS_COMPLETE;
osSendMesg(retQueue, OS_MESG_32(retData << 0x18), OS_MESG_NOBLOCK); osSendMesg(retQueue, OS_MESG_32(retData << 0x18), OS_MESG_NOBLOCK);
return Audio_LoadBlob(gAudioSeq, table->entries[id].romAddr); return Audio_LoadBlob(gAudioSeq, table->entries[id].romAddr);
case FONT_TABLE: case FONT_TABLE:
@ -719,7 +722,7 @@ void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData,
case SAMPLE_TABLE: case SAMPLE_TABLE:
gSampleFontLoadStatus[id] = LOAD_STATUS_COMPLETE; gSampleFontLoadStatus[id] = LOAD_STATUS_COMPLETE;
// LTODO: Validate this // LTODO: Validate this
// return Audio_LoadSample(table->entries[id].romAddr, 0); return Audio_LoadSample(table->entries[id].romAddr, table->entries[id], id);
return NULL; return NULL;
} }
@ -736,39 +739,39 @@ void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData,
romAddr = table->entries[id].romAddr; romAddr = table->entries[id].romAddr;
loadStatus = LOAD_STATUS_COMPLETE; loadStatus = LOAD_STATUS_COMPLETE;
// switch (cachePolicy) { switch (cachePolicy) {
// case CACHEPOLICY_0: case CACHEPOLICY_0:
// ramAddr = AudioHeap_AllocPermanent(tableType, id, size); ramAddr = AudioHeap_AllocPermanent(tableType, id, size);
// if (ramAddr == NULL) { if (ramAddr == NULL) {
// return ramAddr; return ramAddr;
// } }
// loadStatus = LOAD_STATUS_PERMANENTLY_LOADED; loadStatus = LOAD_STATUS_PERMANENTLY_LOADED;
// break; break;
//
// case CACHEPOLICY_1: case CACHEPOLICY_1:
// ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, id); ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_PERSISTENT, id);
// if (ramAddr == NULL) { if (ramAddr == NULL) {
// return ramAddr; return ramAddr;
// } }
// break; break;
//
// case CACHEPOLICY_2: case CACHEPOLICY_2:
// ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, id); ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_TEMPORARY, id);
// if (ramAddr == NULL) { if (ramAddr == NULL) {
// return ramAddr; return ramAddr;
// } }
// break; break;
//
// case CACHEPOLICY_3: case CACHEPOLICY_3:
// case CACHEPOLICY_4: case CACHEPOLICY_4:
// ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, id); ramAddr = AudioHeap_AllocCached(tableType, size, CACHE_EITHER, id);
// if (ramAddr == NULL) { if (ramAddr == NULL) {
// return ramAddr; return ramAddr;
// } }
// break; break;
// } }
// AudioLoad_StartAsyncLoad(romAddr, ramAddr, size, medium, nChunks, retQueue, AudioLoad_StartAsyncLoad(romAddr, ramAddr, size, medium, nChunks, retQueue,
// (retData << 0x18) | (tableType << 0x10) | (id << 8) | loadStatus); (retData << 0x18) | (tableType << 0x10) | (id << 8) | loadStatus);
} }
switch (tableType) { switch (tableType) {

View File

@ -169,9 +169,10 @@ TunedSample* Audio_GetInstrumentTunedSample(Instrument* instrument, s32 arg1) {
Instrument* Audio_GetInstrument(s32 fontId, s32 instId) { Instrument* Audio_GetInstrument(s32 fontId, s32 instId) {
Instrument* instrument; Instrument* instrument;
// LTODO: Remove this //fontId = 7;
if(gSoundFontList[fontId].instruments == NULL){ if(gSoundFontList[fontId].instruments == NULL){
gSoundFontList[fontId] = *Audio_LoadFont(gSoundFontTable->entries[fontId]); gSoundFontList[fontId] = *Audio_LoadFont(gSoundFontTable->entries[fontId]);
} }
if ((gFontLoadStatus[fontId] < 2) != 0) { if ((gFontLoadStatus[fontId] < 2) != 0) {

View File

@ -143,13 +143,16 @@ void AudioSeq_SeqLayerDisable(SequenceLayer* layer) {
} }
} }
void AudioSeq_SeqLayerFree(SequenceChannel* channel, s32 layerIndex) { void AudioSeq_SeqLayerFree(SequenceChannel* channel, s32 layerIndex)
SequenceLayer* layer = channel->layers[layerIndex]; {
if (layerIndex < 4) {
SequenceLayer* layer = channel->layers[layerIndex];
if (layer != NULL) { if (layer != NULL) {
AudioSeq_AudioListPushBack(&gLayerFreeList, &layer->listItem); AudioSeq_AudioListPushBack(&gLayerFreeList, &layer->listItem);
AudioSeq_SeqLayerDisable(layer); AudioSeq_SeqLayerDisable(layer);
channel->layers[layerIndex] = NULL; channel->layers[layerIndex] = NULL;
}
} }
} }
@ -907,7 +910,8 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
sp52 = ((u16*) gSeqFontTable)[seqPlayer->seqId]; sp52 = ((u16*) gSeqFontTable)[seqPlayer->seqId];
loBits = gSeqFontTable[sp52]; loBits = gSeqFontTable[sp52];
cmd = gSeqFontTable[sp52 + loBits - cmd]; cmd = gSeqFontTable[sp52 + loBits - cmd];
if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, cmd) != NULL) { //if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, cmd) != NULL)
{
channel->fontId = cmd; channel->fontId = cmd;
} }
/* fallthrough */ /* fallthrough */
@ -1013,7 +1017,11 @@ void AudioSeq_SequenceChannelProcessScript(SequenceChannel* channel) {
sp52 = ((u16*) gSeqFontTable)[seqPlayer->seqId]; sp52 = ((u16*) gSeqFontTable)[seqPlayer->seqId];
loBits = gSeqFontTable[sp52]; loBits = gSeqFontTable[sp52];
cmd = gSeqFontTable[sp52 + loBits - cmd]; cmd = gSeqFontTable[sp52 + loBits - cmd];
if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, cmd) != NULL) {
printf("seqID: %02X\n", seqPlayer->seqId);
//if (AudioHeap_SearchCaches(FONT_TABLE, CACHE_EITHER, cmd) != NULL)
{
channel->fontId = cmd; channel->fontId = cmd;
} }
break; break;

View File

@ -667,8 +667,9 @@ Acmd* AudioSynth_Update(Acmd* aList, s32* cmdCount, s16* aiBufStart, s32 aiBufLe
//if (gAudioBufferParams.ticksPerUpdate > 3 && gGameState != GSTATE_PLAY) return; //if (gAudioBufferParams.ticksPerUpdate > 3 && gGameState != GSTATE_PLAY) return;
aCmdPtr = aList; aCmdPtr = aList;
for (i = gAudioBufferParams.ticksPerUpdate; i > 0; i--) { for (i = gAudioBufferParams.ticksPerUpdate; i > 0; i--) {
AudioSeq_ProcessSequences(i - 1);
AudioSynth_SyncSampleStates(gAudioBufferParams.ticksPerUpdate - i); AudioSeq_ProcessSequences(i - 1);
AudioSynth_SyncSampleStates(gAudioBufferParams.ticksPerUpdate - i);
} }
aiBufPtr = aiBufStart; aiBufPtr = aiBufStart;
@ -676,16 +677,16 @@ Acmd* AudioSynth_Update(Acmd* aList, s32* cmdCount, s16* aiBufStart, s32 aiBufLe
// problem // problem
for (i = gAudioBufferParams.ticksPerUpdate; i > 0; i--) { for (i = gAudioBufferParams.ticksPerUpdate; i > 0; i--) {
if (i == 1) { if (i == 1) {
printf("func_80009B64 i == 1\n"); //printf("func_80009B64 i == 1\n");
chunkLen = aiBufLen; chunkLen = aiBufLen;
} else if ((aiBufLen / i) >= gAudioBufferParams.samplesPerTickMax) { } else if ((aiBufLen / i) >= gAudioBufferParams.samplesPerTickMax) {
printf("func_80009B64 (aiBufLen / i) >= gAudioBufferParams.samplesPerTickMax\n"); //printf("func_80009B64 (aiBufLen / i) >= gAudioBufferParams.samplesPerTickMax\n");
chunkLen = gAudioBufferParams.samplesPerTickMax; chunkLen = gAudioBufferParams.samplesPerTickMax;
} else if (gAudioBufferParams.samplesPerTickMin >= (aiBufLen / i)) { } else if (gAudioBufferParams.samplesPerTickMin >= (aiBufLen / i)) {
printf("func_80009B64 gAudioBufferParams.samplesPerTickMin >= (aiBufLen / i)\n"); //printf("func_80009B64 gAudioBufferParams.samplesPerTickMin >= (aiBufLen / i)\n");
chunkLen = gAudioBufferParams.samplesPerTickMin; chunkLen = gAudioBufferParams.samplesPerTickMin;
} else { } else {
printf("func_80009B64 else\n"); //printf("func_80009B64 else\n");
chunkLen = gAudioBufferParams.samplesPerTick; chunkLen = gAudioBufferParams.samplesPerTick;
} }
@ -694,7 +695,7 @@ Acmd* AudioSynth_Update(Acmd* aList, s32* cmdCount, s16* aiBufStart, s32 aiBufLe
AudioSynth_InitNextRingBuf(chunkLen, gAudioBufferParams.ticksPerUpdate - i, j); AudioSynth_InitNextRingBuf(chunkLen, gAudioBufferParams.ticksPerUpdate - i, j);
} }
} }
printf("chunkLen: %d, aiBufLen: %d \n", chunkLen, aiBufLen); //printf("chunkLen: %d, aiBufLen: %d \n", chunkLen, aiBufLen);
aCmdPtr = aCmdPtr =
AudioSynth_DoOneAudioUpdate((s16*) aiBufPtr, chunkLen, aCmdPtr, gAudioBufferParams.ticksPerUpdate - i); AudioSynth_DoOneAudioUpdate((s16*) aiBufPtr, chunkLen, aCmdPtr, gAudioBufferParams.ticksPerUpdate - i);
@ -866,7 +867,7 @@ Acmd* AudioSynth_ProcessNote(s32 noteIndex, NoteSubEu* noteSub, NoteSynthesisSta
s32 padE8; s32 padE8;
s32 padE4; s32 padE4;
s32 padE0; s32 padE0;
s32 skipBytes; s32 skipBytes = 0;
s32 padD8; s32 padD8;
s32 padD4; s32 padD4;
s32 padD0; s32 padD0;

View File

@ -34,8 +34,9 @@ void Load_RomFile(void* vRomAddress, void* dest, ptrdiff_t size) {
u8 Load_SceneFiles(Scene* scene) { u8 Load_SceneFiles(Scene* scene) {
#if 1 #if 1
bool hasSceneChanged = memcmp(&sCurrentScene, scene, sizeof(Scene)) != 0;
sCurrentScene = *scene; sCurrentScene = *scene;
return true; return hasSceneChanged;
#else #else
u8* ramPtr = SEGMENT_VRAM_START(ovl_i1); u8* ramPtr = SEGMENT_VRAM_START(ovl_i1);
u8 segment; u8 segment;
@ -167,13 +168,13 @@ u8 Load_SceneSetup(u8 sceneId, u8 sceneSetup) {
case SCENE_VERSUS: case SCENE_VERSUS:
changeScene = Load_SceneFiles(&sOvli2_Versus[sceneSetup]); changeScene = Load_SceneFiles(&sOvli2_Versus[sceneSetup]);
if (changeScene == true) { if (changeScene == true) {
// AUDIO_SET_SPEC_ALT(SFXCHAN_3, AUDIOSPEC_16); AUDIO_SET_SPEC_ALT(SFXCHAN_3, AUDIOSPEC_16);
} }
break; break;
case SCENE_LOGO: case SCENE_LOGO:
changeScene = Load_SceneFiles(&sNoOvl_Logo[sceneSetup]); // Logo does not load an overlay file changeScene = Load_SceneFiles(&sNoOvl_Logo[sceneSetup]); // Logo does not load an overlay file
if (changeScene == true) { if (changeScene == true) {
// AUDIO_SET_SPEC(SFXCHAN_0, AUDIOSPEC_MA); AUDIO_SET_SPEC(SFXCHAN_0, AUDIOSPEC_MA);
} }
break; break;
case SCENE_CREDITS: case SCENE_CREDITS:

View File

@ -7,7 +7,7 @@ u16* Message_PtrFromId(u16 msgId) {
while (lookup->msgId != -1) { while (lookup->msgId != -1) {
if (lookup->msgId == msgId) { if (lookup->msgId == msgId) {
return lookup->path; return ResourceGetDataByName(lookup->path);
} }
lookup++; lookup++;
} }

View File

@ -25,11 +25,14 @@
#include <BlobFactory.h> #include <BlobFactory.h>
#include <VertexFactory.h> #include <VertexFactory.h>
#include "audio/GameAudio.h" #include "audio/GameAudio.h"
//#include "sf64audio_provisional.h"
#include <Fast3D/gfx_pc.h> #include <Fast3D/gfx_pc.h>
#include <Fast3D/gfx_rendering_api.h> #include <Fast3D/gfx_rendering_api.h>
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
//extern "C" AudioBufferParameters gAudioBufferParams;
#include <utility> #include <utility>
extern "C" { extern "C" {
@ -151,7 +154,7 @@ void GameEngine::StartFrame() const {
#define NUM_AUDIO_CHANNELS 2 #define NUM_AUDIO_CHANNELS 2
#define SAMPLES_PER_FRAME (SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3) #define SAMPLES_PER_FRAME (SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3)
s16 audio_buffer[SAMPLES_PER_FRAME * 2] = { 0 }; s16 audio_buffer[SAMPLES_PER_FRAME * 2 * 2] = { 0 };
extern "C" s32 audBuffer = 0; extern "C" s32 audBuffer = 0;
#include <sf64audio_provisional.h> #include <sf64audio_provisional.h>
@ -171,7 +174,11 @@ void GameEngine::HandleAudioThread() {
} }
} }
#define AUDIO_FRAMES_PER_UPDATE (gVIsPerFrame > 0 ? gVIsPerFrame : 1) //gVIsPerFrame = 2;
//#define AUDIO_FRAMES_PER_UPDATE (gVIsPerFrame > 0 ? gVIsPerFrame : 1)
#define AUDIO_FRAMES_PER_UPDATE 2
std::unique_lock<std::mutex> Lock(audio.mutex); std::unique_lock<std::mutex> Lock(audio.mutex);
int samples_left = AudioPlayerBuffered(); int samples_left = AudioPlayerBuffered();
@ -183,7 +190,7 @@ void GameEngine::HandleAudioThread() {
countermin++; countermin++;
} }
for (int i = 0; i < 2; i++) { for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) {
AudioThread_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), AudioThread_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS),
num_audio_samples); num_audio_samples);
} }

View File

@ -90,7 +90,7 @@ extern "C" SoundFont* Audio_LoadFont(AudioTableEntry entry) {
} }
} }
gSampleFontLoadStatus[font->sampleBankId1] = 2; gSampleFontLoadStatus[font->sampleBankId1] = LOAD_STATUS_COMPLETE;
gAudioCache[entry.romAddr] = font; gAudioCache[entry.romAddr] = font;
return font; return font;

View File

@ -277,7 +277,6 @@ void Graphics_ThreadUpdate() {
// osRecvMesg(&gGfxVImsgQueue, NULL, OS_MESG_BLOCK); // osRecvMesg(&gGfxVImsgQueue, NULL, OS_MESG_BLOCK);
// } // }
// LTODO: There is no audio for now :P
osSendMesg(&gTaskMesgQueue, OS_MESG_PTR(NULL), OS_MESG_NOBLOCK); osSendMesg(&gTaskMesgQueue, OS_MESG_PTR(NULL), OS_MESG_NOBLOCK);
Audio_Update(); Audio_Update();
} }
@ -363,7 +362,6 @@ void Main_ThreadEntry(void* arg0) {
OSMesg ogMsg; OSMesg ogMsg;
u32 mesg; u32 mesg;
// LTODO: Implement audio
Audio_ThreadEntry(NULL); Audio_ThreadEntry(NULL);
Graphics_ThreadEntry(NULL); Graphics_ThreadEntry(NULL);
Controller_Init(); Controller_Init();