aboutsummaryrefslogtreecommitdiffstats
path: root/docs/hrtf.txt
diff options
context:
space:
mode:
Diffstat (limited to 'docs/hrtf.txt')
-rw-r--r--docs/hrtf.txt84
1 files changed, 84 insertions, 0 deletions
diff --git a/docs/hrtf.txt b/docs/hrtf.txt
new file mode 100644
index 00000000..ba8cd8fa
--- /dev/null
+++ b/docs/hrtf.txt
@@ -0,0 +1,84 @@
+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.