c6c6e3324d
Last time this attempted to average the HRIRs according to their contribution to a given B-Format channel as if they were loudspeakers, as well as averaging the HRIR delays. The latter part resulted in the loss of the ITD (inter-aural time delay), a key component of HRTF. This time, the HRIRs are averaged similar to above, except instead of averaging the delays, they're applied to the resulting coefficients (for example, a delay of 8 would apply the HRIR starting at the 8th sample of the target HRIR). This does roughly double the IR length, as the largest delay is about 35 samples while the filter is normally 32 samples. However, this is still smaller the original data set IR (which was 256 samples), it also only needs to be applied to 4 channels for first-order ambisonics, rather than the 8-channel cube. So it's doing twice as much work per sample, but only working on half the number of samples. Additionally, since the resulting HRIRs no longer rely on an extra delay line, a more efficient HRTF mixing function can be made that doesn't use one. Such a function can also avoid the per-sample stepping parameters the original uses.
53 lines
1.4 KiB
C
53 lines
1.4 KiB
C
#ifndef ALC_HRTF_H
|
|
#define ALC_HRTF_H
|
|
|
|
#include "AL/al.h"
|
|
#include "AL/alc.h"
|
|
|
|
#include "alstring.h"
|
|
|
|
|
|
struct Hrtf {
|
|
ALuint sampleRate;
|
|
ALuint irSize;
|
|
ALubyte evCount;
|
|
|
|
const ALubyte *azCount;
|
|
const ALushort *evOffset;
|
|
const ALshort *coeffs;
|
|
const ALubyte *delays;
|
|
|
|
const char *filename;
|
|
struct Hrtf *next;
|
|
};
|
|
|
|
typedef struct HrtfEntry {
|
|
al_string name;
|
|
|
|
const struct Hrtf *hrtf;
|
|
} HrtfEntry;
|
|
TYPEDEF_VECTOR(HrtfEntry, vector_HrtfEntry)
|
|
|
|
#define HRIR_BITS (7)
|
|
#define HRIR_LENGTH (1<<HRIR_BITS)
|
|
#define HRIR_MASK (HRIR_LENGTH-1)
|
|
#define HRTFDELAY_BITS (20)
|
|
#define HRTFDELAY_FRACONE (1<<HRTFDELAY_BITS)
|
|
#define HRTFDELAY_MASK (HRTFDELAY_FRACONE-1)
|
|
|
|
void FreeHrtfs(void);
|
|
|
|
vector_HrtfEntry EnumerateHrtf(const_al_string devname);
|
|
void FreeHrtfList(vector_HrtfEntry *list);
|
|
|
|
void GetLerpedHrtfCoeffs(const struct Hrtf *Hrtf, ALfloat elevation, ALfloat azimuth, ALfloat spread, ALfloat gain, ALfloat (*coeffs)[2], ALuint *delays);
|
|
|
|
/* Produces HRTF filter coefficients for decoding B-Format. The result will
|
|
* have ACN ordering with N3D normalization. NumChannels must currently be 4,
|
|
* for first-order. Returns the maximum impulse-response length of the
|
|
* generated coefficients.
|
|
*/
|
|
ALuint BuildBFormatHrtf(const struct Hrtf *Hrtf, ALfloat (*coeffs)[HRIR_LENGTH][2], ALuint NumChannels);
|
|
|
|
#endif /* ALC_HRTF_H */
|