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