5 #include "mixer_defs.h"
8 #define LIKELY(x) __builtin_expect(!!(x), 1)
9 #define UNLIKELY(x) __builtin_expect(!!(x), 0)
12 #define UNLIKELY(x) (x)
15 #define REAL_MERGE2(a,b) a##b
16 #define MERGE2(a,b) REAL_MERGE2(a,b)
18 #define MixDirect_Hrtf MERGE2(MixDirect_Hrtf_,SUFFIX)
21 static inline void ApplyCoeffsStep(const ALuint irSize
,
22 ALfloat (*restrict Coeffs
)[2],
23 const ALfloat (*restrict CoeffStep
)[2]);
24 static inline void ApplyCoeffs(ALuint Offset
, ALfloat (*restrict Values
)[2],
26 ALfloat (*restrict Coeffs
)[2],
27 ALfloat left
, ALfloat right
);
30 void MixDirect_Hrtf(const DirectParams
*params
, const ALfloat
*restrict data
, ALuint srcchan
,
31 ALuint OutPos
, ALuint SamplesToDo
, ALuint BufferSize
)
33 ALfloat (*restrict DryBuffer
)[BUFFERSIZE
] = params
->OutBuffer
;
34 ALfloat
*restrict ClickRemoval
= params
->ClickRemoval
;
35 ALfloat
*restrict PendingClicks
= params
->PendingClicks
;
36 const ALuint IrSize
= params
->Hrtf
.Params
.IrSize
;
37 const ALint
*restrict DelayStep
= params
->Hrtf
.Params
.DelayStep
;
38 const ALfloat (*restrict CoeffStep
)[2] = params
->Hrtf
.Params
.CoeffStep
;
39 const ALfloat (*restrict TargetCoeffs
)[2] = params
->Hrtf
.Params
.Coeffs
[srcchan
];
40 const ALuint
*restrict TargetDelay
= params
->Hrtf
.Params
.Delay
[srcchan
];
41 ALfloat
*restrict History
= params
->Hrtf
.State
->History
[srcchan
];
42 ALfloat (*restrict Values
)[2] = params
->Hrtf
.State
->Values
[srcchan
];
43 ALint Counter
= maxu(params
->Hrtf
.State
->Counter
, OutPos
) - OutPos
;
44 ALuint Offset
= params
->Hrtf
.State
->Offset
+ OutPos
;
45 ALIGN(16) ALfloat Coeffs
[HRIR_LENGTH
][2];
52 for(c
= 0;c
< IrSize
;c
++)
54 Coeffs
[c
][0] = TargetCoeffs
[c
][0] - (CoeffStep
[c
][0]*Counter
);
55 Coeffs
[c
][1] = TargetCoeffs
[c
][1] - (CoeffStep
[c
][1]*Counter
);
58 Delay
[0] = TargetDelay
[0] - (DelayStep
[0]*Counter
);
59 Delay
[1] = TargetDelay
[1] - (DelayStep
[1]*Counter
);
61 if(LIKELY(OutPos
== 0))
63 History
[Offset
&SRC_HISTORY_MASK
] = data
[pos
];
64 left
= lerp(History
[(Offset
-(Delay
[0]>>HRTFDELAY_BITS
))&SRC_HISTORY_MASK
],
65 History
[(Offset
-(Delay
[0]>>HRTFDELAY_BITS
)-1)&SRC_HISTORY_MASK
],
66 (Delay
[0]&HRTFDELAY_MASK
)*(1.0f
/HRTFDELAY_FRACONE
));
67 right
= lerp(History
[(Offset
-(Delay
[1]>>HRTFDELAY_BITS
))&SRC_HISTORY_MASK
],
68 History
[(Offset
-(Delay
[1]>>HRTFDELAY_BITS
)-1)&SRC_HISTORY_MASK
],
69 (Delay
[1]&HRTFDELAY_MASK
)*(1.0f
/HRTFDELAY_FRACONE
));
71 ClickRemoval
[FrontLeft
] -= Values
[(Offset
+1)&HRIR_MASK
][0] +
73 ClickRemoval
[FrontRight
] -= Values
[(Offset
+1)&HRIR_MASK
][1] +
76 for(pos
= 0;pos
< BufferSize
&& Counter
> 0;pos
++)
78 History
[Offset
&SRC_HISTORY_MASK
] = data
[pos
];
79 left
= lerp(History
[(Offset
-(Delay
[0]>>HRTFDELAY_BITS
))&SRC_HISTORY_MASK
],
80 History
[(Offset
-(Delay
[0]>>HRTFDELAY_BITS
)-1)&SRC_HISTORY_MASK
],
81 (Delay
[0]&HRTFDELAY_MASK
)*(1.0f
/HRTFDELAY_FRACONE
));
82 right
= lerp(History
[(Offset
-(Delay
[1]>>HRTFDELAY_BITS
))&SRC_HISTORY_MASK
],
83 History
[(Offset
-(Delay
[1]>>HRTFDELAY_BITS
)-1)&SRC_HISTORY_MASK
],
84 (Delay
[1]&HRTFDELAY_MASK
)*(1.0f
/HRTFDELAY_FRACONE
));
86 Delay
[0] += DelayStep
[0];
87 Delay
[1] += DelayStep
[1];
89 Values
[(Offset
+IrSize
)&HRIR_MASK
][0] = 0.0f
;
90 Values
[(Offset
+IrSize
)&HRIR_MASK
][1] = 0.0f
;
93 ApplyCoeffs(Offset
, Values
, IrSize
, Coeffs
, left
, right
);
94 DryBuffer
[FrontLeft
][OutPos
] += Values
[Offset
&HRIR_MASK
][0];
95 DryBuffer
[FrontRight
][OutPos
] += Values
[Offset
&HRIR_MASK
][1];
96 ApplyCoeffsStep(IrSize
, Coeffs
, CoeffStep
);
102 Delay
[0] >>= HRTFDELAY_BITS
;
103 Delay
[1] >>= HRTFDELAY_BITS
;
104 for(;pos
< BufferSize
;pos
++)
106 History
[Offset
&SRC_HISTORY_MASK
] = data
[pos
];
107 left
= History
[(Offset
-Delay
[0])&SRC_HISTORY_MASK
];
108 right
= History
[(Offset
-Delay
[1])&SRC_HISTORY_MASK
];
110 Values
[(Offset
+IrSize
)&HRIR_MASK
][0] = 0.0f
;
111 Values
[(Offset
+IrSize
)&HRIR_MASK
][1] = 0.0f
;
114 ApplyCoeffs(Offset
, Values
, IrSize
, Coeffs
, left
, right
);
115 DryBuffer
[FrontLeft
][OutPos
] += Values
[Offset
&HRIR_MASK
][0];
116 DryBuffer
[FrontRight
][OutPos
] += Values
[Offset
&HRIR_MASK
][1];
120 if(LIKELY(OutPos
== SamplesToDo
))
122 History
[Offset
&SRC_HISTORY_MASK
] = data
[pos
];
123 left
= History
[(Offset
-Delay
[0])&SRC_HISTORY_MASK
];
124 right
= History
[(Offset
-Delay
[1])&SRC_HISTORY_MASK
];
126 PendingClicks
[FrontLeft
] += Values
[(Offset
+1)&HRIR_MASK
][0] +
128 PendingClicks
[FrontRight
] += Values
[(Offset
+1)&HRIR_MASK
][1] +
129 Coeffs
[0][1] * right
;
134 #undef MixDirect_Hrtf