|
HRTF Support
|
|
============
|
|
|
|
Starting with OpenAL Soft 1.14, HRTFs can be used to enable enhanced
|
|
spatialization for both 3D (mono) and multi-channel sources, when used with
|
|
headphones/stereo output. This can be enabled using the 'hrtf' config option.
|
|
|
|
For multi-channel sources this creates a virtual speaker effect, making it
|
|
sound as if speakers provide a discrete position for each channel around the
|
|
listener. For mono sources this provides much more versatility in the perceived
|
|
placement of sounds, making it seem as though they are coming from all around,
|
|
including above and below the listener, instead of just to the front, back, and
|
|
sides.
|
|
|
|
The default data set is based on the KEMAR HRTF data provided by MIT, which can
|
|
be found at <http://sound.media.mit.edu/resources/KEMAR.html>. It's only
|
|
available when using 44100hz or 48000hz playback.
|
|
|
|
|
|
Custom HRTF Data Sets
|
|
=====================
|
|
|
|
OpenAL Soft also provides an option to use user-specified data sets, in
|
|
addition to or in place of the default set. This allows users to provide their
|
|
own data sets, which could be better suited for their heads, or to work with
|
|
stereo speakers instead of headphones, or to support more playback sample
|
|
rates, for example.
|
|
|
|
The file format is specified below. It uses little-endian byte order.
|
|
|
|
==
|
|
ALchar magic[8] = "MinPHR02";
|
|
ALuint sampleRate;
|
|
ALubyte sampleType; /* Can be 0 (16-bit) or 1 (24-bit). */
|
|
ALubyte channelType; /* Can be 0 (mono) or 1 (stereo). */
|
|
ALubyte hrirSize; /* Can be 8 to 128 in steps of 8. */
|
|
ALubyte fdCount; /* Can be 1 to 16. */
|
|
|
|
struct {
|
|
ALushort distance; /* Can be 50mm to 2500mm. */
|
|
ALubyte evCount; /* Can be 5 to 128. */
|
|
ALubyte azCount[evCount]; /* Each can be 1 to 128. */
|
|
} fields[fdCount];
|
|
|
|
/* NOTE: ALtype can be ALshort (16-bit) or ALbyte[3] (24-bit) depending on
|
|
* sampleType,
|
|
* hrirCount is the sum of all azCounts.
|
|
* channels can be 1 (mono) or 2 (stereo) depending on channelType.
|
|
*/
|
|
ALtype coefficients[hrirCount][hrirSize][channels];
|
|
ALubyte delays[hrirCount][channels]; /* Each can be 0 to 63. */
|
|
==
|
|
|
|
The data is described as thus:
|
|
|
|
The file first starts with the 8-byte marker, "MinPHR02", to identify it as an
|
|
HRTF data set. This is followed by an unsigned 32-bit integer, specifying the
|
|
sample rate the data set is designed for (OpenAL Soft will not use it if the
|
|
output device's playback rate doesn't match).
|
|
|
|
Afterward, an unsigned 8-bit integer specifies how many sample points (or
|
|
finite impulse response filter coefficients) make up each HRIR.
|
|
|
|
The following unsigned 8-bit integer specifies the number of fields used by the
|
|
data set. Then for each field an unsigned 16-bit short specifies the distance
|
|
for that field (in millimeters), followed by an 8-bit integer for the number of
|
|
elevations. These elevations start at the bottom (-90 degrees), and increment
|
|
upwards. Following this is an array of unsigned 8-bit integers, one for each
|
|
elevation which specifies the number of azimuths (and thus HRIRs) that make up
|
|
each elevation. Azimuths start clockwise from the front, constructing a full
|
|
circle. Mono HRTFs use the same HRIRs for both ears by reversing the azimuth
|
|
calculation (ie. left = angle, right = 360-angle).
|
|
|
|
The actual coefficients follow. Each coefficient is a signed 16-bit or 24-bit
|
|
sample. Stereo HRTFs interleave left/right ear coefficients. The HRIRs must
|
|
be minimum-phase. This allows the use of a smaller filter length, reducing
|
|
computation. For reference, the default data set uses a 32-point filter while
|
|
even the smallest data set provided by MIT used a 128-sample filter (a 4x
|
|
reduction by applying minimum-phase reconstruction).
|
|
|
|
After the coefficients is an array of unsigned 8-bit delay values, one for
|
|
each HRIR (with stereo HRTFs interleaving left/right ear delays). This is the
|
|
propagation delay (in samples) a signal must wait before being convolved with
|
|
the corresponding minimum-phase HRIR filter.
|