From 583d431947be540a33843d68feb5f1456671c298 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Fri, 10 Mar 2017 04:35:32 -0800 Subject: Implement NFC filters for Ambisonic rendering NFC filters currently only work when rendering to ambisonic buffers, which includes HQ rendering and ambisonic output. There are two new config options: 'decoder/nfc' (default on) enables or disables use of NFC filters globally, and 'decoder/nfc-ref-delay' (default 0) specifies the reference delay parameter for NFC-HOA rendering with ambisonic output (a value of 0 disables NFC). Currently, NFC filters rely on having an appropriate value set for AL_METERS_PER_UNIT to get the correct scaling. HQ rendering uses the averaged speaker distances as a control/reference, and currently doesn't correct for individual speaker distances (if the speakers are all equidistant, this is fine, otherwise per-speaker correction should be done as well). --- OpenAL32/Include/alMain.h | 7 +++++++ OpenAL32/Include/alu.h | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) (limited to 'OpenAL32/Include') diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index cc30dcef..e4c5b94a 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -726,6 +726,7 @@ struct ALCdevice_struct alignas(16) ALfloat SourceData[BUFFERSIZE]; alignas(16) ALfloat ResampledData[BUFFERSIZE]; alignas(16) ALfloat FilteredData[BUFFERSIZE]; + alignas(16) ALfloat NFCtrlData[BUFFERSIZE]; /* The "dry" path corresponds to the main output. */ struct { @@ -738,6 +739,7 @@ struct ALCdevice_struct ALfloat (*Buffer)[BUFFERSIZE]; ALsizei NumChannels; + ALsizei NumChannelsPerOrder[MAX_AMBI_ORDER+1]; } Dry; /* First-order ambisonics output, to be upsampled to the dry buffer if different. */ @@ -760,6 +762,11 @@ struct ALCdevice_struct ALsizei NumChannels; } RealOut; + /* The average speaker distance as determined by the ambdec configuration + * (or alternatively, by the NFC-HOA reference delay). Only used for NFC. + */ + ALfloat AvgSpeakerDist; + /* Delay buffers used to compensate for speaker distances. */ DistanceComp ChannelDelay[MAX_OUTPUT_CHANNELS]; diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h index 03f0090d..6c374ebc 100644 --- a/OpenAL32/Include/alu.h +++ b/OpenAL32/Include/alu.h @@ -17,6 +17,7 @@ #include "hrtf.h" #include "align.h" +#include "nfcfilter.h" #include "math_defs.h" @@ -129,6 +130,8 @@ typedef struct DirectParams { ALfilterState LowPass; ALfilterState HighPass; + NfcFilter NFCtrlFilter[MAX_AMBI_ORDER]; + struct { HrtfParams Current; HrtfParams Target; @@ -152,6 +155,9 @@ typedef struct SendParams { } Gains; } SendParams; +#define VOICE_IS_HRTF (1<<0) +#define VOICE_HAS_NFC (1<<1) + typedef struct ALvoice { struct ALsourceProps *Props; @@ -182,7 +188,7 @@ typedef struct ALvoice { /* If not 'moving', gain/coefficients are set directly without fading. */ ALboolean Moving; - ALboolean IsHrtf; + ALuint Flags; ALuint Offset; /* Number of output samples mixed since starting. */ @@ -195,6 +201,7 @@ typedef struct ALvoice { ALfloat (*Buffer)[BUFFERSIZE]; ALsizei Channels; + ALsizei ChannelsPerOrder[MAX_AMBI_ORDER+1]; } Direct; struct { -- cgit v1.2.3