diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-07-08 15:28:40 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:48 +0200 |
commit | 4fbf785bbdfee9be474724caf8b804b0544d0f79 (patch) | |
tree | 67ad61cd0d2b1f681cbb7090886f99abb1fdc988 | |
parent | 6e37656a84a76cd315b870a8002e2fec0fa0f00e (diff) |
arm7: decompile SND_command
-rw-r--r-- | arm7/asm/SND_command.s | 639 | ||||
-rw-r--r-- | arm7/lib/include/SND.h | 4 | ||||
-rw-r--r-- | arm7/lib/include/SND_channel.h | 4 | ||||
-rw-r--r-- | arm7/lib/include/SND_command.h | 2 | ||||
-rw-r--r-- | arm7/lib/include/SND_exChannel.h | 1 | ||||
-rw-r--r-- | arm7/lib/include/SND_main.h | 2 | ||||
-rw-r--r-- | arm7/lib/include/SND_seq.h | 17 | ||||
-rw-r--r-- | arm7/lib/include/SND_wave.h | 2 | ||||
-rw-r--r-- | arm7/lib/include/SND_work.h | 4 | ||||
-rw-r--r-- | arm7/lib/src/SND_command.c | 302 | ||||
-rw-r--r-- | arm7/lib/src/SND_lockChannel.c | 2 | ||||
-rw-r--r-- | arm7/lib/src/SND_wave.c | 4 | ||||
-rw-r--r-- | arm7/lib/src/SND_work.c | 4 | ||||
-rw-r--r-- | arm9/lib/NitroSDK/include/SND_work.h | 45 | ||||
-rw-r--r-- | include/nitro/SND_work_shared.h | 45 |
15 files changed, 382 insertions, 695 deletions
diff --git a/arm7/asm/SND_command.s b/arm7/asm/SND_command.s deleted file mode 100644 index ec1a5014..00000000 --- a/arm7/asm/SND_command.s +++ /dev/null @@ -1,639 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global _038090EC -_038090EC: ;0x038090EC - .space 0x0380910C - 0x038090EC - - .global _0380910C -_0380910C: ;0x0380910C - .space 0x0380912C - 0x0380910C - - .section .text - - arm_func_start ReadDriverInfo -ReadDriverInfo: ; 0x037FF6E4 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - ldr r0, _037FF74C ; =SNDi_Work - mov r1, r5 - mov r2, #4480 ; 0x1180 - bl MIi_CpuCopy32 - ldr r1, _037FF74C ; =SNDi_Work - add r0, r5, #4096 ; 0x1000 - str r1, [r0, #448] ; 0x1c0 - mov r4, #0 -_037FF710: - mov r0, r4 - bl SND_GetChannelControl - add r1, r5, r4, lsl #2 - add r1, r1, #4096 ; 0x1000 - str r0, [r1, #384] ; 0x180 - add r4, r4, #1 - cmp r4, #16 - blt _037FF710 - mov r0, #0 - bl SND_GetLockedChannel - add r1, r5, #4096 ; 0x1000 - str r0, [r1, #452] ; 0x1c4 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FF74C: .word SNDi_Work - - arm_func_start StopTimer -StopTimer: ; 0x037FF750 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r9, r2 - mov r5, r3 - bl OS_DisableInterrupts - mov r4, r0 - mov r8, #0 - b _037FF790 -_037FF778: - ands r0, r9, #1 - beq _037FF788 - mov r0, r8 - bl SND_StopAlarm -_037FF788: - add r8, r8, #1 - mov r9, r9, lsr #1 -_037FF790: - cmp r8, #8 - bge _037FF7A0 - cmp r9, #0 - bne _037FF778 -_037FF7A0: - mov r8, #0 - b _037FF7C4 -_037FF7A8: - ands r0, r7, #1 - beq _037FF7BC - mov r0, r8 - mov r1, r5 - bl SND_StopChannel -_037FF7BC: - add r8, r8, #1 - mov r7, r7, lsr #1 -_037FF7C4: - cmp r8, #16 - bge _037FF7D4 - cmp r7, #0 - bne _037FF7A8 -_037FF7D4: - ands r0, r6, #1 - movne r1, #0 - ldrne r0, _037FF80C ; =0x04000508 - strneb r1, [r0] - ands r0, r6, #2 - movne r1, #0 - ldrne r0, _037FF810 ; =0x04000509 - strneb r1, [r0] - mov r0, r4 - bl OS_RestoreInterrupts - bl SND_UpdateSharedWork - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FF80C: .word 0x04000508 -_037FF810: .word 0x04000509 - - arm_func_start StartTimer -StartTimer: ; 0x037FF814 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r5, r2 - bl OS_DisableInterrupts - mov r4, r0 - mov r2, #0 - b _037FF858 -_037FF838: - ands r0, r7, #1 - movne r0, r2, lsl #4 - addne r0, r0, #67108864 ; 0x4000000 - ldrneb r1, [r0, #1027] ; 0x403 - orrne r1, r1, #128 ; 0x80 - strneb r1, [r0, #1027] ; 0x403 - add r2, r2, #1 - mov r7, r7, lsr #1 -_037FF858: - cmp r2, #16 - bge _037FF868 - cmp r7, #0 - bne _037FF838 -_037FF868: - ands r0, r6, #1 - beq _037FF8A0 - ands r0, r6, #2 - ldreq r1, _037FF8FC ; =0x04000508 - ldreqb r0, [r1] - orreq r0, r0, #128 ; 0x80 - streqb r0, [r1] - beq _037FF8B4 - ldr r2, _037FF8FC ; =0x04000508 - ldrh r1, [r2] - ldr r0, _037FF900 ; =0x00008080 - orr r0, r1, r0 - strh r0, [r2] - b _037FF8B4 -_037FF8A0: - ands r0, r6, #2 - ldrne r1, _037FF904 ; =0x04000509 - ldrneb r0, [r1] - orrne r0, r0, #128 ; 0x80 - strneb r0, [r1] -_037FF8B4: - mov r6, #0 - b _037FF8D4 -_037FF8BC: - ands r0, r5, #1 - beq _037FF8CC - mov r0, r6 - bl SND_StartAlarm -_037FF8CC: - add r6, r6, #1 - mov r5, r5, lsr #1 -_037FF8D4: - cmp r6, #8 - bge _037FF8E4 - cmp r5, #0 - bne _037FF8BC -_037FF8E4: - mov r0, r4 - bl OS_RestoreInterrupts - bl SND_UpdateSharedWork - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FF8FC: .word 0x04000508 -_037FF900: .word 0x00008080 -_037FF904: .word 0x04000509 - - arm_func_start SetChannelPan -SetChannelPan: ; 0x037FF908 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, #0 - b _037FF938 -_037FF91C: - ands r0, r6, #1 - beq _037FF930 - mov r0, r4 - mov r1, r5 - bl SND_SetChannelPan -_037FF930: - add r4, r4, #1 - mov r6, r6, lsr #1 -_037FF938: - cmp r4, #16 - bge _037FF948 - cmp r6, #0 - bne _037FF91C -_037FF948: - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start SetChannelVolume -SetChannelVolume: ; 0x037FF950 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, #0 - b _037FF98C -_037FF96C: - ands r0, r7, #1 - beq _037FF984 - mov r0, r4 - mov r1, r6 - mov r2, r5 - bl SND_SetChannelVolume -_037FF984: - add r4, r4, #1 - mov r7, r7, lsr #1 -_037FF98C: - cmp r4, #16 - bge _037FF99C - cmp r7, #0 - bne _037FF96C -_037FF99C: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start SetChannelTimer -SetChannelTimer: ; 0x037FF9A8 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, #0 - b _037FF9D8 -_037FF9BC: - ands r0, r6, #1 - beq _037FF9D0 - mov r0, r4 - mov r1, r5 - bl SND_SetChannelTimer -_037FF9D0: - add r4, r4, #1 - mov r6, r6, lsr #1 -_037FF9D8: - cmp r4, #16 - bge _037FF9E8 - cmp r6, #0 - bne _037FF9BC -_037FF9E8: - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start InitPXI -InitPXI: ; 0x037FF9F0 - mov r0, #7 - ldr r1, _037FFA00 ; =PxiFifoCallback - ldr ip, _037FFA04 ; =PXI_SetFifoRecvCallback - bx ip -_037FFA00: .word PxiFifoCallback -_037FFA04: .word PXI_SetFifoRecvCallback - - arm_func_start PxiFifoCallback -PxiFifoCallback: ; 0x037FFA08 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r1 - bl OS_DisableInterrupts - mov r4, r0 - cmp r5, #33554432 ; 0x2000000 - bcc _037FFA38 - ldr r0, _037FFA58 ; =_038090EC - mov r1, r5 - mov r2, #0 - bl OS_SendMessage - b _037FFA44 -_037FFA38: - cmp r5, #0 - bne _037FFA44 - bl SND_SendWakeupMessage -_037FFA44: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FFA58: .word _038090EC - - arm_func_start SND_CommandProc -SND_CommandProc: ; 0x037FFA5C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #52 ; 0x34 - ldr r7, _037FFEC4 ; =SNDi_SharedWork - ldr r9, _037FFEC8 ; =_038090EC - add r8, sp, #24 - mov r4, #0 - ldr r6, _037FFECC ; =0x0000FFFF - ldr r5, _037FFED0 ; =0x003FFFFF - b _037FFEA0 -_037FFA80: - ldr lr, [sp, #24] - b _037FFE88 -_037FFA88: - add ip, sp, #28 - ldmia lr!, {r0, r1, r2, r3} - stmia ip!, {r0, r1, r2, r3} - ldmia lr, {r0, r1} - stmia ip, {r0, r1} - ldr r0, [sp, #32] - cmp r0, #33 ; 0x21 - addls pc, pc, r0, lsl #2 - b _037FFE84 - b _037FFB34 - b _037FFB4C - b _037FFB58 - b _037FFB70 - b _037FFB7C - b _037FFB8C - b _037FFB9C - b _037FFBB4 - b _037FFBDC - b _037FFBF0 - b _037FFC04 - b _037FFC20 - b _037FFC38 - b _037FFC50 - b _037FFD08 - b _037FFD74 - b _037FFDA8 - b _037FFC68 - b _037FFCB0 - b _037FFCD4 - b _037FFCE4 - b _037FFCF8 - b _037FFDD4 - b _037FFDE0 - b _037FFDEC - b _037FFDF8 - b _037FFE10 - b _037FFE20 - b _037FFE30 - b _037FFE70 - b _037FFE40 - b _037FFE50 - b _037FFE60 - b _037FFE7C -_037FFB34: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SND_StartSeq - b _037FFE84 -_037FFB4C: - ldr r0, [sp, #36] ; 0x24 - bl SND_StopSeq - b _037FFE84 -_037FFB58: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SND_PrepareSeq - b _037FFE84 -_037FFB70: - ldr r0, [sp, #36] ; 0x24 - bl SND_StartPreparedSeq - b _037FFE84 -_037FFB7C: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_PauseSeq - b _037FFE84 -_037FFB8C: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_SkipSeq - b _037FFE84 -_037FFB9C: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SNDi_SetPlayerParam - b _037FFE84 -_037FFBB4: - ldr r1, [sp, #36] ; 0x24 - mov r0, r1, lsr #24 - and r0, r0, #255 ; 0xff - str r0, [sp] - bic r0, r1, #-16777216 ; 0xff000000 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SNDi_SetTrackParam - b _037FFE84 -_037FFBDC: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - bl SND_SetTrackMute - b _037FFE84 -_037FFBF0: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - bl SND_SetTrackAllocatableChannel - b _037FFE84 -_037FFC04: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - mov r2, r2, lsl #16 - mov r2, r2, asr #16 - bl SND_SetPlayerLocalVariable - b _037FFE84 -_037FFC20: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - mov r1, r1, lsl #16 - mov r1, r1, asr #16 - bl SND_SetPlayerGlobalVariable - b _037FFE84 -_037FFC38: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl StartTimer - b _037FFE84 -_037FFC50: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl StopTimer - b _037FFE84 -_037FFC68: - ldr r1, [sp, #44] ; 0x2c - mov r0, r1, lsr #29 - and r0, r0, #1 - str r0, [sp] - mov r0, r1, lsr #28 - and r0, r0, #1 - str r0, [sp, #4] - mov r0, r1, lsr #27 - and r0, r0, #1 - str r0, [sp, #8] - mov r0, r1, lsr #31 - and r0, r0, #1 - mov r1, r1, lsr #30 - and r1, r1, #1 - ldr r2, [sp, #36] ; 0x24 - ldr r3, [sp, #40] ; 0x28 - bl SND_SetupCapture - b _037FFE84 -_037FFCB0: - ldr r0, [sp, #48] ; 0x30 - str r0, [sp, #4] - ldr r3, [sp, #44] ; 0x2c - str r4, [sp] - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - mov r2, #0 - bl SND_SetupAlarm - b _037FFE84 -_037FFCD4: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SetChannelTimer - b _037FFE84 -_037FFCE4: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - bl SetChannelVolume - b _037FFE84 -_037FFCF8: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SetChannelPan - b _037FFE84 -_037FFD08: - ldr r3, [sp, #48] ; 0x30 - ldr r1, [sp, #36] ; 0x24 - ldr r0, [sp, #44] ; 0x2c - and r2, r3, r6 - str r2, [sp] - and r2, r0, r5 - str r2, [sp, #4] - mov r2, r0, lsr #24 - and r2, r2, #127 ; 0x7f - str r2, [sp, #8] - mov r0, r0, lsr #22 - and r0, r0, #3 - str r0, [sp, #12] - and r0, r6, r1, lsr #16 - str r0, [sp, #16] - mov r0, r3, lsr #16 - and r0, r0, #127 ; 0x7f - str r0, [sp, #20] - and r0, r1, r6 - ldr r1, [sp, #40] ; 0x28 - bic r1, r1, #-134217728 ; 0xf8000000 - mov r2, r3, lsr #24 - and r2, r2, #3 - mov r3, r3, lsr #26 - and r3, r3, #3 - bl SND_SetupChannelPcm - b _037FFE84 -_037FFD74: - ldr r1, [sp, #44] ; 0x2c - ldr r3, [sp, #40] ; 0x28 - and r0, r6, r1, lsr #8 - str r0, [sp] - and r0, r1, #127 ; 0x7f - str r0, [sp, #4] - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #48] ; 0x30 - and r2, r3, #127 ; 0x7f - mov r3, r3, lsr #8 - and r3, r3, #3 - bl SND_SetupChannelPsg - b _037FFE84 -_037FFDA8: - ldr r3, [sp, #44] ; 0x2c - ldr r2, [sp, #40] ; 0x28 - and r0, r3, #127 ; 0x7f - str r0, [sp] - ldr r0, [sp, #36] ; 0x24 - and r1, r2, #127 ; 0x7f - mov r2, r2, lsr #8 - and r2, r2, #3 - and r3, r6, r3, lsr #8 - bl SND_SetupChannelNoise - b _037FFE84 -_037FFDD4: - ldr r0, [sp, #36] ; 0x24 - bl SNDi_SetSurroundDecay - b _037FFE84 -_037FFDE0: - ldr r0, [sp, #36] ; 0x24 - bl SND_SetMasterVolume - b _037FFE84 -_037FFDEC: - ldr r0, [sp, #36] ; 0x24 - bl SND_SetMasterPan - b _037FFE84 -_037FFDF8: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SND_SetOutputSelector - b _037FFE84 -_037FFE10: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_LockChannel - b _037FFE84 -_037FFE20: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_UnlockChannel - b _037FFE84 -_037FFE30: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_StopUnlockedChannel - b _037FFE84 -_037FFE40: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_InvalidateSeq - b _037FFE84 -_037FFE50: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_InvalidateBank - b _037FFE84 -_037FFE60: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_InvalidateWave - b _037FFE84 -_037FFE70: - ldr r0, [sp, #36] ; 0x24 - str r0, [r7] - b _037FFE84 -_037FFE7C: - ldr r0, [sp, #36] ; 0x24 - bl ReadDriverInfo -_037FFE84: - ldr lr, [sp, #28] -_037FFE88: - cmp lr, #0 - bne _037FFA88 - ldr r1, [r7] - ldr r0, [r1] - add r0, r0, #1 - str r0, [r1] -_037FFEA0: - mov r0, r9 - mov r1, r8 - mov r2, r4 - bl OS_ReceiveMessage - cmp r0, #0 - bne _037FFA80 - add sp, sp, #52 ; 0x34 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FFEC4: .word SNDi_SharedWork -_037FFEC8: .word _038090EC -_037FFECC: .word 0x0000FFFF -_037FFED0: .word 0x003FFFFF - - arm_func_start SND_CommandInit -SND_CommandInit: ; 0x037FFED4 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037FFF08 ; =_038090EC - ldr r1, _037FFF0C ; =_0380910C - mov r2, #8 - bl OS_InitMessageQueue - bl InitPXI - mov r1, #0 - ldr r0, _037FFF10 ; =SNDi_SharedWork - str r1, [r0] - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FFF08: .word _038090EC -_037FFF0C: .word _0380910C -_037FFF10: .word SNDi_SharedWork diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h index b471ac72..c417ab0e 100644 --- a/arm7/lib/include/SND.h +++ b/arm7/lib/include/SND.h @@ -4,8 +4,6 @@ #include "nitro/types.h" void SND_Enable(void); -void SND_SetOutputSelector(u8 leftOutputFrom, u8 rightOutputFrom, u8 outputCh1ToMixer, u8 outputCh3ToMixer); -void SND_SetMasterVolume(u8 vol); -void SND_StopChannel(s32 idx, BOOL hold); +void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); #endif //GUARD_SND_H diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h index ea179968..8b74b579 100644 --- a/arm7/lib/include/SND_channel.h +++ b/arm7/lib/include/SND_channel.h @@ -5,6 +5,8 @@ #include "SND_exChannel.h" +void SNDi_SetSurroundDecay(int decay); + void SND_SetupChannelPcm( s32 chnIdx, const void *data, @@ -41,6 +43,8 @@ void SND_SetChannelVolume(s32 chnIdx, s32 volume, s32 volumeDiv); void SND_SetChannelPan(s32 chnIdx, s32 pan); void SND_SetChannelTimer(s32 chnIdx, s32 timer); +u32 SND_GetChannelControl(int idx); + // TODO move this function to SND_exChannel.c u16 CalcDecayCoeff(int value); diff --git a/arm7/lib/include/SND_command.h b/arm7/lib/include/SND_command.h index ea5452b9..c22cd459 100644 --- a/arm7/lib/include/SND_command.h +++ b/arm7/lib/include/SND_command.h @@ -1,6 +1,8 @@ #ifndef GUARD_SND_COMMAND_H #define GUARD_SND_COMMAND_H +#include "nitro/SND_command_shared.h" + void SND_CommandInit(void); void SND_CommandProc(void); diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index fcc3a548..038a1a49 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -22,6 +22,7 @@ BOOL SND_IsExChannelActive(struct SNDExChannel *chn); struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData); void SND_FreeExChannel(struct SNDExChannel *chn); BOOL SND_IsChannelActive(s32 idx); +void SND_InvalidateWave(const void *start, const void *end); // TODO internal functions, move these so exChannel int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h index eba3ff44..fc72ae33 100644 --- a/arm7/lib/include/SND_main.h +++ b/arm7/lib/include/SND_main.h @@ -12,5 +12,7 @@ u32 SND_WaitForIntervalTimer(void); void SND_SendWakeupMessage(void); void SNDi_LockMutex(void); void SNDi_UnlockMutex(void); +void SND_SetMasterVolume(int vol); +void SND_SetMasterPan(int pan); #endif //GUARD_SND_MAIN_H diff --git a/arm7/lib/include/SND_seq.h b/arm7/lib/include/SND_seq.h index 642cff3e..25b63a35 100644 --- a/arm7/lib/include/SND_seq.h +++ b/arm7/lib/include/SND_seq.h @@ -1,7 +1,24 @@ #ifndef GUARD_SND_SEQ_H #define GUARD_SND_SEQ_H +#include "nitro/types.h" + +#include "nitro/SND_bank_shared.h" + void SND_SeqInit(void); void SND_SeqMain(BOOL update); +void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bank); +void SND_StopSeq(int player); +void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bank); +void SND_StartPreparedSeq(int player); +void SND_PauseSeq(int player, BOOL pause); +void SND_SkipSeq(int player, u32 tick); +void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size); +void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size); +void SND_SetTrackMute(int player, u32 trackMask, BOOL mute); +void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask); +void SND_InvalidateSeq(const void *start, const void *end); +void SND_InvalidateBank(const void *start, const void *end); + #endif //GUARD_SND_SEQ_H diff --git a/arm7/lib/include/SND_wave.h b/arm7/lib/include/SND_wave.h index e1ae93fe..fd76b1a5 100644 --- a/arm7/lib/include/SND_wave.h +++ b/arm7/lib/include/SND_wave.h @@ -1,6 +1,6 @@ #ifndef GUARD_SND_WAVE_H #define GUARD_SND_WAVE_H -void SND_InvalidateWave(void *begin, void *end); +void SND_InvalidateWave(const void *begin, const void *end); #endif //GUARD_SND_WAVE_H diff --git a/arm7/lib/include/SND_work.h b/arm7/lib/include/SND_work.h index 49933fc7..0125a52d 100644 --- a/arm7/lib/include/SND_work.h +++ b/arm7/lib/include/SND_work.h @@ -6,8 +6,8 @@ extern struct SNDWork SNDi_Work; extern struct SNDSharedWork *SNDi_SharedWork; -void SND_SetPlayerLocalVariable(u32 player, u32 var, s16 value); -void SND_SetPlayerGlobalVariable(u32 var, s16 value); +void SND_SetPlayerLocalVariable(int player, int var, s16 value); +void SND_SetPlayerGlobalVariable(int var, s16 value); void SND_UpdateSharedWork(void); #endif //GUARD_SND_WORK_H diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c new file mode 100644 index 00000000..fc059c89 --- /dev/null +++ b/arm7/lib/src/SND_command.c @@ -0,0 +1,302 @@ +#include "SND_command.h" + +#include "registers.h" +#include "mmap.h" + +#include "MI_memory.h" +#include "PXI_fifo.h" +#include "OS_message.h" +#include "OS_system.h" +#include "SND.h" +#include "SND_alarm.h" +#include "SND_capture.h" +#include "SND_channel.h" +#include "SND_exChannel.h" +#include "SND_lockChannel.h" +#include "SND_main.h" +#include "SND_seq.h" +#include "SND_work.h" + +#define SND_MSG_ARRAY_SIZE 8 + +static OSMessage sMsgArray[SND_MSG_ARRAY_SIZE]; +static struct OSMessageQueue sMsgQueue; + +static void InitPXI(void); +static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused); +static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold); +static void SetChannelTimer(u32 channelMask, int timer); +static void SetChannelVolume(u32 channelMask, int vol, int shift); +static void SetChannelPan(u32 channelMask, int pan); +static void ReadDriverInfo(struct SNDDriverInfo *driverInfo); + +void SND_CommandInit(void) { + OS_InitMessageQueue(&sMsgQueue, sMsgArray, SND_MSG_ARRAY_SIZE); + InitPXI(); + SNDi_SharedWork = NULL; +} + +void SND_CommandProc(void) { + struct SNDCommand cmd; + struct SNDCommand *cmd_ptr; + OSMessage msg; + + while (OS_ReceiveMessage(&sMsgQueue, &msg, 0)) { + // casting it directly below doesn't appear to match + cmd_ptr = (struct SNDCommand *)msg; + + while (cmd_ptr) { + cmd = *cmd_ptr; + + switch (cmd.id) { + case SND_CMD_START_SEQ: + SND_StartSeq((int)cmd.arg[0], (const void *)cmd.arg[1], cmd.arg[2], (struct SNDBankData *)cmd.arg[3]); + break; + case SND_CMD_STOP_SEQ: + SND_StopSeq((int)cmd.arg[0]); + break; + case SND_CMD_PREPARE_SEQ: + SND_PrepareSeq((int)cmd.arg[0], (const void *)cmd.arg[1], cmd.arg[2], (struct SNDBankData *)cmd.arg[3]); + break; + case SND_CMD_START_PREPARED_SEQ: + SND_StartPreparedSeq((int)cmd.arg[0]); + break; + case SND_CMD_PAUSE_SEQ: + SND_PauseSeq((int)cmd.arg[0], (BOOL)cmd.arg[1]); + break; + case SND_CMD_SKIP_SEQ: + SND_SkipSeq((int)cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_PLAYER_PARAM: + SNDi_SetPlayerParam((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_TRACK_PARAM: + SNDi_SetTrackParam((int)cmd.arg[0] & 0xFFFFFF, cmd.arg[1], cmd.arg[2], cmd.arg[3], (u8)(cmd.arg[0] >> 24)); + break; + case SND_CMD_MUTE_TRACK: + SND_SetTrackMute((int)cmd.arg[0], cmd.arg[1], (BOOL)cmd.arg[2]); + break; + case SND_CMD_ALLOCATABLE_CHANNEL: + SND_SetTrackAllocatableChannel((int)cmd.arg[0], cmd.arg[1], cmd.arg[2]); + break; + case SND_CMD_PLAYER_LOCAL_VAR: + SND_SetPlayerLocalVariable((int)cmd.arg[0], (int)cmd.arg[1], (s16)cmd.arg[2]); + break; + case SND_CMD_PLAYER_GLOBAL_VAR: + SND_SetPlayerGlobalVariable((int)cmd.arg[0], (s16)cmd.arg[1]); + break; + case SND_CMD_START_TIMER: + StartTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_STOP_TIMER: + StopTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_SETUP_CAPTURE: + SND_SetupCapture( + (int)(cmd.arg[2] >> 31u) & 1, + (int)(cmd.arg[2] >> 30u) & 1, + (void *)cmd.arg[0], + (int)cmd.arg[1], + (BOOL)(cmd.arg[2] >> 29u) & 1, + (int)(cmd.arg[2] >> 28u) & 1, + (int)(cmd.arg[2] >> 27u) & 1 + ); + break; + case SND_CMD_SETUP_ALARM: + SND_SetupAlarm( + (int)cmd.arg[0], + cmd.arg[1], + cmd.arg[2], + cmd.arg[3] + ); + break; + case SND_CMD_CHANNEL_TIMER: + SetChannelTimer(cmd.arg[0], (int)cmd.arg[1]); + break; + case SND_CMD_CHANNEL_VOLUME: + SetChannelVolume(cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2]); + break; + case SND_CMD_CHANNEL_PAN: + SetChannelPan(cmd.arg[0], (int)cmd.arg[1]); + break; + case SND_CMD_SETUP_CHANNEL_PCM: + SND_SetupChannelPcm( + (int)cmd.arg[0] & 0xFFFF, + (void *)(cmd.arg[1] & 0x7FFFFFFu), + (int)(cmd.arg[3] >> 24u) & 0x3, + (int)(cmd.arg[3] >> 26u) & 0x3, + (int)cmd.arg[3] & 0xFFFF, + (int)cmd.arg[2] & 0x3FFFFF, + (int)(cmd.arg[2] >> 24u) & 0x7F, + (int)(cmd.arg[2] >> 22u) & 0x3, + (int)(cmd.arg[0] >> 16u) & 0xFFFF, + (int)(cmd.arg[3] >> 16u) & 0x7F + ); + break; + case SND_CMD_SETUP_CHANNEL_PSG: + SND_SetupChannelPsg( + (int)cmd.arg[0], + (int)cmd.arg[3], + (int)cmd.arg[1] & 0x7F, + (int)(cmd.arg[1] >> 8u) & 0x3, + (int)(cmd.arg[2] >> 8u) & 0xFFFF, + (int)cmd.arg[2] & 0x7F + ); + break; + case SND_CMD_SETUP_CHANNEL_NOISE: + SND_SetupChannelNoise( + (int)cmd.arg[0], + (int)cmd.arg[1] & 0x7F, + (int)(cmd.arg[1] >> 8u) & 0x3, + (int)(cmd.arg[2] >> 8u) & 0xFFFF, + (int)cmd.arg[2] & 0x7F + ); + break; + case SND_CMD_SURROUND_DECAY: + SNDi_SetSurroundDecay((int)cmd.arg[0]); + break; + case SND_CMD_MASTER_VOLUME: + SND_SetMasterVolume((int)cmd.arg[0]); + break; + case SND_CMD_MASTER_PAN: + SND_SetMasterPan((int)cmd.arg[0]); + break; + case SND_CMD_OUTPUT_SELECTOR: + SND_SetOutputSelector((int)cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_LOCK_CHANNEL: + SND_LockChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_UNLOCK_CHANNEL: + SND_UnlockChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_STOP_UNLOCKED_CHANNEL: + SND_StopUnlockedChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_SEQ: + SND_InvalidateSeq((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_BANK: + SND_InvalidateBank((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_WAVE: + SND_InvalidateWave((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_SET_SHARED_WORK: + SNDi_SharedWork = (struct SNDSharedWork *)cmd.arg[0]; + break; + case SND_CMD_READ_DRIVER_INFO: + ReadDriverInfo((struct SNDDriverInfo *)cmd.arg[0]); + break; + } // end switch + + cmd_ptr = cmd.llNext; + } // end loop over command linked list + + SNDi_SharedWork->finishedCommandTag++; + } // end loop over receive message +} + +static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL error) { + (void)tag; + (void)error; + + OSIntrMode intrMode = OS_DisableInterrupts(); + + if (data >= HW_MAIN_MEM) { + (void)OS_SendMessage(&sMsgQueue, (OSMessage)data, 0); + } else { + if (data == 0) + SND_SendWakeupMessage(); + } + + (void)OS_RestoreInterrupts(intrMode); +} + +static void InitPXI(void) { + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_SOUND, PxiFifoCallback); +} + +static void SetChannelTimer(u32 channelMask, int timer) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_SetChannelTimer(i, timer); + } +} + +static void SetChannelVolume(u32 channelMask, int vol, int shift) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_SetChannelVolume(i, vol, shift); + } +} + +static void SetChannelPan(u32 channelMask, int pan) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_SetChannelPan(i, pan); + } +} + +static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused) { + (void)unused; + + OSIntrMode intrMode = OS_DisableInterrupts(); + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + reg_SOUNDxCNT_STAT(i) |= 0x80; + } + + if (captureMask & 1) { + if (captureMask & 2) { + *(vu16 *)®_SNDCAPxCNT(0) |= 0x8080; + } else { + reg_SNDCAPxCNT(0) |= 0x80; + } + } else if (captureMask & 2) { + reg_SNDCAPxCNT(1) |= 0x80; + } + + for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) { + if (alarmMask & 1) + SND_StartAlarm(i); + } + + (void)OS_RestoreInterrupts(intrMode); + SND_UpdateSharedWork(); +} + +static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold) { + OSIntrMode intrMode = OS_DisableInterrupts(); + + for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) { + if (alarmMask & 1) + SND_StopAlarm(i); + } + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_StopChannel(i, hold); + } + + if (captureMask & 1) + reg_SNDCAPxCNT(0) = 0; + if (captureMask & 2) + reg_SNDCAPxCNT(1) = 0; + + (void)OS_RestoreInterrupts(intrMode); + SND_UpdateSharedWork(); +} + +static void ReadDriverInfo(struct SNDDriverInfo *driverInfo) { + MI_CpuCopy32(&SNDi_Work, driverInfo, sizeof(SNDi_Work)); + + driverInfo->workPtr = &SNDi_Work; + + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + driverInfo->channelControls[i] = SND_GetChannelControl(i); + } + + driverInfo->lockedChannels = SND_GetLockedChannel(0); +} diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c index 608ed67a..871cf716 100644 --- a/arm7/lib/src/SND_lockChannel.c +++ b/arm7/lib/src/SND_lockChannel.c @@ -2,7 +2,7 @@ #include "SND_work.h" #include "SND_exChannel.h" -#include "SND.h" +#include "SND_channel.h" // TODO make these vars static after merging this file with exChannel u32 sLockedChannelMask; diff --git a/arm7/lib/src/SND_wave.c b/arm7/lib/src/SND_wave.c index 75d84e5f..21c48dc8 100644 --- a/arm7/lib/src/SND_wave.c +++ b/arm7/lib/src/SND_wave.c @@ -1,9 +1,9 @@ #include "SND_wave.h" -#include "SND.h" +#include "SND_channel.h" #include "SND_work.h" -void SND_InvalidateWave(void *start, void *end) { +void SND_InvalidateWave(const void *start, const void *end) { for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) { struct SNDExChannel *chn = &SNDi_Work.channels[i]; diff --git a/arm7/lib/src/SND_work.c b/arm7/lib/src/SND_work.c index 4b23056d..3f0d10f0 100644 --- a/arm7/lib/src/SND_work.c +++ b/arm7/lib/src/SND_work.c @@ -6,11 +6,11 @@ struct SNDWork SNDi_Work; struct SNDSharedWork *SNDi_SharedWork; -void SND_SetPlayerLocalVariable(u32 player, u32 var, s16 value) { +void SND_SetPlayerLocalVariable(int player, int var, s16 value) { SNDi_SharedWork->players[player].localVars[var] = value; } -void SND_SetPlayerGlobalVariable(u32 var, s16 value) { +void SND_SetPlayerGlobalVariable(int var, s16 value) { SNDi_SharedWork->globalVars[var] = value; } diff --git a/arm9/lib/NitroSDK/include/SND_work.h b/arm9/lib/NitroSDK/include/SND_work.h index a8a3d62b..f3ed08c8 100644 --- a/arm9/lib/NitroSDK/include/SND_work.h +++ b/arm9/lib/NitroSDK/include/SND_work.h @@ -6,51 +6,6 @@ #include "SND_main.h" #include "nitro/SND_work_shared.h" -struct SNDDriverInfo { - struct SNDWork work; // 0x0000 - u32 channelControls[SND_CHANNEL_COUNT]; // 0x1180 - struct SNDWork *workPtr; // 0x11C0 - u32 lockedChannels; // 0x11C4 - u8 unk_XXX[24]; // 0x11C8 -}; // size = 0x11E0 - -struct SNDChannelInfo { - struct { - BOOL active : 1; - BOOL locked: 1; - } flags; // 0x0 - u16 volume; // 0x4 - u8 pan; // 0x6 - u8 unk_7; // 0x7 - s32 envStatus; // 0x8 -}; // size = 0xC - -struct SNDPlayerInfo { - struct { - BOOL active : 1; - BOOL paused : 1; - } flags; // 0x0 - u16 trackBitMask; // 0x4 - u16 tempo; // 0x6 - u8 volume; // 0x8 - u8 unk_9[3]; // 0x9 -}; // size = 0xC - -struct SNDTrackInfo { - u16 program; // 0x0 - u8 volume; // 0x2 - u8 expression; // 0x3 - - s8 pitchBend; // 0x4 - u8 bendRange; // 0x5 - u8 pan; // 0x6 - s8 transpose; // 0x7 - - u8 unk_8; // 0x8 - u8 chnCount; // 0x9 - u8 channel[SND_CHANNEL_COUNT]; // 0xA -}; // size = 0x1A - u32 SND_GetPlayerStatus(void); u16 SND_GetChannelStatus(void); //u16 SND_GetCaptureStatus(void); diff --git a/include/nitro/SND_work_shared.h b/include/nitro/SND_work_shared.h index 08eda013..02cc8bff 100644 --- a/include/nitro/SND_work_shared.h +++ b/include/nitro/SND_work_shared.h @@ -42,6 +42,51 @@ struct SNDSharedWork { s16 globalVars[16]; // 0x260 }; // size = 0x280 +struct SNDDriverInfo { + struct SNDWork work; // 0x0000 + u32 channelControls[SND_CHANNEL_COUNT]; // 0x1180 + struct SNDWork *workPtr; // 0x11C0 + u32 lockedChannels; // 0x11C4 + u8 unk_XXX[24]; // 0x11C8 +}; // size = 0x11E0 + +struct SNDChannelInfo { + struct { + BOOL active : 1; + BOOL locked: 1; + } flags; // 0x0 + u16 volume; // 0x4 + u8 pan; // 0x6 + u8 unk_7; // 0x7 + s32 envStatus; // 0x8 +}; // size = 0xC + +struct SNDPlayerInfo { + struct { + BOOL active : 1; + BOOL paused : 1; + } flags; // 0x0 + u16 trackBitMask; // 0x4 + u16 tempo; // 0x6 + u8 volume; // 0x8 + u8 unk_9[3]; // 0x9 +}; // size = 0xC + +struct SNDTrackInfo { + u16 program; // 0x0 + u8 volume; // 0x2 + u8 expression; // 0x3 + + s8 pitchBend; // 0x4 + u8 bendRange; // 0x5 + u8 pan; // 0x6 + s8 transpose; // 0x7 + + u8 unk_8; // 0x8 + u8 chnCount; // 0x9 + u8 channel[SND_CHANNEL_COUNT]; // 0xA +}; // size = 0x1A + extern struct SNDWork SNDi_Work; extern struct SNDSharedWork *SNDi_SharedWork; |