11#include "libspu2_internal.h"
13static void __attribute__((optimize(
"no-unroll-loops"))) _spu_wait_SpuNSetVoiceAttr(
void)
19 for ( i = 0; i < 2; i += 1 )
22 __asm__ __volatile__(
"" :
"+g"(v1) : :);
29 unsigned int attr_mask;
33 attr_mask = arg->mask;
36 attr_mask = 0xFFFFFFFF;
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,
49 if ( (attr_mask & SPU_VOICE_VOLL) != 0 )
55 v7 = arg->volume.left & ~0x8000;
56 if ( (attr_mask & SPU_VOICE_VOLMODEL) != 0 )
58 switch ( arg->volmode.left )
60 case SPU_VOICE_LINEARIncN:
63 case SPU_VOICE_LINEARIncR:
66 case SPU_VOICE_LINEARDecN:
69 case SPU_VOICE_LINEARDecR:
72 case SPU_VOICE_EXPIncN:
75 case SPU_VOICE_EXPIncR:
78 case SPU_VOICE_EXPDec:
89 left = arg->volume.left;
100 _spu_RXX[512 * _spu_core + v3] = v7 | v6;
102 if ( (attr_mask & SPU_VOICE_VOLR) != 0 )
108 v10 = arg->volume.right & ~0x8000;
109 if ( (attr_mask & SPU_VOICE_VOLMODER) != 0 )
111 switch ( arg->volmode.right )
113 case SPU_VOICE_LINEARIncN:
116 case SPU_VOICE_LINEARIncR:
119 case SPU_VOICE_LINEARDecN:
122 case SPU_VOICE_LINEARDecR:
125 case SPU_VOICE_EXPIncN:
128 case SPU_VOICE_EXPIncR:
131 case SPU_VOICE_EXPDec:
142 right = arg->volume.right;
153 _spu_RXX[512 * _spu_core + 1 + v3] = v10 | v9;
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 )
172 if ( ((attr_mask & SPU_VOICE_ADSR_AMODE) != 0) && arg->a_mode == SPU_VOICE_EXPIncN )
174 _spu_RXX[512 * _spu_core + 3 + v3] = (u8)_spu_RXX[512 * _spu_core + 3 + v3] | (u16)(((u16)ar | (u16)v13) << 8);
176 if ( (attr_mask & SPU_VOICE_ADSR_DR) != 0 )
183 _spu_RXX[512 * _spu_core + 3 + v3] = (_spu_RXX[512 * _spu_core + 3 + v3] & ~0xf0) | (16 * dr);
185 if ( (attr_mask & SPU_VOICE_ADSR_SR) != 0 )
194 if ( (attr_mask & SPU_VOICE_ADSR_SMODE) != 0 )
196 switch ( arg->s_mode )
198 case SPU_VOICE_LINEARIncN:
201 case SPU_VOICE_EXPIncN:
204 case SPU_VOICE_EXPDec:
211 _spu_RXX[512 * _spu_core + 4 + v3] = (_spu_RXX[512 * _spu_core + 4 + v3] & 0x3F) | (((u16)sr | (u16)v16) << 6);
213 if ( (attr_mask & SPU_VOICE_ADSR_RR) != 0 )
222 if ( (attr_mask & SPU_VOICE_ADSR_RMODE) != 0 )
224 if ( arg->r_mode == SPU_VOICE_EXPDec )
227 _spu_RXX[512 * _spu_core + 4 + v3] = (_spu_RXX[512 * _spu_core + 4 + v3] & ~0x3f) | rr | v19;
229 if ( (attr_mask & SPU_VOICE_ADSR_SL) != 0 )
236 _spu_RXX[512 * _spu_core + 3 + v3] = (_spu_RXX[512 * _spu_core + 3 + v3] & ~0xF) | sl;
238 _spu_wait_SpuNSetVoiceAttr();