7 #include "mixer_defs.h"
11 #define REAL_MERGE2(a,b) a##b
12 #define MERGE2(a,b) REAL_MERGE2(a,b)
14 #define MixDirect_Hrtf MERGE2(MixDirect_Hrtf_,SUFFIX)
17 static inline void ApplyCoeffsStep(ALuint Offset
, ALfloat (*restrict Values
)[2],
19 ALfloat (*restrict Coeffs
)[2],
20 const ALfloat (*restrict CoeffStep
)[2],
21 ALfloat left
, ALfloat right
);
22 static inline void ApplyCoeffs(ALuint Offset
, ALfloat (*restrict Values
)[2],
24 ALfloat (*restrict Coeffs
)[2],
25 ALfloat left
, ALfloat right
);
28 void MixDirect_Hrtf(DirectParams
*params
, const ALfloat
*restrict data
, ALuint srcchan
,
29 ALuint OutPos
, ALuint BufferSize
)
31 ALfloat (*restrict DryBuffer
)[BUFFERSIZE
] = params
->OutBuffer
;
32 const ALuint IrSize
= params
->Mix
.Hrtf
.IrSize
;
33 const HrtfParams
*hrtfparams
= ¶ms
->Mix
.Hrtf
.Params
[srcchan
];
34 HrtfState
*hrtfstate
= ¶ms
->Mix
.Hrtf
.State
[srcchan
];
35 ALuint Counter
= maxu(params
->Counter
, OutPos
) - OutPos
;
36 ALuint Offset
= params
->Offset
+ OutPos
;
37 alignas(16) ALfloat Coeffs
[HRIR_LENGTH
][2];
43 for(c
= 0;c
< IrSize
;c
++)
45 Coeffs
[c
][0] = hrtfparams
->Coeffs
[c
][0] - (hrtfparams
->CoeffStep
[c
][0]*Counter
);
46 Coeffs
[c
][1] = hrtfparams
->Coeffs
[c
][1] - (hrtfparams
->CoeffStep
[c
][1]*Counter
);
48 Delay
[0] = hrtfparams
->Delay
[0] - (hrtfparams
->DelayStep
[0]*Counter
);
49 Delay
[1] = hrtfparams
->Delay
[1] - (hrtfparams
->DelayStep
[1]*Counter
);
51 for(pos
= 0;pos
< BufferSize
&& pos
< Counter
;pos
++)
53 hrtfstate
->History
[Offset
&SRC_HISTORY_MASK
] = data
[pos
];
54 left
= lerp(hrtfstate
->History
[(Offset
-(Delay
[0]>>HRTFDELAY_BITS
))&SRC_HISTORY_MASK
],
55 hrtfstate
->History
[(Offset
-(Delay
[0]>>HRTFDELAY_BITS
)-1)&SRC_HISTORY_MASK
],
56 (Delay
[0]&HRTFDELAY_MASK
)*(1.0f
/HRTFDELAY_FRACONE
));
57 right
= lerp(hrtfstate
->History
[(Offset
-(Delay
[1]>>HRTFDELAY_BITS
))&SRC_HISTORY_MASK
],
58 hrtfstate
->History
[(Offset
-(Delay
[1]>>HRTFDELAY_BITS
)-1)&SRC_HISTORY_MASK
],
59 (Delay
[1]&HRTFDELAY_MASK
)*(1.0f
/HRTFDELAY_FRACONE
));
61 Delay
[0] += hrtfparams
->DelayStep
[0];
62 Delay
[1] += hrtfparams
->DelayStep
[1];
64 hrtfstate
->Values
[(Offset
+IrSize
)&HRIR_MASK
][0] = 0.0f
;
65 hrtfstate
->Values
[(Offset
+IrSize
)&HRIR_MASK
][1] = 0.0f
;
68 ApplyCoeffsStep(Offset
, hrtfstate
->Values
, IrSize
, Coeffs
, hrtfparams
->CoeffStep
, left
, right
);
69 DryBuffer
[FrontLeft
][OutPos
] += hrtfstate
->Values
[Offset
&HRIR_MASK
][0];
70 DryBuffer
[FrontRight
][OutPos
] += hrtfstate
->Values
[Offset
&HRIR_MASK
][1];
74 Delay
[0] >>= HRTFDELAY_BITS
;
75 Delay
[1] >>= HRTFDELAY_BITS
;
76 for(;pos
< BufferSize
;pos
++)
78 hrtfstate
->History
[Offset
&SRC_HISTORY_MASK
] = data
[pos
];
79 left
= hrtfstate
->History
[(Offset
-Delay
[0])&SRC_HISTORY_MASK
];
80 right
= hrtfstate
->History
[(Offset
-Delay
[1])&SRC_HISTORY_MASK
];
82 hrtfstate
->Values
[(Offset
+IrSize
)&HRIR_MASK
][0] = 0.0f
;
83 hrtfstate
->Values
[(Offset
+IrSize
)&HRIR_MASK
][1] = 0.0f
;
86 ApplyCoeffs(Offset
, hrtfstate
->Values
, IrSize
, Coeffs
, left
, right
);
87 DryBuffer
[FrontLeft
][OutPos
] += hrtfstate
->Values
[Offset
&HRIR_MASK
][0];
88 DryBuffer
[FrontRight
][OutPos
] += hrtfstate
->Values
[Offset
&HRIR_MASK
][1];