PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
sn_gva.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include "libspu2_internal.h"
12
13void SpuNGetVoiceAttr(int v_num, SpuVoiceAttr *arg)
14{
15 s16 v3;
16 int v4;
17 const vu16 *v5;
18 u16 v6;
19 u16 v7;
20 s16 v10;
21 const vu16 *v14;
22 int v15;
23 const vu16 *v19;
24 unsigned int v20;
25 unsigned int v21;
26 int v22;
27 int v24;
28 int v25;
29
30 v3 = 0;
31 v4 = 8 * v_num;
32 v5 = &_spu_RXX[512 * _spu_core + 8 * v_num];
33 v6 = *v5;
34 v7 = v5[1];
35 if ( (v6 & 0x8000) != 0 )
36 {
37 switch ( v6 & 0xF000 )
38 {
39 case 0x8000:
40 v3 = SPU_VOICE_LINEARIncN;
41 break;
42 case 0x9000:
43 v3 = SPU_VOICE_LINEARIncR;
44 break;
45 case 0xa000:
46 v3 = SPU_VOICE_LINEARDecN;
47 break;
48 case 0xb000:
49 v3 = SPU_VOICE_LINEARDecR;
50 break;
51 case 0xc000:
52 v3 = SPU_VOICE_EXPIncN;
53 break;
54 case 0xd000:
55 v3 = SPU_VOICE_EXPIncR;
56 break;
57 case 0xe000:
58 case 0xf000:
59 v3 = SPU_VOICE_EXPDec;
60 break;
61 default:
62 break;
63 }
64 v6 &= ~0xF000;
65 }
66 v10 = 0;
67 if ( (v7 & 0x8000) != 0 )
68 {
69 switch ( v7 & 0xF000 )
70 {
71 case 0x8000:
72 v10 = SPU_VOICE_LINEARIncN;
73 break;
74 case 0x9000:
75 v10 = SPU_VOICE_LINEARIncR;
76 break;
77 case 0xa000:
78 v10 = SPU_VOICE_LINEARDecN;
79 break;
80 case 0xb000:
81 v10 = SPU_VOICE_LINEARDecR;
82 break;
83 case 0xc000:
84 v10 = SPU_VOICE_EXPIncN;
85 break;
86 case 0xd000:
87 v10 = SPU_VOICE_EXPIncR;
88 break;
89 case 0xe000:
90 case 0xf000:
91 v10 = SPU_VOICE_EXPDec;
92 break;
93 default:
94 break;
95 }
96 v7 &= ~0xF000;
97 }
98 if ( v6 < 0x4000u )
99 arg->volume.left = v6;
100 else
101 arg->volume.left = v6 + 0x8000;
102 if ( v7 < 0x4000u )
103 arg->volume.right = v7;
104 else
105 arg->volume.right = v7 + 0x8000;
106 arg->volmode.left = v3;
107 arg->volmode.right = v10;
108 v14 = &_spu_RXX[512 * _spu_core + v4];
109 arg->volumex.left = v14[6];
110 arg->volumex.right = v14[7];
111 arg->pitch = v14[2];
112 v15 = _spu_pitch2note(
113 (_spu_voice_centerNote[_spu_core][v_num] >> 8) & 0xFF, (u8)_spu_voice_centerNote[_spu_core][v_num], arg->pitch);
114 if ( v15 < 0 )
115 arg->note = 0;
116 else
117 arg->note = v15;
118 arg->sample_note = _spu_voice_centerNote[_spu_core][v_num];
119 arg->envx = _spu_RXX[512 * _spu_core + v4 + 5];
120 arg->addr = _spu_MGFgetRXX2(224);
121 arg->loop_addr = _spu_MGFgetRXX2(226);
122 v19 = &_spu_RXX[512 * _spu_core + v4];
123 v20 = v19[3];
124 v21 = v19[4];
125 v22 = SPU_VOICE_EXPIncN;
126 if ( (v20 & 0x8000) == 0 )
127 v22 = SPU_VOICE_LINEARIncN;
128 arg->a_mode = v22;
129 switch ( v21 & 0xE000 )
130 {
131 case 0xc000:
132 v24 = SPU_VOICE_EXPDec;
133 break;
134 case 0x8000:
135 v24 = SPU_VOICE_EXPIncN;
136 break;
137 case 0x4000:
138 v24 = SPU_VOICE_LINEARDecN;
139 break;
140 default:
141 v24 = SPU_VOICE_LINEARIncN;
142 break;
143 }
144 arg->s_mode = v24;
145 v25 = SPU_VOICE_EXPDec;
146 if ( (v21 & 0x20) == 0 )
147 v25 = SPU_VOICE_LINEARDecN;
148 arg->r_mode = v25;
149 arg->ar = (v20 >> 8) & 0x3F;
150 arg->dr = (u8)(v20 & 0xF0) >> 4;
151 arg->sr = (v21 >> 6) & 0x7F;
152 arg->rr = v21 & 0x1F;
153 arg->sl = v20 & 0xF;
154 arg->adsr1 = v20;
155 arg->adsr2 = v21;
156}