diff --git a/include/PR/abi.h b/include/PR/abi.h index f218a347..bb371233 100644 --- a/include/PR/abi.h +++ b/include/PR/abi.h @@ -322,13 +322,12 @@ typedef short ENVMIX_STATE[40]; _a->words.w1 = (u32)(m); \ } -#define aInterleave(pkt, o, l, r, c) \ -{ \ - Acmd *_a = (Acmd *)pkt; \ - \ - _a->words.w0 = (_SHIFTL(A_INTERLEAVE, 24, 8) | \ - _SHIFTL(c >> 4, 16, 8) | _SHIFTL(o, 0, 16)); \ - _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \ +#define aInterleave(pkt, l, r) \ +{ \ + Acmd *_a = (Acmd *)pkt; \ + \ + _a->words.w0 = _SHIFTL(A_INTERLEAVE, 24, 8); \ + _a->words.w1 = _SHIFTL(l, 16, 16) | _SHIFTL(r, 0, 16); \ } #define aInterl(pkt, dmemi, dmemo, count) \ diff --git a/src/audio/audio_synthesis.c b/src/audio/audio_synthesis.c index 2a637695..2a0e147e 100644 --- a/src/audio/audio_synthesis.c +++ b/src/audio/audio_synthesis.c @@ -835,7 +835,7 @@ Acmd* AudioSynth_DoOneAudioUpdate(s16* aiBuf, s32 aiBufLen, Acmd* aList, s32 upd j = aiBufLen * 2; aSetBuffer(aList++, 0, 0, DMEM_TEMP, j); - aInterleave(aList++, 0, DMEM_LEFT_CH, DMEM_RIGHT_CH, 0); + aInterleave(aList++, DMEM_LEFT_CH, DMEM_RIGHT_CH); aSaveBuffer(aList++, DMEM_TEMP, OS_K0_TO_PHYSICAL(aiBuf), j * 2); return aList; diff --git a/src/audio/mixer.c b/src/audio/mixer.c index 40c8dc4d..24ac712a 100644 --- a/src/audio/mixer.c +++ b/src/audio/mixer.c @@ -127,6 +127,55 @@ void aSetBufferImpl(uint8_t flags, uint16_t in, uint16_t out, uint16_t nbytes) { rspa.nbytes = nbytes; } +#if 1 +// old abi impl +void aInterleaveImpl(uint16_t left, uint16_t right) { + if(rspa.nbytes == 0) { // Added + return; + } + + int count = ROUND_UP_16(rspa.nbytes) >> 3; + int16_t *l = BUF_S16(left); + int16_t *r = BUF_S16(right); + int16_t *d = BUF_S16(rspa.out); + while (count > 0) { + int16_t l0 = *l++; + int16_t l1 = *l++; + int16_t l2 = *l++; + int16_t l3 = *l++; + int16_t l4 = *l++; + int16_t l5 = *l++; + int16_t l6 = *l++; + int16_t l7 = *l++; + int16_t r0 = *r++; + int16_t r1 = *r++; + int16_t r2 = *r++; + int16_t r3 = *r++; + int16_t r4 = *r++; + int16_t r5 = *r++; + int16_t r6 = *r++; + int16_t r7 = *r++; + *d++ = l0; + *d++ = r0; + *d++ = l1; + *d++ = r1; + *d++ = l2; + *d++ = r2; + *d++ = l3; + *d++ = r3; + *d++ = l4; + *d++ = r4; + *d++ = l5; + *d++ = r5; + *d++ = l6; + *d++ = r6; + *d++ = l7; + *d++ = r7; + --count; + } +} +#else +// new abi void aInterleaveImpl(uint16_t dest, uint16_t left, uint16_t right, uint16_t c) { if(rspa.nbytes == 0){ return; @@ -158,6 +207,7 @@ void aInterleaveImpl(uint16_t dest, uint16_t left, uint16_t right, uint16_t c) { --count; } } +#endif void aDMEMMoveImpl(uint16_t in_addr, uint16_t out_addr, int nbytes) { nbytes = ROUND_UP_16(nbytes); diff --git a/src/audio/mixer.h b/src/audio/mixer.h index 0eaf0830..b9ec250c 100644 --- a/src/audio/mixer.h +++ b/src/audio/mixer.h @@ -37,7 +37,7 @@ void aLoadBufferImpl(const void* source_addr, uint16_t dest_addr, uint16_t nbyte 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 aInterleaveImpl(uint16_t left, uint16_t right); 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); @@ -65,7 +65,7 @@ void aUnkCmd19Impl(uint8_t f, uint16_t count, uint16_t out_addr, uint16_t in_add #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 aInterleave(pkt, l, r) aInterleaveImpl(l, r) #define aDMEMMove(pkt, i, o, c) aDMEMMoveImpl(i, o, c) #define aSetLoop(pkt, a) aSetLoopImpl(a) #define aADPCMdec(pkt, f, s) aADPCMdecImpl(f, s) diff --git a/tools/Torch b/tools/Torch index 73ce1410..c7d12dad 160000 --- a/tools/Torch +++ b/tools/Torch @@ -1 +1 @@ -Subproject commit 73ce1410bb811a06582913d4005dcd7a6c93ec68 +Subproject commit c7d12dadb52c69bf2ada005006cfd0da5a14f615