27
27
#include "AL/alc.h"
28
28
#include "alMain.h"
29
29
#include "alSource.h"
32
static const ALchar magicMarker[8] = "MinPHR00";
34
#define HRIR_COUNT 828
37
static const ALushort evOffset[ELEV_COUNT] = { 0, 1, 13, 37, 73, 118, 174, 234, 306, 378, 450, 522, 594, 654, 710, 755, 791, 815, 827 };
38
static const ALubyte azCount[ELEV_COUNT] = { 1, 12, 24, 36, 45, 56, 60, 72, 72, 72, 72, 72, 60, 56, 45, 36, 24, 12, 1 };
41
static const struct Hrtf {
38
/* Current data set limits defined by the makehrtf utility. */
39
#define MIN_IR_SIZE (8)
40
#define MAX_IR_SIZE (128)
41
#define MOD_IR_SIZE (8)
43
#define MIN_EV_COUNT (5)
44
#define MAX_EV_COUNT (128)
46
#define MIN_AZ_COUNT (1)
47
#define MAX_AZ_COUNT (128)
43
ALshort coeffs[HRIR_COUNT][HRIR_LENGTH];
44
ALubyte delays[HRIR_COUNT];
54
const ALubyte *azCount;
55
const ALushort *evOffset;
56
const ALshort *coeffs;
57
const ALubyte *delays;
62
static const ALchar magicMarker00[8] = "MinPHR00";
63
static const ALchar magicMarker01[8] = "MinPHR01";
65
/* Define the default HRTF:
66
* ALubyte defaultAzCount [DefaultHrtf.evCount]
67
* ALushort defaultEvOffset [DefaultHrtf.evCount]
68
* ALshort defaultCoeffs [DefaultHrtf.irCount * defaultHrtf.irSize]
69
* ALubyte defaultDelays [DefaultHrtf.irCount]
71
* struct Hrtf DefaultHrtf
47
73
#include "hrtf_tables.inc"
50
75
static struct Hrtf *LoadedHrtfs = NULL;
51
static ALuint NumLoadedHrtfs = 0;
54
// Calculate the elevation indices given the polar elevation in radians.
55
// This will return two indices between 0 and (ELEV_COUNT-1) and an
56
// interpolation factor between 0.0 and 1.0.
57
static void CalcEvIndices(ALfloat ev, ALuint *evidx, ALfloat *evmu)
77
/* Calculate the elevation indices given the polar elevation in radians.
78
* This will return two indices between 0 and (Hrtf->evCount - 1) and an
79
* interpolation factor between 0.0 and 1.0.
81
static void CalcEvIndices(const struct Hrtf *Hrtf, ALfloat ev, ALuint *evidx, ALfloat *evmu)
59
ev = (F_PI_2 + ev) * (ELEV_COUNT-1) / F_PI;
83
ev = (F_PI_2 + ev) * (Hrtf->evCount-1) / F_PI;
60
84
evidx[0] = fastf2u(ev);
61
evidx[1] = minu(evidx[0] + 1, ELEV_COUNT-1);
85
evidx[1] = minu(evidx[0] + 1, Hrtf->evCount-1);
62
86
*evmu = ev - evidx[0];
65
// Calculate the azimuth indices given the polar azimuth in radians. This
66
// will return two indices between 0 and (azCount [ei] - 1) and an
67
// interpolation factor between 0.0 and 1.0.
68
static void CalcAzIndices(ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
89
/* Calculate the azimuth indices given the polar azimuth in radians. This
90
* will return two indices between 0 and (Hrtf->azCount[ei] - 1) and an
91
* interpolation factor between 0.0 and 1.0.
93
static void CalcAzIndices(const struct Hrtf *Hrtf, ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
70
az = (F_PI*2.0f + az) * azCount[evidx] / (F_PI*2.0f);
71
azidx[0] = fastf2u(az) % azCount[evidx];
72
azidx[1] = (azidx[0] + 1) % azCount[evidx];
73
*azmu = az - aluFloor(az);
95
az = (F_PI*2.0f + az) * Hrtf->azCount[evidx] / (F_PI*2.0f);
96
azidx[0] = fastf2u(az) % Hrtf->azCount[evidx];
97
azidx[1] = (azidx[0] + 1) % Hrtf->azCount[evidx];
98
*azmu = az - floorf(az);
76
// Calculates the normalized HRTF transition factor (delta) from the changes
77
// in gain and listener to source angle between updates. The result is a
78
// normalized delta factor than can be used to calculate moving HRIR stepping
101
/* Calculates the normalized HRTF transition factor (delta) from the changes
102
* in gain and listener to source angle between updates. The result is a
103
* normalized delta factor that can be used to calculate moving HRIR stepping
80
106
ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3], const ALfloat newdir[3])
82
108
ALfloat gainChange, angleChange, change;
94
120
// No angle change when the directions are equal or degenerate (when
95
121
// both have zero length).
96
122
if(newdir[0]-olddir[0] || newdir[1]-olddir[1] || newdir[2]-olddir[2])
97
angleChange = aluAcos(olddir[0]*newdir[0] +
99
olddir[2]*newdir[2]) / F_PI;
123
angleChange = acosf(olddir[0]*newdir[0] +
124
olddir[1]*newdir[1] +
125
olddir[2]*newdir[2]) / F_PI;
103
129
// Use the largest of the two changes for the delta factor, and apply a
104
130
// significance shaping function to it.
105
change = maxf(angleChange, gainChange) * 2.0f;
131
change = maxf(angleChange * 25.0f, gainChange) * 2.0f;
106
132
return minf(change, 1.0f);
109
// Calculates static HRIR coefficients and delays for the given polar
110
// elevation and azimuth in radians. Linear interpolation is used to
111
// increase the apparent resolution of the HRIR dataset. The coefficients
112
// are also normalized and attenuated by the specified gain.
135
/* Calculates static HRIR coefficients and delays for the given polar
136
* elevation and azimuth in radians. Linear interpolation is used to
137
* increase the apparent resolution of the HRIR data set. The coefficients
138
* are also normalized and attenuated by the specified gain.
113
140
void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat (*coeffs)[2], ALuint *delays)
115
142
ALuint evidx[2], azidx[2];
117
143
ALuint lidx[4], ridx[4];
144
ALfloat mu[3], blend[4];
120
147
// Claculate elevation indices and interpolation factor.
121
CalcEvIndices(elevation, evidx, &mu[2]);
148
CalcEvIndices(Hrtf, elevation, evidx, &mu[2]);
123
150
// Calculate azimuth indices and interpolation factor for the first
125
CalcAzIndices(evidx[0], azimuth, azidx, &mu[0]);
152
CalcAzIndices(Hrtf, evidx[0], azimuth, azidx, &mu[0]);
127
154
// Calculate the first set of linear HRIR indices for left and right
129
lidx[0] = evOffset[evidx[0]] + azidx[0];
130
lidx[1] = evOffset[evidx[0]] + azidx[1];
131
ridx[0] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[0]) % azCount[evidx[0]]);
132
ridx[1] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[1]) % azCount[evidx[0]]);
156
lidx[0] = Hrtf->evOffset[evidx[0]] + azidx[0];
157
lidx[1] = Hrtf->evOffset[evidx[0]] + azidx[1];
158
ridx[0] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[0]) % Hrtf->azCount[evidx[0]]);
159
ridx[1] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[1]) % Hrtf->azCount[evidx[0]]);
134
161
// Calculate azimuth indices and interpolation factor for the second
136
CalcAzIndices(evidx[1], azimuth, azidx, &mu[1]);
163
CalcAzIndices(Hrtf, evidx[1], azimuth, azidx, &mu[1]);
138
165
// Calculate the second set of linear HRIR indices for left and right
140
lidx[2] = evOffset[evidx[1]] + azidx[0];
141
lidx[3] = evOffset[evidx[1]] + azidx[1];
142
ridx[2] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[0]) % azCount[evidx[1]]);
143
ridx[3] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[1]) % azCount[evidx[1]]);
145
// Calculate the normalized and attenuated HRIR coefficients using linear
146
// interpolation when there is enough gain to warrant it. Zero the
147
// coefficients if gain is too low.
167
lidx[2] = Hrtf->evOffset[evidx[1]] + azidx[0];
168
lidx[3] = Hrtf->evOffset[evidx[1]] + azidx[1];
169
ridx[2] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[0]) % Hrtf->azCount[evidx[1]]);
170
ridx[3] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[1]) % Hrtf->azCount[evidx[1]]);
172
/* Calculate 4 blending weights for 2D bilinear interpolation. */
173
blend[0] = (1.0f-mu[0]) * (1.0f-mu[2]);
174
blend[1] = ( mu[0]) * (1.0f-mu[2]);
175
blend[2] = (1.0f-mu[1]) * ( mu[2]);
176
blend[3] = ( mu[1]) * ( mu[2]);
178
/* Calculate the HRIR delays using linear interpolation. */
179
delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
180
Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
181
0.5f) << HRTFDELAY_BITS;
182
delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
183
Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
184
0.5f) << HRTFDELAY_BITS;
186
/* Calculate the sample offsets for the HRIR indices. */
187
lidx[0] *= Hrtf->irSize;
188
lidx[1] *= Hrtf->irSize;
189
lidx[2] *= Hrtf->irSize;
190
lidx[3] *= Hrtf->irSize;
191
ridx[0] *= Hrtf->irSize;
192
ridx[1] *= Hrtf->irSize;
193
ridx[2] *= Hrtf->irSize;
194
ridx[3] *= Hrtf->irSize;
196
/* Calculate the normalized and attenuated HRIR coefficients using linear
197
* interpolation when there is enough gain to warrant it. Zero the
198
* coefficients if gain is too low.
148
200
if(gain > 0.0001f)
150
202
gain *= 1.0f/32767.0f;
151
for(i = 0;i < HRIR_LENGTH;i++)
203
for(i = 0;i < Hrtf->irSize;i++)
153
coeffs[i][0] = lerp(lerp(Hrtf->coeffs[lidx[0]][i], Hrtf->coeffs[lidx[1]][i], mu[0]),
154
lerp(Hrtf->coeffs[lidx[2]][i], Hrtf->coeffs[lidx[3]][i], mu[1]),
156
coeffs[i][1] = lerp(lerp(Hrtf->coeffs[ridx[0]][i], Hrtf->coeffs[ridx[1]][i], mu[0]),
157
lerp(Hrtf->coeffs[ridx[2]][i], Hrtf->coeffs[ridx[3]][i], mu[1]),
205
coeffs[i][0] = (Hrtf->coeffs[lidx[0]+i]*blend[0] +
206
Hrtf->coeffs[lidx[1]+i]*blend[1] +
207
Hrtf->coeffs[lidx[2]+i]*blend[2] +
208
Hrtf->coeffs[lidx[3]+i]*blend[3]) * gain;
209
coeffs[i][1] = (Hrtf->coeffs[ridx[0]+i]*blend[0] +
210
Hrtf->coeffs[ridx[1]+i]*blend[1] +
211
Hrtf->coeffs[ridx[2]+i]*blend[2] +
212
Hrtf->coeffs[ridx[3]+i]*blend[3]) * gain;
163
for(i = 0;i < HRIR_LENGTH;i++)
217
for(i = 0;i < Hrtf->irSize;i++)
165
219
coeffs[i][0] = 0.0f;
166
220
coeffs[i][1] = 0.0f;
170
// Calculate the HRIR delays using linear interpolation.
171
delays[0] = fastf2u(lerp(lerp(Hrtf->delays[lidx[0]], Hrtf->delays[lidx[1]], mu[0]),
172
lerp(Hrtf->delays[lidx[2]], Hrtf->delays[lidx[3]], mu[1]),
174
delays[1] = fastf2u(lerp(lerp(Hrtf->delays[ridx[0]], Hrtf->delays[ridx[1]], mu[0]),
175
lerp(Hrtf->delays[ridx[2]], Hrtf->delays[ridx[3]], mu[1]),
179
// Calculates the moving HRIR target coefficients, target delays, and
180
// stepping values for the given polar elevation and azimuth in radians.
181
// Linear interpolation is used to increase the apparent resolution of the
182
// HRIR dataset. The coefficients are also normalized and attenuated by the
183
// specified gain. Stepping resolution and count is determined using the
184
// given delta factor between 0.0 and 1.0.
225
/* Calculates the moving HRIR target coefficients, target delays, and
226
* stepping values for the given polar elevation and azimuth in radians.
227
* Linear interpolation is used to increase the apparent resolution of the
228
* HRIR data set. The coefficients are also normalized and attenuated by the
229
* specified gain. Stepping resolution and count is determined using the
230
* given delta factor between 0.0 and 1.0.
185
232
ALuint GetMovingHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat delta, ALint counter, ALfloat (*coeffs)[2], ALuint *delays, ALfloat (*coeffStep)[2], ALint *delayStep)
187
234
ALuint evidx[2], azidx[2];
188
235
ALuint lidx[4], ridx[4];
236
ALfloat mu[3], blend[4];
189
237
ALfloat left, right;
194
241
// Claculate elevation indices and interpolation factor.
195
CalcEvIndices(elevation, evidx, &mu[2]);
242
CalcEvIndices(Hrtf, elevation, evidx, &mu[2]);
197
244
// Calculate azimuth indices and interpolation factor for the first
199
CalcAzIndices(evidx[0], azimuth, azidx, &mu[0]);
246
CalcAzIndices(Hrtf, evidx[0], azimuth, azidx, &mu[0]);
201
248
// Calculate the first set of linear HRIR indices for left and right
203
lidx[0] = evOffset[evidx[0]] + azidx[0];
204
lidx[1] = evOffset[evidx[0]] + azidx[1];
205
ridx[0] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[0]) % azCount[evidx[0]]);
206
ridx[1] = evOffset[evidx[0]] + ((azCount[evidx[0]]-azidx[1]) % azCount[evidx[0]]);
250
lidx[0] = Hrtf->evOffset[evidx[0]] + azidx[0];
251
lidx[1] = Hrtf->evOffset[evidx[0]] + azidx[1];
252
ridx[0] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[0]) % Hrtf->azCount[evidx[0]]);
253
ridx[1] = Hrtf->evOffset[evidx[0]] + ((Hrtf->azCount[evidx[0]]-azidx[1]) % Hrtf->azCount[evidx[0]]);
208
255
// Calculate azimuth indices and interpolation factor for the second
210
CalcAzIndices(evidx[1], azimuth, azidx, &mu[1]);
257
CalcAzIndices(Hrtf, evidx[1], azimuth, azidx, &mu[1]);
212
259
// Calculate the second set of linear HRIR indices for left and right
214
lidx[2] = evOffset[evidx[1]] + azidx[0];
215
lidx[3] = evOffset[evidx[1]] + azidx[1];
216
ridx[2] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[0]) % azCount[evidx[1]]);
217
ridx[3] = evOffset[evidx[1]] + ((azCount[evidx[1]]-azidx[1]) % azCount[evidx[1]]);
261
lidx[2] = Hrtf->evOffset[evidx[1]] + azidx[0];
262
lidx[3] = Hrtf->evOffset[evidx[1]] + azidx[1];
263
ridx[2] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[0]) % Hrtf->azCount[evidx[1]]);
264
ridx[3] = Hrtf->evOffset[evidx[1]] + ((Hrtf->azCount[evidx[1]]-azidx[1]) % Hrtf->azCount[evidx[1]]);
219
266
// Calculate the stepping parameters.
220
delta = maxf(aluFloor(delta*(Hrtf->sampleRate*0.015f) + 0.5f), 1.0f);
267
delta = maxf(floorf(delta*(Hrtf->sampleRate*0.015f) + 0.5f), 1.0f);
221
268
step = 1.0f / delta;
223
// Calculate the normalized and attenuated target HRIR coefficients using
224
// linear interpolation when there is enough gain to warrant it. Zero
225
// the target coefficients if gain is too low. Then calculate the
226
// coefficient stepping values using the target and previous running
270
/* Calculate 4 blending weights for 2D bilinear interpolation. */
271
blend[0] = (1.0f-mu[0]) * (1.0f-mu[2]);
272
blend[1] = ( mu[0]) * (1.0f-mu[2]);
273
blend[2] = (1.0f-mu[1]) * ( mu[2]);
274
blend[3] = ( mu[1]) * ( mu[2]);
276
/* Calculate the HRIR delays using linear interpolation. Then calculate
277
* the delay stepping values using the target and previous running
280
left = (ALfloat)(delays[0] - (delayStep[0] * counter));
281
right = (ALfloat)(delays[1] - (delayStep[1] * counter));
283
delays[0] = fastf2u(Hrtf->delays[lidx[0]]*blend[0] + Hrtf->delays[lidx[1]]*blend[1] +
284
Hrtf->delays[lidx[2]]*blend[2] + Hrtf->delays[lidx[3]]*blend[3] +
285
0.5f) << HRTFDELAY_BITS;
286
delays[1] = fastf2u(Hrtf->delays[ridx[0]]*blend[0] + Hrtf->delays[ridx[1]]*blend[1] +
287
Hrtf->delays[ridx[2]]*blend[2] + Hrtf->delays[ridx[3]]*blend[3] +
288
0.5f) << HRTFDELAY_BITS;
290
delayStep[0] = fastf2i(step * (delays[0] - left));
291
delayStep[1] = fastf2i(step * (delays[1] - right));
293
/* Calculate the sample offsets for the HRIR indices. */
294
lidx[0] *= Hrtf->irSize;
295
lidx[1] *= Hrtf->irSize;
296
lidx[2] *= Hrtf->irSize;
297
lidx[3] *= Hrtf->irSize;
298
ridx[0] *= Hrtf->irSize;
299
ridx[1] *= Hrtf->irSize;
300
ridx[2] *= Hrtf->irSize;
301
ridx[3] *= Hrtf->irSize;
303
/* Calculate the normalized and attenuated target HRIR coefficients using
304
* linear interpolation when there is enough gain to warrant it. Zero
305
* the target coefficients if gain is too low. Then calculate the
306
* coefficient stepping values using the target and previous running
228
309
if(gain > 0.0001f)
230
311
gain *= 1.0f/32767.0f;
262
// Calculate the HRIR delays using linear interpolation. Then calculate
263
// the delay stepping values using the target and previous running
265
left = (ALfloat)(delays[0] - (delayStep[0] * counter));
266
right = (ALfloat)(delays[1] - (delayStep[1] * counter));
268
delays[0] = fastf2u(lerp(lerp(Hrtf->delays[lidx[0]], Hrtf->delays[lidx[1]], mu[0]),
269
lerp(Hrtf->delays[lidx[2]], Hrtf->delays[lidx[3]], mu[1]),
271
delays[1] = fastf2u(lerp(lerp(Hrtf->delays[ridx[0]], Hrtf->delays[ridx[1]], mu[0]),
272
lerp(Hrtf->delays[ridx[2]], Hrtf->delays[ridx[3]], mu[1]),
275
delayStep[0] = fastf2i(step * (delays[0] - left));
276
delayStep[1] = fastf2i(step * (delays[1] - right));
278
// The stepping count is the number of samples necessary for the HRIR to
279
// complete its transition. The mixer will only apply stepping for this
345
/* The stepping count is the number of samples necessary for the HRIR to
346
* complete its transition. The mixer will only apply stepping for this
281
349
return fastf2u(delta);
284
const struct Hrtf *GetHrtf(ALCdevice *device)
286
if(device->FmtChans == DevFmtStereo)
353
static struct Hrtf *LoadHrtf00(FILE *f, ALuint deviceRate)
355
const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
356
struct Hrtf *Hrtf = NULL;
357
ALboolean failed = AL_FALSE;
358
ALuint rate = 0, irCount = 0;
361
ALubyte *azCount = NULL;
362
ALushort *evOffset = NULL;
363
ALshort *coeffs = NULL;
364
ALubyte *delays = NULL;
369
rate |= fgetc(f)<<16;
370
rate |= fgetc(f)<<24;
373
irCount |= fgetc(f)<<8;
376
irSize |= fgetc(f)<<8;
380
if(rate != deviceRate)
382
ERR("HRIR rate does not match device rate: rate=%d (%d)\n",
386
if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE))
388
ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
389
irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE);
392
if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT)
394
ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
395
evCount, MIN_EV_COUNT, MAX_EV_COUNT);
402
azCount = malloc(sizeof(azCount[0])*evCount);
403
evOffset = malloc(sizeof(evOffset[0])*evCount);
404
if(azCount == NULL || evOffset == NULL)
406
ERR("Out of memory.\n");
412
evOffset[0] = fgetc(f);
413
evOffset[0] |= fgetc(f)<<8;
414
for(i = 1;i < evCount;i++)
416
evOffset[i] = fgetc(f);
417
evOffset[i] |= fgetc(f)<<8;
418
if(evOffset[i] <= evOffset[i-1])
420
ERR("Invalid evOffset: evOffset[%d]=%d (last=%d)\n",
421
i, evOffset[i], evOffset[i-1]);
425
azCount[i-1] = evOffset[i] - evOffset[i-1];
426
if(azCount[i-1] < MIN_AZ_COUNT || azCount[i-1] > MAX_AZ_COUNT)
428
ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
429
i-1, azCount[i-1], MIN_AZ_COUNT, MAX_AZ_COUNT);
433
if(irCount <= evOffset[i-1])
435
ERR("Invalid evOffset: evOffset[%d]=%d (irCount=%d)\n",
436
i-1, evOffset[i-1], irCount);
440
azCount[i-1] = irCount - evOffset[i-1];
441
if(azCount[i-1] < MIN_AZ_COUNT || azCount[i-1] > MAX_AZ_COUNT)
443
ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
444
i-1, azCount[i-1], MIN_AZ_COUNT, MAX_AZ_COUNT);
451
coeffs = malloc(sizeof(coeffs[0])*irSize*irCount);
452
delays = malloc(sizeof(delays[0])*irCount);
453
if(coeffs == NULL || delays == NULL)
455
ERR("Out of memory.\n");
462
for(i = 0;i < irCount*irSize;i+=irSize)
464
for(j = 0;j < irSize;j++)
468
coeff |= fgetc(f)<<8;
472
for(i = 0;i < irCount;i++)
474
delays[i] = fgetc(f);
475
if(delays[i] > maxDelay)
477
ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i], maxDelay);
484
ERR("Premature end of data\n");
491
Hrtf = malloc(sizeof(struct Hrtf));
494
ERR("Out of memory.\n");
501
Hrtf->sampleRate = rate;
502
Hrtf->irSize = irSize;
503
Hrtf->evCount = evCount;
504
Hrtf->azCount = azCount;
505
Hrtf->evOffset = evOffset;
506
Hrtf->coeffs = coeffs;
507
Hrtf->delays = delays;
520
static struct Hrtf *LoadHrtf01(FILE *f, ALuint deviceRate)
522
const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
523
struct Hrtf *Hrtf = NULL;
524
ALboolean failed = AL_FALSE;
525
ALuint rate = 0, irCount = 0;
526
ALubyte irSize = 0, evCount = 0;
527
ALubyte *azCount = NULL;
528
ALushort *evOffset = NULL;
529
ALshort *coeffs = NULL;
530
ALubyte *delays = NULL;
535
rate |= fgetc(f)<<16;
536
rate |= fgetc(f)<<24;
542
if(rate != deviceRate)
544
ERR("HRIR rate does not match device rate: rate=%d (%d)\n",
548
if(irSize < MIN_IR_SIZE || irSize > MAX_IR_SIZE || (irSize%MOD_IR_SIZE))
550
ERR("Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
551
irSize, MIN_IR_SIZE, MAX_IR_SIZE, MOD_IR_SIZE);
554
if(evCount < MIN_EV_COUNT || evCount > MAX_EV_COUNT)
556
ERR("Unsupported elevation count: evCount=%d (%d to %d)\n",
557
evCount, MIN_EV_COUNT, MAX_EV_COUNT);
564
azCount = malloc(sizeof(azCount[0])*evCount);
565
evOffset = malloc(sizeof(evOffset[0])*evCount);
566
if(azCount == NULL || evOffset == NULL)
568
ERR("Out of memory.\n");
574
for(i = 0;i < evCount;i++)
576
azCount[i] = fgetc(f);
577
if(azCount[i] < MIN_AZ_COUNT || azCount[i] > MAX_AZ_COUNT)
579
ERR("Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
580
i, azCount[i], MIN_AZ_COUNT, MAX_AZ_COUNT);
589
irCount = azCount[0];
590
for(i = 1;i < evCount;i++)
592
evOffset[i] = evOffset[i-1] + azCount[i-1];
593
irCount += azCount[i];
596
coeffs = malloc(sizeof(coeffs[0])*irSize*irCount);
597
delays = malloc(sizeof(delays[0])*irCount);
598
if(coeffs == NULL || delays == NULL)
600
ERR("Out of memory.\n");
607
for(i = 0;i < irCount*irSize;i+=irSize)
609
for(j = 0;j < irSize;j++)
613
coeff |= fgetc(f)<<8;
617
for(i = 0;i < irCount;i++)
619
delays[i] = fgetc(f);
620
if(delays[i] > maxDelay)
622
ERR("Invalid delays[%d]: %d (%d)\n", i, delays[i], maxDelay);
629
ERR("Premature end of data\n");
636
Hrtf = malloc(sizeof(struct Hrtf));
639
ERR("Out of memory.\n");
646
Hrtf->sampleRate = rate;
647
Hrtf->irSize = irSize;
648
Hrtf->evCount = evCount;
649
Hrtf->azCount = azCount;
650
Hrtf->evOffset = evOffset;
651
Hrtf->coeffs = coeffs;
652
Hrtf->delays = delays;
665
static struct Hrtf *LoadHrtf(ALuint deviceRate)
667
const char *fnamelist = NULL;
669
if(!ConfigValueStr(NULL, "hrtf_tables", &fnamelist))
671
while(*fnamelist != '\0')
673
struct Hrtf *Hrtf = NULL;
674
char fname[PATH_MAX];
289
for(i = 0;i < NumLoadedHrtfs;i++)
291
if(device->Frequency == LoadedHrtfs[i].sampleRate)
292
return &LoadedHrtfs[i];
294
if(device->Frequency == DefaultHrtf.sampleRate)
297
ERR("Incompatible format: %s %uhz\n",
298
DevFmtChannelsString(device->FmtChans), device->Frequency);
304
char *fnamelist=NULL, *next=NULL;
307
if(ConfigValueStr(NULL, "hrtf_tables", &val))
308
next = fnamelist = strdup(val);
311
const ALubyte maxDelay = SRC_HISTORY_LENGTH-1;
320
next = strchr(fname, ',');
679
while(isspace(*fnamelist) || *fnamelist == ',')
682
while(*fnamelist != '\0' && *fnamelist != ',')
332
while(isspace(*next) || *next == ',')
684
const char *next = strpbrk(fnamelist, "%,");
685
while(fnamelist != next && *fnamelist && i < sizeof(fname))
686
fname[i++] = *(fnamelist++);
688
if(!next || *next == ',')
695
int wrote = snprintf(&fname[i], sizeof(fname)-i, "%u", deviceRate);
696
i += minu(wrote, sizeof(fname)-i);
699
else if(*next == '%')
701
if(i < sizeof(fname))
706
ERR("Invalid marker '%%%c'\n", *next);
709
i = minu(i, sizeof(fname)-1);
711
while(i > 0 && isspace(fname[i-1]))
338
TRACE("Loading %s\n", fname);
718
TRACE("Loading %s...\n", fname);
339
719
f = fopen(fname, "rb");
347
if(fread(magic, 1, sizeof(magicMarker), f) != sizeof(magicMarker))
349
ERR("Failed to read magic marker\n");
352
else if(memcmp(magic, magicMarker, sizeof(magicMarker)) != 0)
355
ERR("Invalid magic marker: \"%s\"\n", magic);
361
ALushort hrirCount, hrirSize;
364
newdata.sampleRate = fgetc(f);
365
newdata.sampleRate |= fgetc(f)<<8;
366
newdata.sampleRate |= fgetc(f)<<16;
367
newdata.sampleRate |= fgetc(f)<<24;
369
hrirCount = fgetc(f);
370
hrirCount |= fgetc(f)<<8;
373
hrirSize |= fgetc(f)<<8;
377
if(hrirCount != HRIR_COUNT || hrirSize != HRIR_LENGTH || evCount != ELEV_COUNT)
379
ERR("Unsupported value: hrirCount=%d (%d), hrirSize=%d (%d), evCount=%d (%d)\n",
380
hrirCount, HRIR_COUNT, hrirSize, HRIR_LENGTH, evCount, ELEV_COUNT);
387
for(i = 0;i < ELEV_COUNT;i++)
391
offset |= fgetc(f)<<8;
392
if(offset != evOffset[i])
394
ERR("Unsupported evOffset[%d] value: %d (%d)\n", i, offset, evOffset[i]);
402
for(i = 0;i < HRIR_COUNT;i++)
404
for(j = 0;j < HRIR_LENGTH;j++)
408
coeff |= fgetc(f)<<8;
409
newdata.coeffs[i][j] = coeff;
412
for(i = 0;i < HRIR_COUNT;i++)
416
newdata.delays[i] = delay;
419
ERR("Invalid delay[%d]: %d (%d)\n", i, delay, maxDelay);
426
ERR("Premature end of data\n");
726
if(fread(magic, 1, sizeof(magic), f) != sizeof(magic))
727
ERR("Failed to read header from %s\n", fname);
730
if(memcmp(magic, magicMarker00, sizeof(magicMarker00)) == 0)
732
TRACE("Detected data set format v0\n");
733
Hrtf = LoadHrtf00(f, deviceRate);
735
else if(memcmp(magic, magicMarker01, sizeof(magicMarker01)) == 0)
737
TRACE("Detected data set format v1\n");
738
Hrtf = LoadHrtf01(f, deviceRate);
741
ERR("Invalid header in %s: \"%.8s\"\n", fname, magic);
436
void *temp = realloc(LoadedHrtfs, (NumLoadedHrtfs+1)*sizeof(LoadedHrtfs[0]));
440
TRACE("Loaded HRTF support for format: %s %uhz\n",
441
DevFmtChannelsString(DevFmtStereo), newdata.sampleRate);
442
LoadedHrtfs[NumLoadedHrtfs++] = newdata;
446
ERR("Failed to load %s\n", fname);
749
Hrtf->next = LoadedHrtfs;
751
TRACE("Loaded HRTF support for format: %s %uhz\n",
752
DevFmtChannelsString(DevFmtStereo), Hrtf->sampleRate);
756
ERR("Failed to load %s\n", fname);
762
const struct Hrtf *GetHrtf(ALCdevice *device)
764
if(device->FmtChans == DevFmtStereo)
766
struct Hrtf *Hrtf = LoadedHrtfs;
769
if(device->Frequency == Hrtf->sampleRate)
774
Hrtf = LoadHrtf(device->Frequency);
778
if(device->Frequency == DefaultHrtf.sampleRate)
781
ERR("Incompatible format: %s %uhz\n",
782
DevFmtChannelsString(device->FmtChans), device->Frequency);
788
struct Hrtf *Hrtf = NULL;
790
while((Hrtf=LoadedHrtfs) != NULL)
792
LoadedHrtfs = Hrtf->next;
793
free((void*)Hrtf->azCount);
794
free((void*)Hrtf->evOffset);
795
free((void*)Hrtf->coeffs);
796
free((void*)Hrtf->delays);
801
ALuint GetHrtfIrSize (const struct Hrtf *Hrtf)