Shorten a warning
[openal-soft.git] / Alc / mixer_inc.c
bloba7332714014b5ed465f6c241b9e11f6c50812cbb
1 #include "config.h"
3 #include "AL/alc.h"
4 #include "AL/al.h"
5 #include "alMain.h"
6 #include "alSource.h"
7 #include "alAuxEffectSlot.h"
8 #include "mixer_defs.h"
10 #ifdef __GNUC__
11 #define LIKELY(x) __builtin_expect(!!(x), 1)
12 #define UNLIKELY(x) __builtin_expect(!!(x), 0)
13 #else
14 #define LIKELY(x) (x)
15 #define UNLIKELY(x) (x)
16 #endif
18 #define REAL_MERGE2(a,b) a##b
19 #define MERGE2(a,b) REAL_MERGE2(a,b)
21 #define MixDirect_Hrtf MERGE2(MixDirect_Hrtf_,SUFFIX)
22 #define MixDirect MERGE2(MixDirect_,SUFFIX)
23 #define MixSend MERGE2(MixSend_,SUFFIX)
26 static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
27 const ALuint irSize,
28 ALfloat (*RESTRICT Coeffs)[2],
29 ALfloat (*RESTRICT CoeffStep)[2],
30 ALfloat left, ALfloat right);
31 static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
32 const ALuint irSize,
33 ALfloat (*RESTRICT Coeffs)[2],
34 ALfloat left, ALfloat right);
37 #ifndef NO_MIXDIRECT_HRTF
38 void MixDirect_Hrtf(ALsource *Source, ALCdevice *Device, DirectParams *params,
39 const ALfloat *RESTRICT data, ALuint srcchan,
40 ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
42 ALfloat (*RESTRICT DryBuffer)[BUFFERSIZE] = Device->DryBuffer;
43 ALfloat *RESTRICT ClickRemoval = Device->ClickRemoval;
44 ALfloat *RESTRICT PendingClicks = Device->PendingClicks;
45 const ALuint IrSize = GetHrtfIrSize(Device->Hrtf);
46 const ALint *RESTRICT DelayStep = params->Hrtf.DelayStep;
47 ALfloat (*RESTRICT CoeffStep)[2] = params->Hrtf.CoeffStep;
48 ALfloat (*RESTRICT TargetCoeffs)[2] = params->Hrtf.Coeffs[srcchan];
49 ALuint *RESTRICT TargetDelay = params->Hrtf.Delay[srcchan];
50 ALfloat *RESTRICT History = Source->Hrtf.History[srcchan];
51 ALfloat (*RESTRICT Values)[2] = Source->Hrtf.Values[srcchan];
52 ALint Counter = maxu(Source->Hrtf.Counter, OutPos) - OutPos;
53 ALuint Offset = Source->Hrtf.Offset + OutPos;
54 ALIGN(16) ALfloat Coeffs[HRIR_LENGTH][2];
55 ALuint Delay[2];
56 ALfloat left, right;
57 ALuint pos;
58 ALuint c;
60 pos = 0;
61 for(c = 0;c < IrSize;c++)
63 Coeffs[c][0] = TargetCoeffs[c][0] - (CoeffStep[c][0]*Counter);
64 Coeffs[c][1] = TargetCoeffs[c][1] - (CoeffStep[c][1]*Counter);
67 Delay[0] = TargetDelay[0] - (DelayStep[0]*Counter);
68 Delay[1] = TargetDelay[1] - (DelayStep[1]*Counter);
70 if(LIKELY(OutPos == 0))
72 History[Offset&SRC_HISTORY_MASK] = data[pos];
73 left = lerp(History[(Offset-(Delay[0]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
74 History[(Offset-(Delay[0]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
75 (Delay[0]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
76 right = lerp(History[(Offset-(Delay[1]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
77 History[(Offset-(Delay[1]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
78 (Delay[1]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
80 ClickRemoval[FrontLeft] -= Values[(Offset+1)&HRIR_MASK][0] +
81 Coeffs[0][0] * left;
82 ClickRemoval[FrontRight] -= Values[(Offset+1)&HRIR_MASK][1] +
83 Coeffs[0][1] * right;
85 for(pos = 0;pos < BufferSize && Counter > 0;pos++)
87 History[Offset&SRC_HISTORY_MASK] = data[pos];
88 left = lerp(History[(Offset-(Delay[0]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
89 History[(Offset-(Delay[0]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
90 (Delay[0]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
91 right = lerp(History[(Offset-(Delay[1]>>HRTFDELAY_BITS))&SRC_HISTORY_MASK],
92 History[(Offset-(Delay[1]>>HRTFDELAY_BITS)-1)&SRC_HISTORY_MASK],
93 (Delay[1]&HRTFDELAY_MASK)*(1.0f/HRTFDELAY_FRACONE));
95 Delay[0] += DelayStep[0];
96 Delay[1] += DelayStep[1];
98 Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
99 Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
100 Offset++;
102 ApplyCoeffsStep(Offset, Values, IrSize, Coeffs, CoeffStep, left, right);
103 DryBuffer[FrontLeft][OutPos] += Values[Offset&HRIR_MASK][0];
104 DryBuffer[FrontRight][OutPos] += Values[Offset&HRIR_MASK][1];
106 OutPos++;
107 Counter--;
110 Delay[0] >>= HRTFDELAY_BITS;
111 Delay[1] >>= HRTFDELAY_BITS;
112 for(;pos < BufferSize;pos++)
114 History[Offset&SRC_HISTORY_MASK] = data[pos];
115 left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];
116 right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];
118 Values[(Offset+IrSize)&HRIR_MASK][0] = 0.0f;
119 Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f;
120 Offset++;
122 ApplyCoeffs(Offset, Values, IrSize, Coeffs, left, right);
123 DryBuffer[FrontLeft][OutPos] += Values[Offset&HRIR_MASK][0];
124 DryBuffer[FrontRight][OutPos] += Values[Offset&HRIR_MASK][1];
126 OutPos++;
128 if(LIKELY(OutPos == SamplesToDo))
130 History[Offset&SRC_HISTORY_MASK] = data[pos];
131 left = History[(Offset-Delay[0])&SRC_HISTORY_MASK];
132 right = History[(Offset-Delay[1])&SRC_HISTORY_MASK];
134 PendingClicks[FrontLeft] += Values[(Offset+1)&HRIR_MASK][0] +
135 Coeffs[0][0] * left;
136 PendingClicks[FrontRight] += Values[(Offset+1)&HRIR_MASK][1] +
137 Coeffs[0][1] * right;
140 #endif
142 #ifndef NO_MIXDIRECT
143 void MixDirect(ALsource *Source, ALCdevice *Device, DirectParams *params,
144 const ALfloat *RESTRICT data, ALuint srcchan,
145 ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
147 ALfloat (*RESTRICT DryBuffer)[BUFFERSIZE] = Device->DryBuffer;
148 ALfloat *RESTRICT ClickRemoval = Device->ClickRemoval;
149 ALfloat *RESTRICT PendingClicks = Device->PendingClicks;
150 ALfloat DrySend[MaxChannels];
151 ALuint pos;
152 ALuint c;
153 (void)Source;
155 for(c = 0;c < MaxChannels;c++)
156 DrySend[c] = params->Gains[srcchan][c];
158 pos = 0;
159 if(OutPos == 0)
161 for(c = 0;c < MaxChannels;c++)
162 ClickRemoval[c] -= data[pos]*DrySend[c];
164 for(c = 0;c < MaxChannels;c++)
166 for(pos = 0;pos < BufferSize;pos++)
167 DryBuffer[c][OutPos+pos] += data[pos]*DrySend[c];
169 if(OutPos+pos == SamplesToDo)
171 for(c = 0;c < MaxChannels;c++)
172 PendingClicks[c] += data[pos]*DrySend[c];
175 #endif
177 #ifndef NO_MIXSEND
178 void MixSend(SendParams *params, const ALfloat *RESTRICT data,
179 ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize)
181 ALeffectslot *Slot = params->Slot;
182 ALfloat *WetBuffer = Slot->WetBuffer;
183 ALfloat *WetClickRemoval = Slot->ClickRemoval;
184 ALfloat *WetPendingClicks = Slot->PendingClicks;
185 ALfloat WetSend = params->Gain;
186 ALuint pos;
188 pos = 0;
189 if(OutPos == 0)
191 WetClickRemoval[0] -= data[pos] * WetSend;
193 for(pos = 0;pos < BufferSize;pos++)
195 WetBuffer[OutPos] += data[pos] * WetSend;
196 OutPos++;
198 if(OutPos == SamplesToDo)
200 WetPendingClicks[0] += data[pos] * WetSend;
203 #endif
206 #undef MixSend
207 #undef MixDirect
208 #undef MixDirect_Hrtf
210 #undef MERGE2
211 #undef REAL_MERGE2
213 #undef UNLIKELY
214 #undef LIKELY