11#include "libspu2_internal.h"
13static void __attribute__((optimize(
"no-unroll-loops"))) _spu_wait_SpuRSetVoiceAttr(
void)
19 for ( i = 0; i < 2; i += 1 )
22 __asm__ __volatile__(
"" :
"+g"(v1) : :);
26int SpuRSetVoiceAttr(
int min_,
int max_,
SpuVoiceAttr *arg)
28 unsigned int attr_mask;
48 attr_mask = arg->mask;
51 attr_mask = 0xFFFFFFFF;
57 return SPU_INVALID_ARGS;
62 return SPU_INVALID_ARGS;
66 return SPU_INVALID_ARGS;
67 for ( i = min_; i < v8; i += 1 )
69 if ( (arg->voice & (1 << i)) != 0 )
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,
85 if ( (attr_mask & SPU_VOICE_VOLL) != 0 )
88 v14 = arg->volume.left & ~0x8000;
89 if ( (attr_mask & SPU_VOICE_VOLMODEL) != 0 )
91 switch ( arg->volmode.left )
93 case SPU_VOICE_LINEARIncN:
96 case SPU_VOICE_LINEARIncR:
99 case SPU_VOICE_LINEARDecN:
102 case SPU_VOICE_LINEARDecR:
105 case SPU_VOICE_EXPIncN:
108 case SPU_VOICE_EXPIncR:
111 case SPU_VOICE_EXPDec:
120 left = arg->volume.left;
131 _spu_RXX[512 * _spu_core + v11] = v14 | v13;
133 if ( (attr_mask & SPU_VOICE_VOLR) != 0 )
136 v17 = arg->volume.right & ~0x8000;
137 if ( (attr_mask & SPU_VOICE_VOLMODER) != 0 )
139 switch ( arg->volmode.right )
141 case SPU_VOICE_LINEARIncN:
144 case SPU_VOICE_LINEARIncR:
147 case SPU_VOICE_LINEARDecN:
150 case SPU_VOICE_LINEARDecR:
153 case SPU_VOICE_EXPIncN:
156 case SPU_VOICE_EXPIncR:
159 case SPU_VOICE_EXPDec:
168 right = arg->volume.right;
179 _spu_RXX[512 * _spu_core + 1 + v11] = v17 | v16;
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 )
195 if ( ((attr_mask & SPU_VOICE_ADSR_AMODE) != 0) && arg->a_mode == SPU_VOICE_EXPIncN )
197 _spu_RXX[512 * _spu_core + 3 + v11] =
198 (u8)_spu_RXX[512 * _spu_core + 3 + v11] | (u16)(((u16)ar | (u16)v20) << 8);
200 if ( (attr_mask & SPU_VOICE_ADSR_DR) != 0 )
205 _spu_RXX[512 * _spu_core + 3 + v11] = (_spu_RXX[512 * _spu_core + 3 + v11] & ~0xf0) | (16 * dr);
207 if ( (attr_mask & SPU_VOICE_ADSR_SR) != 0 )
213 if ( (attr_mask & SPU_VOICE_ADSR_SMODE) != 0 )
215 switch ( arg->s_mode )
217 case SPU_VOICE_LINEARIncN:
220 case SPU_VOICE_EXPIncN:
223 case SPU_VOICE_EXPDec:
230 _spu_RXX[512 * _spu_core + 4 + v11] =
231 (_spu_RXX[512 * _spu_core + 4 + v11] & 0x3F) | (((u16)sr | (u16)v23) << 6);
233 if ( (attr_mask & SPU_VOICE_ADSR_RR) != 0 )
239 if ( (attr_mask & SPU_VOICE_ADSR_RMODE) != 0 )
241 if ( arg->r_mode == SPU_VOICE_EXPDec )
244 _spu_RXX[512 * _spu_core + 4 + v11] = (_spu_RXX[512 * _spu_core + 4 + v11] & ~0x3f) | rr | v26;
246 if ( (attr_mask & SPU_VOICE_ADSR_SL) != 0 )
251 _spu_RXX[512 * _spu_core + 3 + v11] = (_spu_RXX[512 * _spu_core + 3 + v11] & ~0xF) | sl;
255 _spu_wait_SpuRSetVoiceAttr();