PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
sl_sva.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
13static void __attribute__((optimize("no-unroll-loops"))) _spu_wait_SpuLSetVoiceAttr(void)
14{
15 int i;
16 int v1;
17
18 v1 = 1;
19 for ( i = 0; i < 2; i += 1 )
20 {
21 v1 *= 13;
22 __asm__ __volatile__("" : "+g"(v1) : :);
23 }
24}
25
26void SpuLSetVoiceAttr(int num, SpuLVoiceAttr *arg_list)
27{
28 int v3;
29 unsigned int v9;
30 int v10;
31 s16 v11;
32 int v12;
33 int v13;
34 s16 v14;
35 int v15;
36 unsigned int v16;
37 s16 v17;
38 unsigned int v18;
39 unsigned int v19;
40 s16 v20;
41 unsigned int v22;
42 s16 v23;
43 unsigned int v25;
44
45 for ( v3 = 0; v3 < num; v3 += 1 )
46 {
47 int attr_mask;
48 int voiceNum;
49 int v7;
50 int v8;
51
52 attr_mask = arg_list[v3].attr.mask;
53 if ( attr_mask == 0 )
54 {
55 attr_mask = 0xFFFFFFFF;
56 }
57 voiceNum = arg_list[v3].voiceNum;
58 v7 = 8 * voiceNum;
59 v8 = 6 * voiceNum;
60 if ( (attr_mask & SPU_VOICE_PITCH) != 0 )
61 _spu_RXX[512 * _spu_core + 2 + v7] = arg_list[v3].attr.pitch;
62 if ( (attr_mask & SPU_VOICE_SAMPLE_NOTE) != 0 )
63 _spu_voice_centerNote[_spu_core][voiceNum] = arg_list[v3].attr.sample_note;
64 if ( (attr_mask & SPU_VOICE_NOTE) != 0 )
65 {
66 v9 = (u16)_spu_voice_centerNote[_spu_core][voiceNum];
67 _spu_RXX[512 * _spu_core + 2 + v7] =
68 _spu_note2pitch(v9 >> 8, (u8)v9, ((arg_list[v3].attr.note >> 8)) & 0xFF, (u8)arg_list[v3].attr.note);
69 }
70 if ( (attr_mask & SPU_VOICE_VOLL) != 0 )
71 {
72 v10 = 0;
73 v11 = arg_list[v3].attr.volume.left & ~0x8000;
74 if ( (attr_mask & SPU_VOICE_VOLMODEL) != 0 )
75 {
76 switch ( arg_list[v3].attr.volmode.left )
77 {
78 case SPU_VOICE_LINEARIncN:
79 v10 = 0x8000;
80 break;
81 case SPU_VOICE_LINEARIncR:
82 v10 = 0x9000;
83 break;
84 case SPU_VOICE_LINEARDecN:
85 v10 = 0xa000;
86 break;
87 case SPU_VOICE_LINEARDecR:
88 v10 = 0xb000;
89 break;
90 case SPU_VOICE_EXPIncN:
91 v10 = 0xc000;
92 break;
93 case SPU_VOICE_EXPIncR:
94 v10 = 0xd000;
95 break;
96 case SPU_VOICE_EXPDec:
97 v10 = 0xe000;
98 break;
99 default:
100 break;
101 }
102 }
103 if ( v10 )
104 {
105 v12 = (s16)arg_list[v3].attr.volume.left;
106 if ( v12 < 128 )
107 {
108 if ( v12 < 0 )
109 v11 = 0;
110 }
111 else
112 {
113 v11 = 127;
114 }
115 }
116 _spu_RXX[512 * _spu_core + v7] = v11 | v10;
117 }
118 if ( (attr_mask & SPU_VOICE_VOLR) != 0 )
119 {
120 v13 = 0;
121 v14 = arg_list[v3].attr.volume.right & ~0x8000;
122 if ( (attr_mask & SPU_VOICE_VOLMODER) != 0 )
123 {
124 switch ( arg_list[v3].attr.volmode.right )
125 {
126 case SPU_VOICE_LINEARIncN:
127 v13 = 0x8000;
128 break;
129 case SPU_VOICE_LINEARIncR:
130 v13 = 0x9000;
131 break;
132 case SPU_VOICE_LINEARDecN:
133 v13 = 0xa000;
134 break;
135 case SPU_VOICE_LINEARDecR:
136 v13 = 0xb000;
137 break;
138 case SPU_VOICE_EXPIncN:
139 v13 = 0xc000;
140 break;
141 case SPU_VOICE_EXPIncR:
142 v13 = 0xd000;
143 break;
144 case SPU_VOICE_EXPDec:
145 v13 = 0xe000;
146 break;
147 default:
148 break;
149 }
150 }
151 if ( v13 )
152 {
153 v15 = (s16)arg_list[v3].attr.volume.right;
154 if ( v15 < 128 )
155 {
156 if ( v15 < 0 )
157 v14 = 0;
158 }
159 else
160 {
161 v14 = 127;
162 }
163 }
164 _spu_RXX[512 * _spu_core + 1 + v7] = v14 | v13;
165 }
166 if ( (attr_mask & SPU_VOICE_WDSA) != 0 )
167 _spu_FsetRXX(v8 + 224, (arg_list[v3].attr.addr >> 4) << 4, 1);
168 if ( (attr_mask & SPU_VOICE_LSAX) != 0 )
169 _spu_FsetRXX(v8 + 226, (arg_list[v3].attr.loop_addr >> 4) << 4, 1);
170 if ( (attr_mask & SPU_VOICE_ADSR_ADSR1) != 0 )
171 _spu_RXX[512 * _spu_core + 3 + v7] = arg_list[v3].attr.adsr1;
172 if ( (attr_mask & SPU_VOICE_ADSR_ADSR2) != 0 )
173 _spu_RXX[512 * _spu_core + 4 + v7] = arg_list[v3].attr.adsr2;
174 if ( (attr_mask & SPU_VOICE_ADSR_AR) != 0 )
175 {
176 v16 = arg_list[v3].attr.ar;
177 if ( v16 >= 0x80 )
178 v16 = 127;
179 v17 = 0;
180 if ( ((attr_mask & SPU_VOICE_ADSR_AMODE) != 0) && arg_list[v3].attr.a_mode == SPU_VOICE_EXPIncN )
181 v17 = 128;
182 _spu_RXX[512 * _spu_core + 3 + v7] = (u8)_spu_RXX[512 * _spu_core + 3 + v7] | (u16)(((u16)v16 | (u16)v17) << 8);
183 }
184 if ( (attr_mask & SPU_VOICE_ADSR_DR) != 0 )
185 {
186 v18 = arg_list[v3].attr.dr;
187 if ( v18 >= 0x10 )
188 v18 = 15;
189 _spu_RXX[512 * _spu_core + 3 + v7] = (_spu_RXX[512 * _spu_core + 3 + v7] & ~0xf0) | (16 * v18);
190 }
191 if ( (attr_mask & SPU_VOICE_ADSR_SR) != 0 )
192 {
193 v19 = arg_list[v3].attr.sr;
194 if ( v19 >= 0x80 )
195 v19 = 127;
196 v20 = 256;
197 if ( (attr_mask & SPU_VOICE_ADSR_SMODE) != 0 )
198 {
199 switch ( arg_list[v3].attr.s_mode )
200 {
201 case SPU_VOICE_LINEARIncN:
202 v20 = 0;
203 break;
204 case SPU_VOICE_EXPIncN:
205 v20 = 512;
206 break;
207 case SPU_VOICE_EXPDec:
208 v20 = 768;
209 break;
210 default:
211 break;
212 }
213 }
214 _spu_RXX[512 * _spu_core + 4 + v7] = (_spu_RXX[512 * _spu_core + 4 + v7] & 0x3F) | (((u16)v19 | (u16)v20) << 6);
215 }
216 if ( (attr_mask & SPU_VOICE_ADSR_RR) != 0 )
217 {
218 v22 = arg_list[v3].attr.rr;
219 if ( v22 >= 0x20 )
220 v22 = 31;
221 v23 = 0;
222 if ( (attr_mask & SPU_VOICE_ADSR_RMODE) != 0 )
223 {
224 if ( arg_list[v3].attr.r_mode == SPU_VOICE_EXPDec )
225 v23 = 32;
226 }
227 _spu_RXX[512 * _spu_core + 4 + v7] = (_spu_RXX[512 * _spu_core + 4 + v7] & ~0x3f) | v22 | v23;
228 }
229 if ( (attr_mask & SPU_VOICE_ADSR_SL) != 0 )
230 {
231 v25 = arg_list[v3].attr.sl;
232 if ( v25 >= 0x10 )
233 v25 = 15;
234 _spu_RXX[512 * _spu_core + 3 + v7] = (_spu_RXX[512 * _spu_core + 3 + v7] & ~0xF) | v25;
235 }
236 }
237 _spu_wait_SpuLSetVoiceAttr();
238}
typedef __attribute__
Definition tlbfunc.c:60