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