PS2SDK
PS2 Homebrew Libraries
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 
13 static 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 
26 void 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 }
__attribute__
typedef __attribute__
Definition: tlbfunc.c:60
SpuVoiceAttr_
Definition: libspu2.h:241