Another attempt at this thing

This commit is contained in:
KiritoDv
2024-10-25 22:39:32 -06:00
parent adc561891a
commit 2354ee76a3
20 changed files with 842 additions and 60 deletions
+8
View File
@@ -0,0 +1,8 @@
audio_seq:
{ type: BLOB, offset: 0xDEA20, size: 0x3ACF0, symbol: gAudioSeq }
audio_bank:
{ type: BLOB, offset: 0x119710, size: 0x1E020, symbol: gAudioBank }
audio_table:
{ type: BLOB, offset: 0x137730, size: 0x73C580, symbol: gAudioTable }
+6 -6
View File
@@ -788,7 +788,7 @@ typedef struct {
/* 0x01 */ s8 delay;
/* 0x02 */ s8 medium;
/* 0x04 */ u8* ramAddr;
/* 0x08 */ u32 curDevAddr;
/* 0x08 */ uintptr_t curDevAddr;
/* 0x0C */ u8* curRamAddr;
/* 0x10 */ u32 bytesRemaining;
/* 0x14 */ u32 chunkSize;
@@ -803,7 +803,7 @@ typedef struct {
/* 0x00 */ u8 medium;
/* 0x01 */ u8 seqOrFontId;
/* 0x02 */ u8 instId;
/* 0x04 */ u32 curDevAddr;
/* 0x04 */ uintptr_t curDevAddr;
/* 0x08 */ u8* curRamAddr;
/* 0x0C */ u8* ramAddr;
/* 0x10 */ s32 state;
@@ -844,7 +844,7 @@ typedef struct {
typedef struct SampleDma {
/* 0x00 */ u8* ramAddr;
/* 0x04 */ u32 devAddr;
/* 0x04 */ uintptr_t devAddr;
/* 0x08 */ u16 sizeUnused;
/* 0x0A */ u16 size;
/* 0x0C */ u8 unused;
@@ -885,8 +885,8 @@ typedef struct {
typedef struct {
/* 0x00 */ s32 sampleBankId1;
/* 0x04 */ s32 sampleBankId2;
/* 0x08 */ s32 baseAddr1;
/* 0x0C */ s32 baseAddr2;
/* 0x08 */ uintptr_t baseAddr1;
/* 0x0C */ uintptr_t baseAddr2;
/* 0x10 */ u32 medium1;
/* 0x14 */ u32 medium2;
} SampleBankRelocInfo; // size = 0x18
@@ -1047,7 +1047,7 @@ void* AudioHeap_AllocPersistentSampleCache(s32 size, s32 fontId, uintptr_t sampl
void AudioLoad_DecreaseSampleDmaTtls(void);
void AudioLoad_ProcessLoads(s32 resetStatus);
void AudioLoad_SyncInitSeqPlayer(s32 playerIdx, s32 seqId, s32 arg2);
void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, u32 arg2, u8* dmaIndexRef, s32 medium);
void* AudioLoad_DmaSampleData(uintptr_t devAddr, u32 size, u32 arg2, u8* dmaIndexRef, s32 medium);
void AudioLoad_InitSampleDmaBuffers(s32 numNotes);
void AudioLoad_SyncLoadSeqParts(s32 seqId, s32 flags);
s32 AudioLoad_SyncLoadInstrument(s32 fontId, s32 instId, s32 drumId);
+16 -9
View File
@@ -1595,7 +1595,7 @@ void Audio_PlayActiveSfx(u8 bankId) {
void Audio_KillSfxByBank(u8 bankId) {
// LAudioTODO: Stub for now
return;
// return;
SfxBankEntry* entry;
u8 next = sSfxBanks[bankId][0].next;
@@ -1618,7 +1618,8 @@ void Audio_KillSfxByBank(u8 bankId) {
void Audio_StopSfxByBankAndSource(u8 bankId, f32* sfxSource) {
// LAudioTODO: Stub for now
return;
// return;
SfxBankEntry* entry;
u8 curIndex = 0;
u8 nextIndex = sSfxBanks[bankId][0].next;
@@ -1641,7 +1642,8 @@ void Audio_StopSfxByBankAndSource(u8 bankId, f32* sfxSource) {
void Audio_KillSfxByBankAndSource(u8 bankId, f32* sfxSource) {
// LAudioTODO: Stub for now
return;
// return;
SfxBankEntry cmp;
Audio_StopSfxByBankAndSource(bankId, sfxSource);
@@ -1652,7 +1654,8 @@ void Audio_KillSfxByBankAndSource(u8 bankId, f32* sfxSource) {
void Audio_KillSfxBySource(f32* sfxSource) {
// LAudioTODO: Stub for now
return;
// return;
u8 i;
SfxBankEntry cmp;
@@ -1665,7 +1668,7 @@ void Audio_KillSfxBySource(f32* sfxSource) {
void Audio_KillSfxBySourceAndId(f32* sfxSource, u32 sfxId) {
// LAudioTODO: Stub for now
return;
// return;
u32 bankId = SFX_BANK(sfxId);
u8 next = sSfxBanks[bankId][0].next;
@@ -1695,7 +1698,8 @@ void Audio_KillSfxBySourceAndId(f32* sfxSource, u32 sfxId) {
void Audio_KillSfxByTokenAndId(u8 token, u32 sfxId) {
// LAudioTODO: Stub for now
return;
// return;
u32 bankId = SFX_BANK(sfxId);
u8 next = sSfxBanks[bankId][0].next;
u8 current = 0;
@@ -1723,7 +1727,8 @@ void Audio_KillSfxByTokenAndId(u8 token, u32 sfxId) {
void Audio_KillSfxById(u32 sfxId) {
// LAudioTODO: Stub for now
return;
// return;
u32 bankId = SFX_BANK(sfxId);
u8 next = sSfxBanks[bankId][0].next;
u8 current = 0;
@@ -1864,7 +1869,8 @@ void Audio_ClearVoice(void) {
s32 Audio_GetCurrentVoice(void) {
// LAudioTODO: Stub for now
return 0;
// return 0;
if (!IS_SEQUENCE_CHANNEL_VALID(gSeqPlayers[SEQ_PLAYER_VOICE].channels[15])) {
return 0;
}
@@ -1880,7 +1886,8 @@ s32 Audio_GetCurrentVoice(void) {
s32 Audio_GetCurrentVoiceStatus(void) {
// LAudioTODO: Stub for now
return 1;
// return 1;
SequenceChannel* channel = gSeqPlayers[SEQ_PLAYER_VOICE].channels[15];
SequenceLayer* layer = channel->layers[0];
+2 -2
View File
@@ -147,8 +147,8 @@ void* AudioHeap_Alloc(AudioAllocPool* pool, u32 size) {
}
void AudioHeap_InitPool(AudioAllocPool* pool, void* ramAddr, u32 size) {
pool->curRamAddr = pool->startRamAddr = (u8*) ALIGN16((u32) ramAddr);
pool->size = size - ((u32) ramAddr & 0xF);
pool->curRamAddr = pool->startRamAddr = (u8*) ramAddr;
pool->size = size - ((uintptr_t) ramAddr & 0xF);
pool->numEntries = 0;
}
+37 -34
View File
@@ -1,6 +1,8 @@
#include "sys.h"
#include "sf64dma.h"
#include "sf64audio_provisional.h"
#include "assets/ast_audio.h"
#include "port/Engine.h"
s32 D_80146D80;
s32 PAD_80146D88[2];
@@ -14,23 +16,23 @@ void* AudioLoad_SyncLoad(u32 tableType, u32 id, s32* didAllocate);
s32 AudioLoad_GetLoadTableIndex(s32 tableType, u32 entryId);
void* AudioLoad_SearchCaches(s32 tableType, s32 id);
AudioTable* AudioLoad_GetLoadTable(s32 tableType);
void AudioLoad_SyncDma(u32 devAddr, u8* ramAddr, u32 size, s32 medium);
void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size,
void AudioLoad_SyncDma(uintptr_t devAddr, u8* ramAddr, u32 size, s32 medium);
void AudioLoad_SyncDmaUnkMedium(uintptr_t devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, uintptr_t devAddr, void* ramAddr, u32 size,
OSMesgQueue* retQueue, s32 medium, const char* dmaType);
s32 func_8000FC7C(u32 unkMediumParam, u32* addrPtr);
void func_8000FC8C(s32 unkParam2, u32 addr, u8* ramAddr, u32 size);
void func_8000FC8C(s32 unkParam2, uintptr_t addr, u8* ramAddr, u32 size);
void* AudioLoad_AsyncLoadInner(s32 tableType, s32 id, s32 nChunks, s32 retData, OSMesgQueue* retQueue);
Sample* AudioLoad_GetFontSample(s32 fontId, s32 instId);
void AudioLoad_ProcessSlowLoads(s32 resetStatus);
void AudioLoad_DmaSlowCopy(AudioSlowLoad* slowLoad, s32 size);
void AudioLoad_DmaSlowCopyUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, u8* ramAddr, u32 size, s32 medium, s32 nChunks,
void AudioLoad_DmaSlowCopyUnkMedium(uintptr_t devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
AudioAsyncLoad* AudioLoad_StartAsyncLoad(uintptr_t devAddr, u8* ramAddr, u32 size, s32 medium, s32 nChunks,
OSMesgQueue* retQueue, u32 retMesg);
void AudioLoad_ProcessAsyncLoads(s32 resetStatus);
void AudioLoad_ProcessAsyncLoad(AudioAsyncLoad* asyncLoad, s32 resetStatus);
void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size);
void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
void AudioLoad_AsyncDmaUnkMedium(uintptr_t devAddr, u8* ramAddr, u32 size, s32 unkMediumParam);
void AudioLoad_RelocateSample(TunedSample* tSample, u32 fontDataAddr, SampleBankRelocInfo* relocInfo);
s32 AudioLoad_RelocateFontAndPreloadSamples(s32 fontId, u32 fontDataAddr, SampleBankRelocInfo* relocData, s32 isAsync);
s32 AudioLoad_ProcessSamplePreloads(s32 resetStatus);
@@ -67,12 +69,12 @@ void AudioLoad_DecreaseSampleDmaTtls(void) {
static const char devstr00[] = "CAUTION:WAVE CACHE FULL %d";
void* AudioLoad_DmaSampleData(u32 devAddr, u32 size, u32 arg2, u8* dmaIndexRef, s32 medium) {
void* AudioLoad_DmaSampleData(uintptr_t devAddr, u32 size, u32 arg2, u8* dmaIndexRef, s32 medium) {
u32 i;
SampleDma* dma;
bool hasDma = false;
s32 bufferPos;
u32 dmaDevAddr;
uintptr_t dmaDevAddr;
s32 sp38;
if ((arg2 != 0) || (*dmaIndexRef >= gSampleDmaListSize1)) {
@@ -676,7 +678,7 @@ void AudioLoad_RelocateFont(s32 fontId, u32 fontBaseAddr, void* relocData) {
gSoundFontList[fontId].instruments = (u32) &fontDataPtrs[1];
}
void AudioLoad_SyncDma(u32 devAddr, u8* ramAddr, u32 size, s32 medium) {
void AudioLoad_SyncDma(uintptr_t devAddr, u8* ramAddr, u32 size, s32 medium) {
size = ALIGN16(size);
osInvalDCache(ramAddr, size);
@@ -698,8 +700,8 @@ void AudioLoad_SyncDma(u32 devAddr, u8* ramAddr, u32 size, s32 medium) {
}
}
void AudioLoad_SyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
s32 addr = devAddr;
void AudioLoad_SyncDmaUnkMedium(uintptr_t devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
uintptr_t addr = devAddr;
osInvalDCache(ramAddr, size);
func_8000FC8C(func_8000FC7C(unkMediumParam, &addr), addr, ramAddr, size);
@@ -711,20 +713,20 @@ static const char devstr24[] = "Load Bank BG, Type %d , ID %d\n";
static const char devstr25[] = "get auto\n";
static const char devstr26[] = "get s-auto %x\n";
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void* ramAddr, u32 size,
s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, uintptr_t devAddr, void* ramAddr, u32 size,
OSMesgQueue* retQueue, s32 medium, const char* dmaType) {
OSPiHandle* handle;
switch (medium) {
case MEDIUM_CART:
handle = osCartRomInit();
break;
case MEDIUM_DISK_DRIVE:
// handle = osDriveRomInit();
break;
default:
return 0;
}
// switch (medium) {
// case MEDIUM_CART:
// handle = osCartRomInit();
// break;
// case MEDIUM_DISK_DRIVE:
// // handle = osDriveRomInit();
// break;
// default:
// return 0;
// }
if (size % 16) {
size = ALIGN16(size);
@@ -737,7 +739,8 @@ s32 AudioLoad_Dma(OSIoMesg* mesg, u32 priority, s32 direction, u32 devAddr, void
mesg->size = size;
handle->transferInfo.cmdType = 2;
osEPiStartDma(handle, mesg, direction);
// osEPiStartDma(handle, mesg, direction);
memcpy(ramAddr, (void*) devAddr, size);
return 0;
}
@@ -746,7 +749,7 @@ s32 func_8000FC7C(u32 unkMediumParam, u32* addrPtr) {
return 0;
}
void func_8000FC8C(s32 unkParam2, u32 addr, u8* ramAddr, u32 size) {
void func_8000FC8C(s32 unkParam2, uintptr_t addr, u8* ramAddr, u32 size) {
}
void AudioLoad_SyncLoadSimple(u32 tableType, u32 id) {
@@ -890,7 +893,7 @@ void AudioLoad_Init(void) {
}
clearContext = gAudioContextStart;
dwordsLeft = ((u32) gAudioContextEnd - (u32) gAudioContextStart) / 8;
dwordsLeft = ((uintptr_t) gAudioContextEnd - (uintptr_t) gAudioContextStart) / 8;
for (; dwordsLeft >= 0; dwordsLeft--) {
*clearContext++ = 0;
}
@@ -938,9 +941,9 @@ void AudioLoad_Init(void) {
gSeqFontTable = gSeqFontTableInit;
gNumSequences = gSequenceTable->base.numEntries;
AudioLoad_InitTable(gSequenceTable, SEGMENT_ROM_START(audio_seq), gSequenceMedium);
AudioLoad_InitTable(gSoundFontTable, SEGMENT_ROM_START(audio_bank), gSoundFontMedium);
AudioLoad_InitTable(gSampleBankTable, SEGMENT_ROM_START(audio_table), gSampleBankMedium);
AudioLoad_InitTable(gSequenceTable, LOAD_ASSET(gAudioSeq), gSequenceMedium);
AudioLoad_InitTable(gSoundFontTable, LOAD_ASSET(gAudioBank), gSoundFontMedium);
AudioLoad_InitTable(gSampleBankTable, LOAD_ASSET(gAudioTable), gSampleBankMedium);
numFonts = gSoundFontTable->base.numEntries;
@@ -1104,14 +1107,14 @@ static const char devstr45[] = "===Block BG end\n";
static const char devstr46[] = "Retcode %x\n";
static const char devstr47[] = "Other Type: Not Write ID.\n";
void AudioLoad_DmaSlowCopyUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
s32 addr = devAddr;
void AudioLoad_DmaSlowCopyUnkMedium(uintptr_t devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
uintptr_t addr = devAddr;
osInvalDCache(ramAddr, size);
func_8000FC8C(func_8000FC7C(unkMediumParam, &addr), addr, ramAddr, size);
}
AudioAsyncLoad* AudioLoad_StartAsyncLoad(u32 devAddr, u8* ramAddr, u32 size, s32 medium, s32 nChunks,
AudioAsyncLoad* AudioLoad_StartAsyncLoad(uintptr_t devAddr, u8* ramAddr, u32 size, s32 medium, s32 nChunks,
OSMesgQueue* retQueue, u32 retMesg) {
AudioAsyncLoad* asyncLoad;
s32 i;
@@ -1264,8 +1267,8 @@ void AudioLoad_AsyncDma(AudioAsyncLoad* asyncLoad, u32 size) {
asyncLoad->medium, "BGCOPY");
}
void AudioLoad_AsyncDmaUnkMedium(u32 devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
s32 addr = devAddr;
void AudioLoad_AsyncDmaUnkMedium(uintptr_t devAddr, u8* ramAddr, u32 size, s32 unkMediumParam) {
uintptr_t addr = devAddr;
osInvalDCache(ramAddr, size);
func_8000FC8C(func_8000FC7C(unkMediumParam, &addr), addr, ramAddr, size);
+1
View File
@@ -1,5 +1,6 @@
#include "sys.h"
#include "sf64audio_provisional.h"
#include "audio/mixer.h"
s32 D_80145D40; // unused
+68 -1
View File
@@ -39,7 +39,74 @@ static const char devstr12[] = "Undefined Port Command %d\n";
static const char devstr13[] = "specchg conjunction error (Msg:%d Cur:%d)\n";
static const char devstr14[] = "Error : Queue is not empty ( %x ) \n";
SPTask* AudioThread_CreateTask(void) {
void AudioThread_CreateNextAudioBuffer(s16 *samples, u32 num_samples) {
static s32 gMaxAbiCmdCnt = 128;
static SPTask* gWaitingAudioTask = NULL;
u32 sp54;
s32 sp50;
s32 sp4C;
s32 pad48;
OSTask_t* task;
u16* sp40;
s32 pad3C;
OSMesg sp38;
OSMesg sp34;
s32 pad30;
gAudioTaskCountQ++;
if ((gAudioTaskCountQ % gAudioBufferParams.count) != 0) {
return;
}
osSendMesg(gAudioTaskStartQueue, OS_MESG_32(gAudioTaskCountQ), 0);
gAudioTaskIndexQ ^= 1;
gCurAiBuffIndex++;
gCurAiBuffIndex %= 3;
sp4C = (gCurAiBuffIndex + 1) % 3;
sp54 = osAiGetLength() >> 2;
if ((gAudioResetTimer < 16) && (gAiBuffLengths[sp4C] != 0)) {
osAiSetNextBuffer(gAiBuffers[sp4C], gAiBuffLengths[sp4C] * 4);
}
if (gCurAudioFrameDmaCount && gCurAudioFrameDmaCount) {}
gCurAudioFrameDmaCount = 0;
AudioLoad_DecreaseSampleDmaTtls();
AudioLoad_ProcessLoads(gAudioResetStep);
if (osRecvMesg(&gAudioTaskMesgQueue, &sp38, 0) != -1) {
if (gAudioResetStep == 0) {
gAudioResetStep = 5;
}
gAudioSpecId = sp38.data32;
}
if ((gAudioResetStep != 0) && (AudioHeap_ResetStep() == 0)) {
if (gAudioResetStep == 0) {
osSendMesg(gAudioResetQueue, OS_MESG_32((s32) gAudioSpecId), 0);
}
gWaitingAudioTask = NULL;
return;
}
if (gAudioResetTimer > 16) {
return;
}
if (gAudioResetTimer != 0) {
gAudioResetTimer++;
}
gAudioCurTask = &gAudioRspTasks[gAudioTaskIndexQ];
gCurAbiCmdBuffer = gAbiCmdBuffs[gAudioTaskIndexQ];
sp4C = gCurAiBuffIndex;
sp40 = gAiBuffers[sp4C];
gAiBuffLengths[sp4C] = num_samples;
if (gAiBuffLengths[sp4C] < gAudioBufferParams.minAiBufferLength) {
gAiBuffLengths[sp4C] = gAudioBufferParams.minAiBufferLength;
}
if (gAiBuffLengths[sp4C] > gAudioBufferParams.maxAiBufferLength) {
gAiBuffLengths[sp4C] = gAudioBufferParams.maxAiBufferLength;
}
while (osRecvMesg(gThreadCmdProcQueue, &sp34, 0) != -1) {
AudioThread_ProcessCmds(sp34.data32);
}
gCurAbiCmdBuffer = func_80009B64(gCurAbiCmdBuffer, &sp50, samples, num_samples);
gAudioRandom = osGetCount() * (gAudioRandom + gAudioTaskCountQ);
}
SPTask* AudioThread_CreateTask() {
static s32 gMaxAbiCmdCnt = 128;
static SPTask* gWaitingAudioTask = NULL;
u32 aiSamplesLeft;
+527
View File
File diff suppressed because it is too large Load Diff
+88
View File
@@ -0,0 +1,88 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "libultraship/libultra/abi.h"
#undef aSegment
#undef aClearBuffer
#undef aSetBuffer
#undef aLoadBuffer
#undef aSaveBuffer
#undef aDMEMMove
#undef aMix
#undef aEnvMixer
#undef aResample
#undef aInterleave
#undef aSetVolume
#undef aSetVolume32
#undef aSetLoop
#undef aLoadADPCM
#undef aADPCMdec
#undef aS8Dec
#undef aAddMixer
#undef aDuplicate
#undef aDMEMMove2
#undef aResampleZoh
#undef aEnvSetup1
#undef aEnvSetup2
#undef aFilter
#undef aHiLoGain
#undef aInterl
#undef aUnkCmd3
#undef aUnkCmd19
void aClearBufferImpl(uint16_t addr, int nbytes);
void aLoadBufferImpl(const void* source_addr, uint16_t dest_addr, uint16_t nbytes);
void aSaveBufferImpl(uint16_t source_addr, int16_t* dest_addr, uint16_t nbytes);
void aLoadADPCMImpl(int num_entries_times_16, const int16_t* book_source_addr);
void aSetBufferImpl(uint8_t flags, uint16_t in, uint16_t out, uint16_t nbytes);
void aInterleaveImpl(uint16_t dest, uint16_t left, uint16_t right, uint16_t c);
void aDMEMMoveImpl(uint16_t in_addr, uint16_t out_addr, int nbytes);
void aSetLoopImpl(ADPCM_STATE* adpcm_loop_state);
void aADPCMdecImpl(uint8_t flags, ADPCM_STATE state);
void aResampleImpl(uint8_t flags, uint16_t pitch, RESAMPLE_STATE state);
void aEnvSetup1Impl(uint8_t initial_vol_wet, uint16_t rate_wet, uint16_t rate_left, uint16_t rate_right);
void aEnvSetup2Impl(uint16_t initial_vol_left, uint16_t initial_vol_right);
void aEnvMixerImpl(uint16_t in_addr, uint16_t n_samples, bool swap_reverb, bool neg_3, bool neg_2, bool neg_left,
bool neg_right, int32_t wet_dry_addr, u32 unk);
void aMixImpl(uint16_t count, int16_t gain, uint16_t in_addr, uint16_t out_addr);
void aS8DecImpl(uint8_t flags, ADPCM_STATE state);
void aAddMixerImpl(uint16_t count, uint16_t in_addr, uint16_t out_addr);
void aDuplicateImpl(uint16_t count, uint16_t in_addr, uint16_t out_addr);
void aResampleZohImpl(uint16_t pitch, uint16_t start_fract);
void aInterlImpl(uint16_t in_addr, uint16_t out_addr, uint16_t n_samples);
void aFilterImpl(uint8_t flags, uint16_t count_or_buf, int16_t* state_or_filter);
void aHiLoGainImpl(uint8_t g, uint16_t count, uint16_t addr);
void aUnkCmd3Impl(uint16_t a, uint16_t b, uint16_t c);
void aUnkCmd19Impl(uint8_t f, uint16_t count, uint16_t out_addr, uint16_t in_addr);
#define aSegment(pkt, s, b) \
do { \
} while (0)
#define aClearBuffer(pkt, d, c) aClearBufferImpl(d, c)
#define aLoadBuffer(pkt, s, d, c) aLoadBufferImpl(s, d, c)
#define aSaveBuffer(pkt, s, d, c) aSaveBufferImpl(s, d, c)
#define aLoadADPCM(pkt, c, d) aLoadADPCMImpl(c, d)
#define aSetBuffer(pkt, f, i, o, c) aSetBufferImpl(f, i, o, c)
#define aInterleave(pkt, o, l, r, c) aInterleaveImpl(o, l, r, c)
#define aDMEMMove(pkt, i, o, c) aDMEMMoveImpl(i, o, c)
#define aSetLoop(pkt, a) aSetLoopImpl(a)
#define aADPCMdec(pkt, f, s) aADPCMdecImpl(f, s)
#define aResample(pkt, f, p, s) aResampleImpl(f, p, s)
#define aEnvSetup1(pkt, initialVolReverb, rampReverb, rampLeft, rampRight) \
aEnvSetup1Impl(initialVolReverb, rampReverb, rampLeft, rampRight)
#define aEnvSetup2(pkt, initialVolLeft, initialVolRight) aEnvSetup2Impl(initialVolLeft, initialVolRight)
#define aEnvMixer(pkt, inBuf, nSamples, swapReverb, negLeft, negRight, dryLeft, dryRight, wetLeft, wetRight) \
aEnvMixerImpl(inBuf, nSamples, swapReverb, negLeft, negRight, dryLeft, dryRight, wetLeft, wetRight)
#define aMix(pkt, c, g, i, o) aMixImpl(c, g, i, o)
#define aS8Dec(pkt, f, s) aS8DecImpl(f, s)
#define aAddMixer(pkt, s, d, c, x) aAddMixerImpl(s, d, c)
#define aDuplicate(pkt, s, d, c) aDuplicateImpl(s, d, c)
#define aDMEMMove2(pkt, t, i, o, c) aDMEMMove2Impl(t, i, o, c)
#define aResampleZoh(pkt, pitch, startFract) aResampleZohImpl(pitch, startFract)
#define aInterl(pkt, dmemi, dmemo, count) aInterlImpl(dmemi, dmemo, count)
#define aFilter(pkt, f, countOrBuf, addr) aFilterImpl(f, countOrBuf, addr)
#define aHiLoGain(pkt, g, buflen, i, a4) aHiLoGainImpl(g, buflen, i)
#define aUnkCmd3(pkt, a1, a2, a3) aUnkCmd3Impl(a1, a2, a3)
#define aUnkCmd19(pkt, a1, a2, a3, a4) aUnkCmd19Impl(a1, a2, a3, a4)
+1 -1
View File
@@ -3,7 +3,7 @@
u8 gOSYieldData[OS_YIELD_DATA_SIZE];
FrameBuffer gZBuffer; // z buffer
u8 gTaskOutputBuffer[0x30000];
u8 gAudioHeap[0xB0000];
u8 gAudioHeap[0xB0000 * 2];
u16 gTextureRenderBuffer[0x3C40];
u16 gFillBuffer[3 * SCREEN_WIDTH];
FrameBuffer gFrameBuffers[3];
+1
View File
@@ -3,6 +3,7 @@
s32 osViClock2 = 0x02E6D354;
s32 osAiSetFrequency(u32 freq) {
return 32000;
register u32 a1;
register s32 a2;
register float ftmp;
+1
View File
@@ -13,6 +13,7 @@
#include "assets/ast_option.h"
#include "assets/ast_vs_menu.h"
#include "assets/ast_map.h"
#include "port/interpolation/FrameInterpolation.h"
extern s32 gRankingTeamAlive[][3];
extern Gfx gMapVenomCloudDL[];
+1
View File
@@ -10,6 +10,7 @@
#include "fox_title.h"
#include "assets/ast_title.h"
#include "assets/ast_text.h"
#include "port/interpolation/FrameInterpolation.h"
f32 D_menu_801B7BB0;
f32 D_menu_801B7BB4;
+61
View File
@@ -24,6 +24,7 @@
#include <MatrixFactory.h>
#include <BlobFactory.h>
#include <VertexFactory.h>
#include "audio/GameAudio.h"
#include <Fast3D/gfx_pc.h>
#include <Fast3D/gfx_rendering_api.h>
@@ -36,6 +37,7 @@ extern uint16_t gFPS;
float gInterpolationStep = 0.0f;
#include <sf64thread.h>
#include <macros.h>
void AudioThread_CreateNextAudioBuffer(int16_t *samples, uint32_t num_samples);
}
GameEngine* GameEngine::Instance;
@@ -85,6 +87,7 @@ GameEngine::GameEngine() {
void GameEngine::Create(){
const auto instance = Instance = new GameEngine();
instance->AudioInit();
GameUI::SetupGuiElements();
#if defined(__SWITCH__) || defined(__WIIU__)
CVarRegisterInteger("gControlNav", 1); // always enable controller nav on switch/wii u
@@ -114,6 +117,64 @@ void GameEngine::StartFrame() const{
this->context->GetWindow()->StartFrame();
}
void GameEngine::HandleAudioThread(){
while (audio.running) {
{
std::unique_lock<std::mutex> Lock(audio.mutex);
while (!audio.processing && audio.running) {
audio.cv_to_thread.wait(Lock);
}
if (!audio.running) {
break;
}
}
std::unique_lock<std::mutex> Lock(audio.mutex);
int samples_left = AudioPlayerBuffered();
u32 num_audio_samples = samples_left < AudioPlayerGetDesiredBuffered() ? SAMPLES_HIGH : SAMPLES_LOW;
s16 audio_buffer[SAMPLES_PER_FRAME];
for (int i = 0; i < NUM_AUDIO_CHANNELS; i++) {
AudioThread_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * 2), num_audio_samples);
}
AudioPlayerPlayFrame((u8 *) audio_buffer, 2 * num_audio_samples * 4);
audio.processing = false;
audio.cv_from_thread.notify_one();
}
}
void GameEngine::StartAudioFrame(){
{
std::unique_lock<std::mutex> Lock(audio.mutex);
audio.processing = true;
}
audio.cv_to_thread.notify_one();
}
void GameEngine::EndAudioFrame(){
{
std::unique_lock<std::mutex> Lock(audio.mutex);
while (audio.processing) {
audio.cv_from_thread.wait(Lock);
}
}
}
void GameEngine::AudioInit() {
if (!audio.running) {
audio.running = true;
audio.thread = std::thread(HandleAudioThread);
}
}
void GameEngine::AudioExit() {
{
std::unique_lock lock(audio.mutex);
audio.running = false;
}
audio.cv_to_thread.notify_all();
// Wait until the audio thread quit
audio.thread.join();
}
void GameEngine::RunCommands(Gfx* Commands, const std::vector<std::unordered_map<Mtx*, MtxF>>& mtx_replacements) {
for (const auto& m : mtx_replacements) {
gfx_run(Commands, m);
+5
View File
@@ -23,6 +23,11 @@ class GameEngine {
GameEngine();
static void Create();
void StartFrame() const;
static void HandleAudioThread();
static void StartAudioFrame();
static void EndAudioFrame();
static void AudioInit();
static void AudioExit();
static void RunCommands(Gfx* Commands, const std::vector<std::unordered_map<Mtx*, MtxF>>& mtx_replacements);
void ProcessFrame(void (*run_one_game_iter)()) const;
static void Destroy();
+3 -2
View File
@@ -10,6 +10,7 @@ extern "C" {
void Main_ThreadEntry(void* arg);
void Lib_FillScreen(u8 setFill);
void Graphics_ThreadUpdate();
void AudioThread_CreateTask();
}
extern "C"
@@ -20,12 +21,12 @@ void Graphics_PushFrame(Gfx* data) {
extern "C" void Timer_Update();
void push_frame() {
// GameEngine::StartAudioFrame();
GameEngine::StartAudioFrame();
GameEngine::Instance->StartFrame();
Graphics_ThreadUpdate();
Timer_Update();
// thread5_iteration();
// GameEngine::EndAudioFrame();
GameEngine::EndAudioFrame();
}
#ifdef _WIN32
+10
View File
@@ -0,0 +1,10 @@
#pragma once
#include <thread>
#include <condition_variable>
static struct {
std::thread thread;
std::condition_variable cv_to_thread, cv_from_thread;
std::mutex mutex;
bool running;
bool processing;
} audio;
+4 -3
View File
@@ -105,8 +105,9 @@ void Main_Initialize(void) {
void Audio_ThreadEntry(void* arg0) {
// SPTask* task;
// AudioLoad_Init();
// Audio_InitSounds();
AudioLoad_Init();
Audio_InitSounds();
// task = AudioThread_CreateTask();
// if (task != NULL) {
// task->msgQueue = &gAudioTaskMsgQueue;
@@ -383,7 +384,7 @@ void Main_ThreadEntry(void* arg0) {
u32 mesg;
// LTODO: Implement audio
// Audio_ThreadEntry(NULL);
Audio_ThreadEntry(NULL);
Graphics_ThreadEntry(NULL);
Controller_Init();