PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
s_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 SpuGetVoiceAttr(SpuVoiceAttr *arg)
14{
15 int v2;
16 int v3;
17 int v6;
18 const vu16 *v7;
19 u16 v8;
20 u16 v9;
21 s16 v10;
22 s16 v12;
23 const vu16 *v16;
24 const vu16 *v21;
25
26 v2 = -1;
27 for ( v3 = 0; v3 < 24; v3 += 1 )
28 {
29 if ( (arg->voice & (1 << v3)) != 0 )
30 {
31 v2 = v3;
32 break;
33 }
34 }
35 v6 = 8 * v2;
36 if ( v2 != -1 )
37 {
38 int v17;
39 unsigned int v22;
40 unsigned int v23;
41 int v24;
42 int v26;
43 int v27;
44
45 v7 = &_spu_RXX[512 * _spu_core + v6];
46 v8 = *v7;
47 v9 = v7[1];
48 v10 = 0;
49 if ( (v8 & 0x8000) != 0 )
50 {
51 switch ( v8 & 0xF000 )
52 {
53 case 0x8000:
54 v10 = SPU_VOICE_LINEARIncN;
55 break;
56 case 0x9000:
57 v10 = SPU_VOICE_LINEARIncR;
58 break;
59 case 0xa000:
60 v10 = SPU_VOICE_LINEARDecN;
61 break;
62 case 0xb000:
63 v10 = SPU_VOICE_LINEARDecR;
64 break;
65 case 0xc000:
66 v10 = SPU_VOICE_EXPIncN;
67 break;
68 case 0xd000:
69 v10 = SPU_VOICE_EXPIncR;
70 break;
71 case 0xe000:
72 case 0xf000:
73 v10 = SPU_VOICE_EXPDec;
74 break;
75 default:
76 break;
77 }
78 v8 &= ~0xF000;
79 }
80 v12 = 0;
81 if ( (v9 & 0x8000) != 0 )
82 {
83 switch ( v9 & 0xF000 )
84 {
85 case 0x8000:
86 v12 = SPU_VOICE_LINEARIncN;
87 break;
88 case 0x9000:
89 v12 = SPU_VOICE_LINEARIncR;
90 break;
91 case 0xa000:
92 v12 = SPU_VOICE_LINEARDecN;
93 break;
94 case 0xb000:
95 v12 = SPU_VOICE_LINEARDecR;
96 break;
97 case 0xc000:
98 v12 = SPU_VOICE_EXPIncN;
99 break;
100 case 0xd000:
101 v12 = SPU_VOICE_EXPIncR;
102 break;
103 case 0xe000:
104 case 0xf000:
105 v12 = SPU_VOICE_EXPDec;
106 break;
107 default:
108 break;
109 }
110 v9 &= ~0xF000;
111 }
112 if ( v8 < 0x4000u )
113 arg->volume.left = v8;
114 else
115 arg->volume.left = v8 + 0x8000;
116 if ( v9 < 0x4000u )
117 arg->volume.right = v9;
118 else
119 arg->volume.right = v9 + 0x8000;
120 arg->volmode.left = v10;
121 arg->volmode.right = v12;
122 v16 = &_spu_RXX[512 * _spu_core + v6];
123 arg->volumex.left = v16[6];
124 arg->volumex.right = v16[7];
125 arg->pitch = v16[2];
126 v17 = _spu_pitch2note(
127 (_spu_voice_centerNote[_spu_core][v2] >> 8) & 0xFF, (u8)_spu_voice_centerNote[_spu_core][v2], arg->pitch);
128 if ( v17 < 0 )
129 arg->note = 0;
130 else
131 arg->note = v17;
132 arg->sample_note = _spu_voice_centerNote[_spu_core][v2];
133 arg->envx = _spu_RXX[512 * _spu_core + v6 + 5];
134 arg->addr = _spu_MGFgetRXX2(224);
135 arg->loop_addr = _spu_MGFgetRXX2(226);
136 v21 = &_spu_RXX[512 * _spu_core + v6];
137 v22 = v21[3];
138 v23 = v21[4];
139 v24 = SPU_VOICE_EXPIncN;
140 if ( (v22 & 0x8000) == 0 )
141 v24 = SPU_VOICE_LINEARIncN;
142 arg->a_mode = v24;
143 switch ( v23 & 0xE000 )
144 {
145 case 0xc000:
146 v26 = SPU_VOICE_EXPDec;
147 break;
148 case 0x8000:
149 v26 = SPU_VOICE_EXPIncN;
150 break;
151 case 0x4000:
152 v26 = SPU_VOICE_LINEARDecN;
153 break;
154 default:
155 v26 = SPU_VOICE_LINEARIncN;
156 break;
157 }
158 arg->s_mode = v26;
159 v27 = SPU_VOICE_EXPDec;
160 if ( (v23 & 0x20) == 0 )
161 v27 = SPU_VOICE_LINEARDecN;
162 arg->r_mode = v27;
163 arg->ar = (v22 >> 8) & 0x3F;
164 arg->dr = (u8)(v22 & 0xF0) >> 4;
165 arg->sr = (v23 >> 6) & 0x7F;
166 arg->rr = v23 & 0x1F;
167 arg->sl = v22 & 0xF;
168 arg->adsr1 = v22;
169 arg->adsr2 = v23;
170 }
171}