Don't explicitly store first-order coefficients

It seems a simple scaling on the coefficients will allow first-order content to
work with second- and third-order coefficients, although obviously not with any
improved locality. That may be something to look into for the future, but this
is good enough for now.
This commit is contained in:
Chris Robinson 2015-08-18 07:44:17 -07:00
parent 53f6590b17
commit 6f59ebab27
2 changed files with 117 additions and 65 deletions

View File

@ -33,6 +33,11 @@
#include "bool.h" #include "bool.h"
#define ZERO_ORDER_SCALE 0.0f
#define FIRST_ORDER_SCALE 1.0f
#define SECOND_ORDER_SCALE (1.0f / 1.22474f)
#define THIRD_ORDER_SCALE (1.0f / 1.30657f)
void ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat elevation, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS]) void ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat elevation, ALfloat ingain, ALfloat gains[MAX_OUTPUT_CHANNELS])
{ {
ALfloat dir[3] = { ALfloat dir[3] = {
@ -74,7 +79,7 @@ void ComputeDirectionalGains(const ALCdevice *device, const ALfloat dir[3], ALfl
for(i = 0;i < device->NumChannels;i++) for(i = 0;i < device->NumChannels;i++)
{ {
for(j = 0;j < MAX_AMBI_COEFFS;j++) for(j = 0;j < MAX_AMBI_COEFFS;j++)
gains[i] += device->Channel[i].HOACoeff[j]*coeffs[j]; gains[i] += device->AmbiCoeffs[i][j]*coeffs[j];
gains[i] *= ingain; gains[i] *= ingain;
} }
} }
@ -92,7 +97,7 @@ void ComputeAmbientGains(const ALCdevice *device, ALfloat ingain, ALfloat gains[
// scaling the W channel input by sqrt(0.5). The square root of the // scaling the W channel input by sqrt(0.5). The square root of the
// base average provides for a more perceptual average volume, better // base average provides for a more perceptual average volume, better
// suited to non-directional gains. // suited to non-directional gains.
gains[i] = sqrtf(device->Channel[i].HOACoeff[0]/1.4142f) * ingain; gains[i] = sqrtf(device->AmbiCoeffs[i][0]/1.4142f) * ingain;
} }
} }
@ -104,8 +109,10 @@ void ComputeBFormatGains(const ALCdevice *device, const ALfloat mtx[4], ALfloat
gains[i] = 0.0f; gains[i] = 0.0f;
for(i = 0;i < device->NumChannels;i++) for(i = 0;i < device->NumChannels;i++)
{ {
for(j = 0;j < 4;j++) float scale = device->AmbiScale;
gains[i] += device->Channel[i].FOACoeff[j] * mtx[j]; gains[i] += device->AmbiCoeffs[i][0] * mtx[0];
for(j = 1;j < 4;j++)
gains[i] += device->AmbiCoeffs[i][j] * scale * mtx[j];
gains[i] *= ingain; gains[i] *= ingain;
} }
} }
@ -150,18 +157,17 @@ typedef struct ChannelMap {
ChannelConfig Config; ChannelConfig Config;
} ChannelMap; } ChannelMap;
static void SetChannelMap(ALCdevice *device, const ChannelMap *chanmap, size_t count) static void SetChannelMap(ALCdevice *device, const ChannelMap *chanmap, size_t count, ALfloat ambiscale)
{ {
size_t i, j; size_t i, j;
device->AmbiScale = ambiscale;
for(i = 0;i < MAX_OUTPUT_CHANNELS && device->ChannelName[i] != InvalidChannel;i++) for(i = 0;i < MAX_OUTPUT_CHANNELS && device->ChannelName[i] != InvalidChannel;i++)
{ {
if(device->ChannelName[i] == LFE) if(device->ChannelName[i] == LFE)
{ {
for(j = 0;j < MAX_AMBI_COEFFS;j++) for(j = 0;j < MAX_AMBI_COEFFS;j++)
device->Channel[i].HOACoeff[j] = 0.0f; device->AmbiCoeffs[i][j] = 0.0f;
for(j = 0;j < 4;j++)
device->Channel[i].FOACoeff[j] = 0.0f;
continue; continue;
} }
@ -169,7 +175,9 @@ static void SetChannelMap(ALCdevice *device, const ChannelMap *chanmap, size_t c
{ {
if(device->ChannelName[i] == chanmap[j].ChanName) if(device->ChannelName[i] == chanmap[j].ChanName)
{ {
device->Channel[i] = chanmap[j].Config; size_t k;
for(k = 0;k < MAX_AMBI_COEFFS;++k)
device->AmbiCoeffs[i][k] = chanmap[j].Config[k];
break; break;
} }
} }
@ -206,7 +214,9 @@ static bool LoadChannelSetup(ALCdevice *device)
ChannelMap chanmap[MAX_OUTPUT_CHANNELS]; ChannelMap chanmap[MAX_OUTPUT_CHANNELS];
const enum Channel *channels = NULL; const enum Channel *channels = NULL;
const char *layout = NULL; const char *layout = NULL;
ALfloat ambiscale = 1.0f;
size_t count = 0; size_t count = 0;
int order;
size_t i; size_t i;
switch(device->FmtChans) switch(device->FmtChans)
@ -255,9 +265,22 @@ static bool LoadChannelSetup(ALCdevice *device)
else else
{ {
char name[32]; char name[32];
snprintf(name, sizeof(name), "%s/enable", layout); snprintf(name, sizeof(name), "%s/order", layout);
if(!GetConfigValueBool("layouts", name, 0)) if(!ConfigValueInt("layouts", name, &order))
return false; return false;
if(order == 3)
ambiscale = THIRD_ORDER_SCALE;
else if(order == 2)
ambiscale = SECOND_ORDER_SCALE;
else if(order == 1)
ambiscale = FIRST_ORDER_SCALE;
else if(order == 0)
ambiscale = ZERO_ORDER_SCALE;
else
{
ERR("Unhandled order value %d (expected 0, 1, 2, or 3) for layout %s\n", order, name);
return false;
}
} }
for(i = 0;i < count;i++) for(i = 0;i < count;i++)
@ -265,7 +288,9 @@ static bool LoadChannelSetup(ALCdevice *device)
const char *channame; const char *channame;
char chanlayout[32]; char chanlayout[32];
const char *value; const char *value;
int props; int props = 0;
char eol = 0;
int j;
chanmap[i].ChanName = channels[i]; chanmap[i].ChanName = channels[i];
channame = GetLabelFromChannel(channels[i]); channame = GetLabelFromChannel(channels[i]);
@ -276,79 +301,99 @@ static bool LoadChannelSetup(ALCdevice *device)
ERR("Missing channel %s\n", channame); ERR("Missing channel %s\n", channame);
return false; return false;
} }
props = sscanf(value, " %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f ; %f %f %f %f", if(order == 3)
&chanmap[i].Config.HOACoeff[0], &chanmap[i].Config.HOACoeff[1], &chanmap[i].Config.HOACoeff[2], props = sscanf(value, " %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %c",
&chanmap[i].Config.HOACoeff[3], &chanmap[i].Config.HOACoeff[4], &chanmap[i].Config.HOACoeff[5], &chanmap[i].Config[0], &chanmap[i].Config[1], &chanmap[i].Config[2],
&chanmap[i].Config.HOACoeff[6], &chanmap[i].Config.HOACoeff[7], &chanmap[i].Config.HOACoeff[8], &chanmap[i].Config[3], &chanmap[i].Config[4], &chanmap[i].Config[5],
&chanmap[i].Config.HOACoeff[9], &chanmap[i].Config.HOACoeff[10], &chanmap[i].Config.HOACoeff[11], &chanmap[i].Config[6], &chanmap[i].Config[7], &chanmap[i].Config[8],
&chanmap[i].Config.HOACoeff[12], &chanmap[i].Config.HOACoeff[13], &chanmap[i].Config.HOACoeff[14], &chanmap[i].Config[9], &chanmap[i].Config[10], &chanmap[i].Config[11],
&chanmap[i].Config.HOACoeff[15], &chanmap[i].Config.FOACoeff[0], &chanmap[i].Config.FOACoeff[1], &chanmap[i].Config[12], &chanmap[i].Config[13], &chanmap[i].Config[14],
&chanmap[i].Config.FOACoeff[2], &chanmap[i].Config.FOACoeff[3]); &chanmap[i].Config[15], &eol
);
else if(order == 2)
props = sscanf(value, " %f %f %f %f %f %f %f %f %f %c",
&chanmap[i].Config[0], &chanmap[i].Config[1], &chanmap[i].Config[2],
&chanmap[i].Config[3], &chanmap[i].Config[4], &chanmap[i].Config[5],
&chanmap[i].Config[6], &chanmap[i].Config[7], &chanmap[i].Config[8],
&eol
);
else if(order == 1)
props = sscanf(value, " %f %f %f %f %c",
&chanmap[i].Config[0], &chanmap[i].Config[1], &chanmap[i].Config[2],
&chanmap[i].Config[3], &eol
);
else if(order == 0)
props = sscanf(value, " %f %c", &chanmap[i].Config[0], &eol);
if(props == 0) if(props == 0)
{ {
ERR("Failed to parse %s channel's properties\n", channame); ERR("Failed to parse %s channel's properties\n", channame);
return false; return false;
} }
if(props < 20) if(props > (order+1)*(order+1))
{ {
ERR("Failed to parse %s channel's elements (expected 20, got %d)\n", channame, props); ERR("Excess elements in %s channel %s (expected %d)\n", layout, channame, (order+1)*(order+1));
return false; return false;
} }
for(j = props;j < 16;++j)
chanmap[i].Config[j] = 0.0f;
} }
SetChannelMap(device, chanmap, count); SetChannelMap(device, chanmap, count, ambiscale);
return true; return true;
} }
ALvoid aluInitPanning(ALCdevice *device) ALvoid aluInitPanning(ALCdevice *device)
{ {
static const ChannelMap MonoCfg[1] = { static const ChannelMap MonoCfg[1] = {
{ FrontCenter, { { 1.4142f }, { 1.4142f } } }, { FrontCenter, { 1.4142f } },
}, StereoCfg[2] = { }, StereoCfg[2] = {
{ FrontLeft, { { 0.7071f, 0.0f, 0.5f, 0.0f }, { 0.7071f, 0.0f, 0.5f, 0.0f } } }, { FrontLeft, { 0.7071f, 0.0f, 0.5f, 0.0f } },
{ FrontRight, { { 0.7071f, 0.0f, -0.5f, 0.0f }, { 0.7071f, 0.0f, -0.5f, 0.0f } } }, { FrontRight, { 0.7071f, 0.0f, -0.5f, 0.0f } },
}, QuadCfg[4] = { }, QuadCfg[4] = {
{ FrontLeft, { { 0.353558f, 0.306181f, 0.306192f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.117183f }, { 0.353553f, 0.250000f, 0.250000f, 0.0f } } }, { FrontLeft, { 0.353553f, 0.306184f, 0.306184f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.117186f } },
{ FrontRight, { { 0.353558f, 0.306181f, -0.306192f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.117183f }, { 0.353553f, 0.250000f, -0.250000f, 0.0f } } }, { FrontRight, { 0.353553f, 0.306184f, -0.306184f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.117186f } },
{ BackLeft, { { 0.353543f, -0.306192f, 0.306181f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.117193f }, { 0.353553f, -0.250000f, 0.250000f, 0.0f } } }, { BackLeft, { 0.353553f, -0.306184f, 0.306184f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.117186f } },
{ BackRight, { { 0.353543f, -0.306192f, -0.306181f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.117193f }, { 0.353553f, -0.250000f, -0.250000f, 0.0f } } }, { BackRight, { 0.353553f, -0.306184f, -0.306184f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.117186f } },
}, X51SideCfg[5] = { }, X51SideCfg[5] = {
{ FrontLeft, { { 0.208954f, 0.212846f, 0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, 0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, 0.047490f }, { 0.208954f, 0.162905f, 0.182425f, 0.0f } } }, { FrontLeft, { 0.208954f, 0.212846f, 0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, 0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, 0.047490f } },
{ FrontRight, { { 0.208954f, 0.212846f, -0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, -0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, -0.047490f }, { 0.208954f, 0.162905f, -0.182425f, 0.0f } } }, { FrontRight, { 0.208954f, 0.212846f, -0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, -0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, -0.047490f } },
{ FrontCenter, { { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f }, { 0.109403f, 0.137375f, 0.000000f, 0.0f } } }, { FrontCenter, { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f } },
{ SideLeft, { { 0.470936f, -0.369626f, 0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, -0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, -0.043968f }, { 0.470934f, -0.282903f, 0.267406f, 0.0f } } }, { SideLeft, { 0.470936f, -0.369626f, 0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, -0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, -0.043968f } },
{ SideRight, { { 0.470936f, -0.369626f, -0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, 0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, 0.043968f }, { 0.470934f, -0.282903f, -0.267406f, 0.0f } } }, { SideRight, { 0.470936f, -0.369626f, -0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, 0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, 0.043968f } },
}, X51RearCfg[5] = { }, X51RearCfg[5] = {
{ FrontLeft, { { 0.208954f, 0.212846f, 0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, 0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, 0.047490f }, { 0.208954f, 0.162905f, 0.182425f, 0.0f } } }, { FrontLeft, { 0.208954f, 0.212846f, 0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, 0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, 0.047490f } },
{ FrontRight, { { 0.208954f, 0.212846f, -0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, -0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, -0.047490f }, { 0.208954f, 0.162905f, -0.182425f, 0.0f } } }, { FrontRight, { 0.208954f, 0.212846f, -0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, -0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, -0.047490f } },
{ FrontCenter, { { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f }, { 0.109403f, 0.137375f, 0.000000f, 0.0f } } }, { FrontCenter, { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f } },
{ BackLeft, { { 0.470936f, -0.369626f, 0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, -0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, -0.043968f }, { 0.470934f, -0.282903f, 0.267406f, 0.0f } } }, { BackLeft, { 0.470936f, -0.369626f, 0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, -0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, -0.043968f } },
{ BackRight, { { 0.470936f, -0.369626f, -0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, 0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, 0.043968f }, { 0.470934f, -0.282903f, -0.267406f, 0.0f } } }, { BackRight, { 0.470936f, -0.369626f, -0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, 0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, 0.043968f } },
}, X61Cfg[6] = { }, X61Cfg[6] = {
{ FrontLeft, { { 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f }, { 0.167065f, 0.153519f, 0.132175f, 0.0f } } }, { FrontLeft, { 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f } },
{ FrontRight, { { 0.167065f, 0.200583f, -0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, -0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068910f }, { 0.167065f, 0.153519f, -0.132175f, 0.0f } } }, { FrontRight, { 0.167065f, 0.200583f, -0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, -0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068910f } },
{ FrontCenter, { { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f }, { 0.109403f, 0.137375f, 0.000000f, 0.0f } } }, { FrontCenter, { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f } },
{ BackCenter, { { 0.353556f, -0.461940f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.165723f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.000000f }, { 0.353556f, -0.353554f, 0.000000f, 0.0f } } }, { BackCenter, { 0.353556f, -0.461940f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.165723f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.000000f } },
{ SideLeft, { { 0.289151f, -0.081301f, 0.401292f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, -0.071420f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, -0.032897f }, { 0.289151f, -0.062225f, 0.307136f, 0.0f } } }, { SideLeft, { 0.289151f, -0.081301f, 0.401292f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, -0.071420f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, -0.032897f } },
{ SideRight, { { 0.289151f, -0.081301f, -0.401292f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, 0.071420f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, 0.032897f }, { 0.289151f, -0.062225f, -0.307136f, 0.0f } } }, { SideRight, { 0.289151f, -0.081301f, -0.401292f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, 0.071420f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, 0.032897f } },
}, X71Cfg[7] = { }, X71Cfg[7] = {
{ FrontLeft, { { 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f }, { 0.167065f, 0.153519f, 0.132175f, 0.0f } } }, { FrontLeft, { 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f } },
{ FrontRight, { { 0.167065f, 0.200583f, -0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, -0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068910f }, { 0.167065f, 0.153519f, -0.132175f, 0.0f } } }, { FrontRight, { 0.167065f, 0.200583f, -0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, -0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068910f } },
{ FrontCenter, { { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f }, { 0.109403f, 0.137375f, 0.000000f, 0.0f } } }, { FrontCenter, { 0.109403f, 0.179490f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, 0.000000f } },
{ BackLeft, { { 0.224752f, -0.295009f, 0.170325f, 0.0f, 0.0f, 0.0f, 0.0f, 0.105349f, -0.182473f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.065799f }, { 0.224752f, -0.225790f, 0.130361f, 0.0f } } }, { BackLeft, { 0.224752f, -0.295009f, 0.170325f, 0.0f, 0.0f, 0.0f, 0.0f, 0.105349f, -0.182473f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.065799f } },
{ BackRight, { { 0.224752f, -0.295009f, -0.170325f, 0.0f, 0.0f, 0.0f, 0.0f, 0.105349f, 0.182473f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.065799f }, { 0.224752f, -0.225790f, -0.130361f, 0.0f } } }, { BackRight, { 0.224752f, -0.295009f, -0.170325f, 0.0f, 0.0f, 0.0f, 0.0f, 0.105349f, 0.182473f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.065799f } },
{ SideLeft, { { 0.224739f, 0.000000f, 0.340644f, 0.0f, 0.0f, 0.0f, 0.0f, -0.210697f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.065795f }, { 0.224739f, 0.000000f, 0.260717f, 0.0f } } }, { SideLeft, { 0.224739f, 0.000000f, 0.340644f, 0.0f, 0.0f, 0.0f, 0.0f, -0.210697f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, -0.065795f } },
{ SideRight, { { 0.224739f, 0.000000f, -0.340644f, 0.0f, 0.0f, 0.0f, 0.0f, -0.210697f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.065795f }, { 0.224739f, 0.000000f, -0.260717f, 0.0f } } }, { SideRight, { 0.224739f, 0.000000f, -0.340644f, 0.0f, 0.0f, 0.0f, 0.0f, -0.210697f, 0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.065795f } },
}, BFormat3D[4] = { }, BFormat3D[4] = {
{ Aux0, { { 1.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f, 0.0f } } }, { Aux0, { 1.0f, 0.0f, 0.0f, 0.0f } },
{ Aux1, { { 0.0f, 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f, 0.0f } } }, { Aux1, { 0.0f, 1.0f, 0.0f, 0.0f } },
{ Aux2, { { 0.0f, 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f, 0.0f } } }, { Aux2, { 0.0f, 0.0f, 1.0f, 0.0f } },
{ Aux3, { { 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 0.0f, 0.0f, 1.0f } } }, { Aux3, { 0.0f, 0.0f, 0.0f, 1.0f } },
}; };
const ChannelMap *chanmap = NULL; const ChannelMap *chanmap = NULL;
ALfloat ambiscale = 1.0f;
size_t count = 0; size_t count = 0;
memset(device->Channel, 0, sizeof(device->Channel)); device->AmbiScale = 1.0f;
memset(device->AmbiCoeffs, 0, sizeof(device->AmbiCoeffs));
device->NumChannels = 0; device->NumChannels = 0;
if(device->Hrtf) if(device->Hrtf)
@ -357,12 +402,13 @@ ALvoid aluInitPanning(ALCdevice *device)
count = COUNTOF(BFormat3D); count = COUNTOF(BFormat3D);
chanmap = BFormat3D; chanmap = BFormat3D;
ambiscale = 1.0f;
for(i = 0;i < count;i++) for(i = 0;i < count;i++)
device->ChannelName[i] = chanmap[i].ChanName; device->ChannelName[i] = chanmap[i].ChanName;
for(;i < MAX_OUTPUT_CHANNELS;i++) for(;i < MAX_OUTPUT_CHANNELS;i++)
device->ChannelName[i] = InvalidChannel; device->ChannelName[i] = InvalidChannel;
SetChannelMap(device, chanmap, count); SetChannelMap(device, chanmap, count, ambiscale);
{ {
ALfloat (*coeffs_list[4])[2] = { ALfloat (*coeffs_list[4])[2] = {
@ -387,43 +433,51 @@ ALvoid aluInitPanning(ALCdevice *device)
case DevFmtMono: case DevFmtMono:
count = COUNTOF(MonoCfg); count = COUNTOF(MonoCfg);
chanmap = MonoCfg; chanmap = MonoCfg;
ambiscale = ZERO_ORDER_SCALE;
break; break;
case DevFmtStereo: case DevFmtStereo:
count = COUNTOF(StereoCfg); count = COUNTOF(StereoCfg);
chanmap = StereoCfg; chanmap = StereoCfg;
ambiscale = FIRST_ORDER_SCALE;
break; break;
case DevFmtQuad: case DevFmtQuad:
count = COUNTOF(QuadCfg); count = COUNTOF(QuadCfg);
chanmap = QuadCfg; chanmap = QuadCfg;
ambiscale = SECOND_ORDER_SCALE;
break; break;
case DevFmtX51: case DevFmtX51:
count = COUNTOF(X51SideCfg); count = COUNTOF(X51SideCfg);
chanmap = X51SideCfg; chanmap = X51SideCfg;
ambiscale = THIRD_ORDER_SCALE;
break; break;
case DevFmtX51Rear: case DevFmtX51Rear:
count = COUNTOF(X51RearCfg); count = COUNTOF(X51RearCfg);
chanmap = X51RearCfg; chanmap = X51RearCfg;
ambiscale = THIRD_ORDER_SCALE;
break; break;
case DevFmtX61: case DevFmtX61:
count = COUNTOF(X61Cfg); count = COUNTOF(X61Cfg);
chanmap = X61Cfg; chanmap = X61Cfg;
ambiscale = THIRD_ORDER_SCALE;
break; break;
case DevFmtX71: case DevFmtX71:
count = COUNTOF(X71Cfg); count = COUNTOF(X71Cfg);
chanmap = X71Cfg; chanmap = X71Cfg;
ambiscale = THIRD_ORDER_SCALE;
break; break;
case DevFmtBFormat3D: case DevFmtBFormat3D:
count = COUNTOF(BFormat3D); count = COUNTOF(BFormat3D);
chanmap = BFormat3D; chanmap = BFormat3D;
ambiscale = 1.0f;
break; break;
} }
SetChannelMap(device, chanmap, count); SetChannelMap(device, chanmap, count, ambiscale);
} }

View File

@ -626,10 +626,7 @@ enum HrtfMode {
* second-order has 9, and third-order has 16. */ * second-order has 9, and third-order has 16. */
#define MAX_AMBI_COEFFS 16 #define MAX_AMBI_COEFFS 16
typedef struct ChannelConfig { typedef ALfloat ChannelConfig[MAX_AMBI_COEFFS];
ALfloat HOACoeff[MAX_AMBI_COEFFS];
ALfloat FOACoeff[4];
} ChannelConfig;
#define HRTF_HISTORY_BITS (6) #define HRTF_HISTORY_BITS (6)
@ -722,7 +719,8 @@ struct ALCdevice_struct
ALuint Flags; ALuint Flags;
enum Channel ChannelName[MAX_OUTPUT_CHANNELS]; enum Channel ChannelName[MAX_OUTPUT_CHANNELS];
ChannelConfig Channel[MAX_OUTPUT_CHANNELS]; ChannelConfig AmbiCoeffs[MAX_OUTPUT_CHANNELS];
ALfloat AmbiScale; /* Scale for first-order XYZ inputs using AmbCoeffs. */
ALuint NumChannels; ALuint NumChannels;
ALuint64 ClockBase; ALuint64 ClockBase;