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)
85 evidx[1] =
minu(evidx[0] + 1, Hrtf->evCount-1);
86 *evmu = ev - evidx[0];
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);
108 ALfloat gainChange, angleChange, change;
111 newGain =
maxf(newGain, 0.0001
f);
112 oldGain =
maxf(oldGain, 0.0001
f);
113 gainChange = fabsf(log10f(newGain / oldGain) / log10f(0.0001
f));
118 if(gainChange > 0.0001
f || newGain > 0.0001
f)
122 if(newdir[0]-olddir[0] || newdir[1]-olddir[1] || newdir[2]-olddir[2])
123 angleChange = acosf(olddir[0]*newdir[0] +
124 olddir[1]*newdir[1] +
125 olddir[2]*newdir[2]) /
F_PI;
131 change =
maxf(angleChange * 25.0
f, gainChange) * 2.0f;
132 return minf(change, 1.0f);
142 ALuint evidx[2], azidx[2];
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]]);
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]]);
173 blend[0] = (1.0f-mu[0]) * (1.0
f-mu[2]);
174 blend[1] = ( mu[0]) * (1.0
f-mu[2]);
175 blend[2] = (1.0f-mu[1]) * ( mu[2]);
176 blend[3] = ( mu[1]) * ( mu[2]);
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] +
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] +
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;
202 gain *= 1.0f/32767.0f;
203 for(i = 0;i < Hrtf->irSize;i++)
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;
217 for(i = 0;i < Hrtf->irSize;i++)
234 ALuint evidx[2], azidx[2];
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]]);
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]]);
267 delta =
maxf(floorf(delta*(Hrtf->sampleRate*0.015f) + 0.5f), 1.0f);
271 blend[0] = (1.0f-mu[0]) * (1.0
f-mu[2]);
272 blend[1] = ( mu[0]) * (1.0
f-mu[2]);
273 blend[2] = (1.0f-mu[1]) * ( mu[2]);
274 blend[3] = ( mu[1]) * ( mu[2]);
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] +
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] +
290 delayStep[0] =
fastf2i(step * (delays[0] - left));
291 delayStep[1] =
fastf2i(step * (delays[1] - right));
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;
311 gain *= 1.0f/32767.0f;
317 coeffs[
i][0] = (Hrtf->coeffs[lidx[0]+
i]*blend[0] +
318 Hrtf->coeffs[lidx[1]+
i]*blend[1] +
319 Hrtf->coeffs[lidx[2]+
i]*blend[2] +
320 Hrtf->coeffs[lidx[3]+
i]*blend[3]) * gain;
321 coeffs[
i][1] = (Hrtf->coeffs[ridx[0]+
i]*blend[0] +
322 Hrtf->coeffs[ridx[1]+
i]*blend[1] +
323 Hrtf->coeffs[ridx[2]+
i]*blend[2] +
324 Hrtf->coeffs[ridx[3]+
i]*blend[3]) * gain;
326 coeffStep[
i][0] = step * (coeffs[
i][0] -
left);
327 coeffStep[
i][1] = step * (coeffs[
i][1] -
right);
340 coeffStep[
i][0] = step * -
left;
341 coeffStep[
i][1] = step * -
right;
356 struct Hrtf *Hrtf =
NULL;
358 ALuint rate = 0, irCount = 0;
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",
388 ERR(
"Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
394 ERR(
"Unsupported elevation count: evCount=%d (%d to %d)\n",
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];
428 ERR(
"Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
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];
443 ERR(
"Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
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;
507 Hrtf->delays = delays;
523 struct Hrtf *Hrtf =
NULL;
525 ALuint rate = 0, irCount = 0;
526 ALubyte irSize = 0, evCount = 0;
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",
550 ERR(
"Unsupported HRIR size: irSize=%d (%d to %d by %d)\n",
556 ERR(
"Unsupported elevation count: evCount=%d (%d to %d)\n",
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);
579 ERR(
"Unsupported azimuth count: azCount[%d]=%d (%d to %d)\n",
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;
652 Hrtf->delays = delays;
667 const char *fnamelist =
NULL;
671 while(*fnamelist !=
'\0')
673 struct Hrtf *Hrtf =
NULL;
679 while(isspace(*fnamelist) || *fnamelist ==
',')
682 while(*fnamelist !=
'\0' && *fnamelist !=
',')
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]))
718 TRACE(
"Loading %s...\n", fname);
719 f = fopen(fname,
"rb");
722 ERR(
"Could not open %s\n", fname);
726 if(fread(magic, 1,
sizeof(magic), f) !=
sizeof(magic))
727 ERR(
"Failed to read header from %s\n", fname);
732 TRACE(
"Detected data set format v0\n");
737 TRACE(
"Detected data set format v1\n");
741 ERR(
"Invalid header in %s: \"%.8s\"\n", fname, magic);
751 TRACE(
"Loaded HRTF support for format: %s %uhz\n",
756 ERR(
"Failed to load %s\n", fname);
769 if(device->
Frequency == Hrtf->sampleRate)
778 if(device->
Frequency == DefaultHrtf.sampleRate)
781 ERR(
"Incompatible format: %s %uhz\n",
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);
int ConfigValueStr(const char *blockName, const char *keyName, const char **ret)
void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat gain, ALfloat(*coeffs)[2], ALuint *delays)
static struct Hrtf * LoadHrtf01(FILE *f, ALuint deviceRate)
static struct Hrtf * LoadHrtf(ALuint deviceRate)
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)
const ALCchar * DevFmtChannelsString(enum DevFmtChannels chans)
#define SRC_HISTORY_LENGTH
static const ALchar magicMarker01[8]
ALuint GetHrtfIrSize(const struct Hrtf *Hrtf)
static const ALchar magicMarker00[8]
ALfloat CalcHrtfDelta(ALfloat oldGain, ALfloat newGain, const ALfloat olddir[3], const ALfloat newdir[3])
static __inline ALfloat maxf(ALfloat a, ALfloat b)
static void CalcEvIndices(const struct Hrtf *Hrtf, ALfloat ev, ALuint *evidx, ALfloat *evmu)
static struct Hrtf * LoadedHrtfs
static __inline ALuint fastf2u(ALfloat f)
enum DevFmtChannels FmtChans
static __inline ALuint minu(ALuint a, ALuint b)
static void CalcAzIndices(const struct Hrtf *Hrtf, ALuint evidx, ALfloat az, ALuint *azidx, ALfloat *azmu)
static __inline ALfloat minf(ALfloat a, ALfloat b)
static __inline ALint fastf2i(ALfloat f)
struct Hrtf * GetHrtf(ALCdevice *device)
static struct Hrtf * LoadHrtf00(FILE *f, ALuint deviceRate)
GLenum GLenum const GLfloat * coeffs