Use a helper to count the number of float/double values for a property
[openal-soft.git] / hrtf.txt
blob59a8b4eec308477ca58bcd9e655bec098de9b691
1 HRTF Support
2 ============
4 Starting with OpenAL Soft 1.14, HRTFs can be used to enable enhanced
5 spatialization for both 3D (mono) and multi-channel sources, when used with
6 headphones/stereo output. This can be enabled using the 'hrtf' config option.
8 For multi-channel sources this creates a virtual speaker effect, making it
9 sound as if speakers provide a discrete position for each channel around the
10 listener. For mono sources this provides much more versatility in the perceived
11 placement of sounds, making it seem as though they are coming from all around,
12 including above and below the listener, instead of just to the front, back, and
13 sides.
15 The built-in data set is based on the KEMAR HRTF data provided by MIT, which
16 can be found at <http://sound.media.mit.edu/resources/KEMAR.html>. It's only
17 available when using 44100hz playback.
20 External HRTF Data Sets
21 =======================
23 OpenAL Soft also provides an option to use user-specified data sets, in
24 addition to or in place of the built-in set. This allows users to provide their
25 own data sets, which could be better suited for their heads, or to work with
26 stereo speakers instead of headphones, or to support more playback sample
27 rates, for example.
29 The file format is specified below. It uses little-endian byte order.
32 ALchar   magic[8] = "MinPHR01";
33 ALuint   sampleRate;
35 ALubyte hrirSize;  /* Can be 8 to 128 in steps of 8. */
36 ALubyte evCount;   /* Can be 5 to 128. */
38 ALubyte azCount[evCount]; /* Each can be 1 to 128. */
40 /* NOTE: hrirCount is the sum of all azCounts */
41 ALshort coefficients[hrirCount][hrirSize];
42 ALubyte delays[hrirCount]; /* Each can be 0 to 63. */
45 The data is described as thus:
47 The file first starts with the 8-byte marker, "MinPHR01", to identify it as an
48 HRTF data set. This is followed by an unsigned 32-bit integer, specifying the
49 sample rate the data set is designed for (OpenAL Soft will not use it if the
50 output device's playback rate doesn't match).
52 Afterward, an unsigned 8-bit integer specifies how many sample points (or
53 finite impulse response filter coefficients) make up each HRIR.
55 The following unsigned 8-bit integer specifies the number of elevations used
56 by the data set. The elevations start at the bottom (-90 degrees), and
57 increment upwards.  Following this is an array of unsigned 8-bit integers, one
58 for each elevation which specifies the number of azimuths (and thus HRIRs) that
59 make up each elevation.  Azimuths start clockwise from the front, constructing
60 a full circle for the left ear only. The right ear uses the same HRIRs but in
61 reverse (ie, left = angle, right = 360-angle).
63 The actual coefficients follow. Each coefficient is a signed 16-bit sample,
64 with each HRIR being a consecutive number of sample points.  The HRIRs must be
65 minimum-phase.  This allows the use of a smaller filter length, reducing
66 computation.  For reference, the built-in data set uses a 32-point filter while
67 even the smallest data set provided by MIT used a 128-sample filter (a 4x
68 reduction by applying minimum-phase reconstruction). Theoretically, one could
69 further reduce the minimum-phase version down to a 16-point filter with only a
70 small reduction in quality.
72 After the coefficients is an array of unsigned 8-bit delay values, one for
73 each HRIR. This is the propagation delay (in samples) a signal must wait before
74 being convolved with the corresponding minimum-phase HRIR filter.