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