summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Panzlaff <michael.panzlaff@fau.de>2021-07-08 15:28:40 +0200
committerMichael Panzlaff <michael.panzlaff@fau.de>2021-08-25 18:03:48 +0200
commit4fbf785bbdfee9be474724caf8b804b0544d0f79 (patch)
tree67ad61cd0d2b1f681cbb7090886f99abb1fdc988
parent6e37656a84a76cd315b870a8002e2fec0fa0f00e (diff)
arm7: decompile SND_command
-rw-r--r--arm7/asm/SND_command.s639
-rw-r--r--arm7/lib/include/SND.h4
-rw-r--r--arm7/lib/include/SND_channel.h4
-rw-r--r--arm7/lib/include/SND_command.h2
-rw-r--r--arm7/lib/include/SND_exChannel.h1
-rw-r--r--arm7/lib/include/SND_main.h2
-rw-r--r--arm7/lib/include/SND_seq.h17
-rw-r--r--arm7/lib/include/SND_wave.h2
-rw-r--r--arm7/lib/include/SND_work.h4
-rw-r--r--arm7/lib/src/SND_command.c302
-rw-r--r--arm7/lib/src/SND_lockChannel.c2
-rw-r--r--arm7/lib/src/SND_wave.c4
-rw-r--r--arm7/lib/src/SND_work.c4
-rw-r--r--arm9/lib/NitroSDK/include/SND_work.h45
-rw-r--r--include/nitro/SND_work_shared.h45
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 *)&reg_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;