7 #include "mixer_defs.h"
12 #define MAX_UPDATE_SAMPLES 128
15 static inline void ApplyCoeffs(ALsizei Offset
, ALfloat (*restrict Values
)[2],
17 const ALfloat (*restrict Coeffs
)[2],
18 ALfloat left
, ALfloat right
);
21 void MixHrtf(ALfloat
*restrict LeftOut
, ALfloat
*restrict RightOut
,
22 const ALfloat
*data
, ALsizei Offset
, ALsizei OutPos
,
23 const ALsizei IrSize
, MixHrtfParams
*hrtfparams
, HrtfState
*hrtfstate
,
26 const ALfloat (*Coeffs
)[2] = ASSUME_ALIGNED(hrtfparams
->Coeffs
, 16);
27 const ALsizei Delay
[2] = { hrtfparams
->Delay
[0], hrtfparams
->Delay
[1] };
28 ALfloat gainstep
= hrtfparams
->GainStep
;
29 ALfloat gain
= hrtfparams
->Gain
;
33 for(pos
= 0;pos
< BufferSize
;)
35 ALfloat out
[MAX_UPDATE_SAMPLES
][2];
36 ALsizei todo
= mini(BufferSize
-pos
, MAX_UPDATE_SAMPLES
);
38 for(i
= 0;i
< todo
;i
++)
40 hrtfstate
->History
[Offset
&HRTF_HISTORY_MASK
] = data
[pos
++];
41 left
= hrtfstate
->History
[(Offset
-Delay
[0])&HRTF_HISTORY_MASK
];
42 right
= hrtfstate
->History
[(Offset
-Delay
[1])&HRTF_HISTORY_MASK
];
44 hrtfstate
->Values
[(Offset
+IrSize
)&HRIR_MASK
][0] = 0.0f
;
45 hrtfstate
->Values
[(Offset
+IrSize
)&HRIR_MASK
][1] = 0.0f
;
48 ApplyCoeffs(Offset
, hrtfstate
->Values
, IrSize
, Coeffs
, left
, right
);
49 out
[i
][0] = hrtfstate
->Values
[Offset
&HRIR_MASK
][0]*gain
;
50 out
[i
][1] = hrtfstate
->Values
[Offset
&HRIR_MASK
][1]*gain
;
54 for(i
= 0;i
< todo
;i
++)
55 LeftOut
[OutPos
+i
] += out
[i
][0];
56 for(i
= 0;i
< todo
;i
++)
57 RightOut
[OutPos
+i
] += out
[i
][1];
60 hrtfparams
->Gain
= gain
;
63 void MixDirectHrtf(ALfloat
*restrict LeftOut
, ALfloat
*restrict RightOut
,
64 const ALfloat
*data
, ALsizei Offset
, const ALsizei IrSize
,
65 const ALfloat (*restrict Coeffs
)[2], ALfloat (*restrict Values
)[2],
68 ALfloat out
[MAX_UPDATE_SAMPLES
][2];
72 for(pos
= 0;pos
< BufferSize
;)
74 ALsizei todo
= mini(BufferSize
-pos
, MAX_UPDATE_SAMPLES
);
76 for(i
= 0;i
< todo
;i
++)
78 Values
[(Offset
+IrSize
)&HRIR_MASK
][0] = 0.0f
;
79 Values
[(Offset
+IrSize
)&HRIR_MASK
][1] = 0.0f
;
83 ApplyCoeffs(Offset
, Values
, IrSize
, Coeffs
, insample
, insample
);
84 out
[i
][0] = Values
[Offset
&HRIR_MASK
][0];
85 out
[i
][1] = Values
[Offset
&HRIR_MASK
][1];
88 for(i
= 0;i
< todo
;i
++)
89 LeftOut
[pos
+i
] += out
[i
][0];
90 for(i
= 0;i
< todo
;i
++)
91 RightOut
[pos
+i
] += out
[i
][1];