11#include "libspu2_internal.h"
13static void __attribute__((optimize(
"no-unroll-loops"))) _spu_wait_SpuLSetVoiceAttr(
void)
19 for ( i = 0; i < 2; i += 1 )
22 __asm__ __volatile__(
"" :
"+g"(v1) : :);
45 for ( v3 = 0; v3 < num; v3 += 1 )
52 attr_mask = arg_list[v3].attr.mask;
55 attr_mask = 0xFFFFFFFF;
57 voiceNum = arg_list[v3].voiceNum;
60 if ( (attr_mask & SPU_VOICE_PITCH) != 0 )
61 _spu_RXX[512 * _spu_core + 2 + v7] = arg_list[v3].attr.pitch;
62 if ( (attr_mask & SPU_VOICE_SAMPLE_NOTE) != 0 )
63 _spu_voice_centerNote[_spu_core][voiceNum] = arg_list[v3].attr.sample_note;
64 if ( (attr_mask & SPU_VOICE_NOTE) != 0 )
66 v9 = (u16)_spu_voice_centerNote[_spu_core][voiceNum];
67 _spu_RXX[512 * _spu_core + 2 + v7] =
68 _spu_note2pitch(v9 >> 8, (u8)v9, ((arg_list[v3].attr.note >> 8)) & 0xFF, (u8)arg_list[v3].attr.note);
70 if ( (attr_mask & SPU_VOICE_VOLL) != 0 )
73 v11 = arg_list[v3].attr.volume.left & ~0x8000;
74 if ( (attr_mask & SPU_VOICE_VOLMODEL) != 0 )
76 switch ( arg_list[v3].attr.volmode.left )
78 case SPU_VOICE_LINEARIncN:
81 case SPU_VOICE_LINEARIncR:
84 case SPU_VOICE_LINEARDecN:
87 case SPU_VOICE_LINEARDecR:
90 case SPU_VOICE_EXPIncN:
93 case SPU_VOICE_EXPIncR:
96 case SPU_VOICE_EXPDec:
105 v12 = (s16)arg_list[v3].attr.volume.left;
116 _spu_RXX[512 * _spu_core + v7] = v11 | v10;
118 if ( (attr_mask & SPU_VOICE_VOLR) != 0 )
121 v14 = arg_list[v3].attr.volume.right & ~0x8000;
122 if ( (attr_mask & SPU_VOICE_VOLMODER) != 0 )
124 switch ( arg_list[v3].attr.volmode.right )
126 case SPU_VOICE_LINEARIncN:
129 case SPU_VOICE_LINEARIncR:
132 case SPU_VOICE_LINEARDecN:
135 case SPU_VOICE_LINEARDecR:
138 case SPU_VOICE_EXPIncN:
141 case SPU_VOICE_EXPIncR:
144 case SPU_VOICE_EXPDec:
153 v15 = (s16)arg_list[v3].attr.volume.right;
164 _spu_RXX[512 * _spu_core + 1 + v7] = v14 | v13;
166 if ( (attr_mask & SPU_VOICE_WDSA) != 0 )
167 _spu_FsetRXX(v8 + 224, (arg_list[v3].attr.addr >> 4) << 4, 1);
168 if ( (attr_mask & SPU_VOICE_LSAX) != 0 )
169 _spu_FsetRXX(v8 + 226, (arg_list[v3].attr.loop_addr >> 4) << 4, 1);
170 if ( (attr_mask & SPU_VOICE_ADSR_ADSR1) != 0 )
171 _spu_RXX[512 * _spu_core + 3 + v7] = arg_list[v3].attr.adsr1;
172 if ( (attr_mask & SPU_VOICE_ADSR_ADSR2) != 0 )
173 _spu_RXX[512 * _spu_core + 4 + v7] = arg_list[v3].attr.adsr2;
174 if ( (attr_mask & SPU_VOICE_ADSR_AR) != 0 )
176 v16 = arg_list[v3].attr.ar;
180 if ( ((attr_mask & SPU_VOICE_ADSR_AMODE) != 0) && arg_list[v3].attr.a_mode == SPU_VOICE_EXPIncN )
182 _spu_RXX[512 * _spu_core + 3 + v7] = (u8)_spu_RXX[512 * _spu_core + 3 + v7] | (u16)(((u16)v16 | (u16)v17) << 8);
184 if ( (attr_mask & SPU_VOICE_ADSR_DR) != 0 )
186 v18 = arg_list[v3].attr.dr;
189 _spu_RXX[512 * _spu_core + 3 + v7] = (_spu_RXX[512 * _spu_core + 3 + v7] & ~0xf0) | (16 * v18);
191 if ( (attr_mask & SPU_VOICE_ADSR_SR) != 0 )
193 v19 = arg_list[v3].attr.sr;
197 if ( (attr_mask & SPU_VOICE_ADSR_SMODE) != 0 )
199 switch ( arg_list[v3].attr.s_mode )
201 case SPU_VOICE_LINEARIncN:
204 case SPU_VOICE_EXPIncN:
207 case SPU_VOICE_EXPDec:
214 _spu_RXX[512 * _spu_core + 4 + v7] = (_spu_RXX[512 * _spu_core + 4 + v7] & 0x3F) | (((u16)v19 | (u16)v20) << 6);
216 if ( (attr_mask & SPU_VOICE_ADSR_RR) != 0 )
218 v22 = arg_list[v3].attr.rr;
222 if ( (attr_mask & SPU_VOICE_ADSR_RMODE) != 0 )
224 if ( arg_list[v3].attr.r_mode == SPU_VOICE_EXPDec )
227 _spu_RXX[512 * _spu_core + 4 + v7] = (_spu_RXX[512 * _spu_core + 4 + v7] & ~0x3f) | v22 | v23;
229 if ( (attr_mask & SPU_VOICE_ADSR_SL) != 0 )
231 v25 = arg_list[v3].attr.sl;
234 _spu_RXX[512 * _spu_core + 3 + v7] = (_spu_RXX[512 * _spu_core + 3 + v7] & ~0xF) | v25;
237 _spu_wait_SpuLSetVoiceAttr();