Compare commits
5 Commits
042c3d4a42
...
f2ff2bb2f6
Author | SHA1 | Date |
---|---|---|
Chris Robinson | f2ff2bb2f6 | |
Chris Robinson | d2a2a696a1 | |
Chris Robinson | e5c49d019f | |
Chris Robinson | 02cf2bde7b | |
Chris Robinson | bf3f63fb4c |
|
@ -420,7 +420,7 @@ void ConvolutionState::update(const ContextBase *context, const EffectSlot *slot
|
|||
if(device->mAmbiOrder > mAmbiOrder)
|
||||
{
|
||||
mMix = &ConvolutionState::UpsampleMix;
|
||||
const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, true);
|
||||
const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, device->mAmbiOrder);
|
||||
(*mChans)[0].mHfScale = scales[0];
|
||||
for(size_t i{1};i < mChans->size();++i)
|
||||
(*mChans)[i].mHfScale = scales[1];
|
||||
|
|
|
@ -686,7 +686,7 @@ void ReverbState::deviceUpdate(const DeviceBase *device, const Buffer&)
|
|||
if(device->mAmbiOrder > 1)
|
||||
{
|
||||
mUpmixOutput = true;
|
||||
mOrderScales = AmbiScale::GetHFOrderScales(1, true);
|
||||
mOrderScales = AmbiScale::GetHFOrderScales(1, device->mAmbiOrder);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -719,10 +719,13 @@ void InitHrtfPanning(ALCdevice *device)
|
|||
constexpr float Deg_90{Deg180 / 2.0f /* 90 degrees*/};
|
||||
constexpr float Deg_45{Deg_90 / 2.0f /* 45 degrees*/};
|
||||
constexpr float Deg135{Deg_45 * 3.0f /*135 degrees*/};
|
||||
constexpr float Deg_21{3.648638281e-01f /* 20~ 21 degrees*/};
|
||||
constexpr float Deg_32{5.535743589e-01f /* 31~ 32 degrees*/};
|
||||
constexpr float Deg_35{6.154797087e-01f /* 35~ 36 degrees*/};
|
||||
constexpr float Deg_58{1.017221968e+00f /* 58~ 59 degrees*/};
|
||||
constexpr float Deg_69{1.205932499e+00f /* 69~ 70 degrees*/};
|
||||
constexpr float Deg111{1.935660155e+00f /*110~111 degrees*/};
|
||||
constexpr float Deg_21{3.648638281e-01f /* 20~ 21 degrees*/};
|
||||
constexpr float Deg122{2.124370686e+00f /*121~122 degrees*/};
|
||||
static const AngularPoint AmbiPoints1O[]{
|
||||
{ EvRadians{ Deg_35}, AzRadians{-Deg_45} },
|
||||
{ EvRadians{ Deg_35}, AzRadians{-Deg135} },
|
||||
|
@ -733,20 +736,18 @@ void InitHrtfPanning(ALCdevice *device)
|
|||
{ EvRadians{-Deg_35}, AzRadians{ Deg_45} },
|
||||
{ EvRadians{-Deg_35}, AzRadians{ Deg135} },
|
||||
}, AmbiPoints2O[]{
|
||||
{ EvRadians{ 0.0f}, AzRadians{ 0.0f} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{ Deg180} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{-Deg_90} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{ Deg_90} },
|
||||
{ EvRadians{ Deg_90}, AzRadians{ 0.0f} },
|
||||
{ EvRadians{-Deg_90}, AzRadians{ 0.0f} },
|
||||
{ EvRadians{ Deg_35}, AzRadians{-Deg_45} },
|
||||
{ EvRadians{ Deg_35}, AzRadians{-Deg135} },
|
||||
{ EvRadians{ Deg_35}, AzRadians{ Deg_45} },
|
||||
{ EvRadians{ Deg_35}, AzRadians{ Deg135} },
|
||||
{ EvRadians{-Deg_35}, AzRadians{-Deg_45} },
|
||||
{ EvRadians{-Deg_35}, AzRadians{-Deg135} },
|
||||
{ EvRadians{-Deg_35}, AzRadians{ Deg_45} },
|
||||
{ EvRadians{-Deg_35}, AzRadians{ Deg135} },
|
||||
{ EvRadians{-Deg_32}, AzRadians{ 0.0f} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{ Deg_58} },
|
||||
{ EvRadians{ Deg_58}, AzRadians{ Deg_90} },
|
||||
{ EvRadians{ Deg_32}, AzRadians{ 0.0f} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{ Deg122} },
|
||||
{ EvRadians{-Deg_58}, AzRadians{-Deg_90} },
|
||||
{ EvRadians{-Deg_32}, AzRadians{ Deg180} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{-Deg122} },
|
||||
{ EvRadians{ Deg_58}, AzRadians{-Deg_90} },
|
||||
{ EvRadians{ Deg_32}, AzRadians{ Deg180} },
|
||||
{ EvRadians{ 0.0f}, AzRadians{-Deg_58} },
|
||||
{ EvRadians{-Deg_58}, AzRadians{ Deg_90} },
|
||||
}, AmbiPoints3O[]{
|
||||
{ EvRadians{ Deg_69}, AzRadians{-Deg_90} },
|
||||
{ EvRadians{ Deg_69}, AzRadians{ Deg_90} },
|
||||
|
@ -779,20 +780,18 @@ void InitHrtfPanning(ALCdevice *device)
|
|||
{ 1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f, 1.250000000e-01f },
|
||||
{ 1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f, -1.250000000e-01f },
|
||||
}, AmbiMatrix2O[][MaxAmbiChannels]{
|
||||
{ 7.142857143e-02f, 0.000000000e+00f, 0.000000000e+00f, 1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, 1.290994449e-01f, },
|
||||
{ 7.142857143e-02f, 0.000000000e+00f, 0.000000000e+00f, -1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, 1.290994449e-01f, },
|
||||
{ 7.142857143e-02f, 1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, -1.290994449e-01f, },
|
||||
{ 7.142857143e-02f, -1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, -1.290994449e-01f, },
|
||||
{ 7.142857143e-02f, 0.000000000e+00f, 1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 1.490711985e-01f, 0.000000000e+00f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, 0.000000000e+00f, -1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 1.490711985e-01f, 0.000000000e+00f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, 9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, -9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, -9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, 9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, 9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, -9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, -9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, 9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, },
|
||||
{ 8.333333333e-02f, 0.000000000e+00f, -7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, -1.443375673e-01f, 1.167715449e-01f, },
|
||||
{ 8.333333333e-02f, -1.227808683e-01f, 0.000000000e+00f, 7.588274978e-02f, -1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, },
|
||||
{ 8.333333333e-02f, -7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, },
|
||||
{ 8.333333333e-02f, 0.000000000e+00f, 7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, 1.443375673e-01f, 1.167715449e-01f, },
|
||||
{ 8.333333333e-02f, -1.227808683e-01f, 0.000000000e+00f, -7.588274978e-02f, 1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, },
|
||||
{ 8.333333333e-02f, 7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, },
|
||||
{ 8.333333333e-02f, 0.000000000e+00f, -7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, 1.443375673e-01f, 1.167715449e-01f, },
|
||||
{ 8.333333333e-02f, 1.227808683e-01f, 0.000000000e+00f, -7.588274978e-02f, -1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, },
|
||||
{ 8.333333333e-02f, 7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, 1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, },
|
||||
{ 8.333333333e-02f, 0.000000000e+00f, 7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, -1.443375673e-01f, 1.167715449e-01f, },
|
||||
{ 8.333333333e-02f, 1.227808683e-01f, 0.000000000e+00f, 7.588274978e-02f, 1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, },
|
||||
{ 8.333333333e-02f, -7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, 1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, },
|
||||
}, AmbiMatrix3O[][MaxAmbiChannels]{
|
||||
{ 5.000000000e-02f, 3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, 6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f, -1.256118221e-01f, 0.000000000e+00f, 1.126112056e-01f, 7.944389175e-02f, 0.000000000e+00f, 2.421151497e-02f, 0.000000000e+00f, },
|
||||
{ 5.000000000e-02f, -3.090169944e-02f, 8.090169944e-02f, 0.000000000e+00f, 0.000000000e+00f, -6.454972244e-02f, 9.045084972e-02f, 0.000000000e+00f, -1.232790000e-02f, 1.256118221e-01f, 0.000000000e+00f, -1.126112056e-01f, 7.944389175e-02f, 0.000000000e+00f, 2.421151497e-02f, 0.000000000e+00f, },
|
||||
|
@ -818,8 +817,8 @@ void InitHrtfPanning(ALCdevice *device)
|
|||
static const float AmbiOrderHFGain1O[MaxAmbiOrder+1]{
|
||||
/*ENRGY*/ 2.000000000e+00f, 1.154700538e+00f
|
||||
}, AmbiOrderHFGain2O[MaxAmbiOrder+1]{
|
||||
/*ENRGY 1.972026594e+00f, 1.527525232e+00f, 7.888106377e-01f*/
|
||||
/*AMP*/ 1.000000000e+00f, 7.745966692e-01f, 4.000000000e-01f
|
||||
/*ENRGY*/ 1.825741858e+00f, 1.414213562e+00f, 7.302967433e-01f
|
||||
/*AMP 1.000000000e+00f, 7.745966692e-01f, 4.000000000e-01f*/
|
||||
/*RMS 9.128709292e-01f, 7.071067812e-01f, 3.651483717e-01f*/
|
||||
}, AmbiOrderHFGain3O[MaxAmbiOrder+1]{
|
||||
/*ENRGY 1.865086714e+00f, 1.606093894e+00f, 1.142055301e+00f, 5.683795528e-01f*/
|
||||
|
@ -889,11 +888,13 @@ void InitHrtfPanning(ALCdevice *device)
|
|||
(device->mRenderMode == RenderMode::Hrtf) ? "+ Full " : "",
|
||||
device->mHrtfName.c_str());
|
||||
|
||||
bool perHrirMin{false};
|
||||
al::span<const AngularPoint> AmbiPoints{AmbiPoints1O};
|
||||
const float (*AmbiMatrix)[MaxAmbiChannels]{AmbiMatrix1O};
|
||||
al::span<const float,MaxAmbiOrder+1> AmbiOrderHFGain{AmbiOrderHFGain1O};
|
||||
if(ambi_order >= 3)
|
||||
{
|
||||
perHrirMin = true;
|
||||
AmbiPoints = AmbiPoints3O;
|
||||
AmbiMatrix = AmbiMatrix3O;
|
||||
AmbiOrderHFGain = AmbiOrderHFGain3O;
|
||||
|
@ -915,7 +916,7 @@ void InitHrtfPanning(ALCdevice *device)
|
|||
|
||||
HrtfStore *Hrtf{device->mHrtf.get()};
|
||||
auto hrtfstate = DirectHrtfState::Create(count);
|
||||
hrtfstate->build(Hrtf, device->mIrSize, AmbiPoints, AmbiMatrix, device->mXOverFreq,
|
||||
hrtfstate->build(Hrtf, device->mIrSize, perHrirMin, AmbiPoints, AmbiMatrix, device->mXOverFreq,
|
||||
AmbiOrderHFGain);
|
||||
device->mHrtfState = std::move(hrtfstate);
|
||||
|
||||
|
|
|
@ -14,6 +14,22 @@ constexpr auto inv_sqrt2f = static_cast<float>(1.0/al::numbers::sqrt2);
|
|||
constexpr auto inv_sqrt3f = static_cast<float>(1.0/al::numbers::sqrt3);
|
||||
|
||||
|
||||
/* These HF gains are derived from the same 32-point speaker array. The scale
|
||||
* factor between orders represents the same scale factors for any (regular)
|
||||
* speaker array decoder. e.g. Given a first-order source and second-order
|
||||
* output, applying an HF scale of HFScales[1][0] / HFScales[2][0] to channel 0
|
||||
* will result in that channel being subsequently decoded for second-order as
|
||||
* if it was a first-order decoder for that same speaker array.
|
||||
*/
|
||||
constexpr std::array<std::array<float,MaxAmbiOrder+1>,MaxAmbiOrder+1> HFScales{{
|
||||
{{ 4.000000000e+00f, 2.309401077e+00f, 1.192569588e+00f, 7.189495850e-01f }},
|
||||
{{ 4.000000000e+00f, 2.309401077e+00f, 1.192569588e+00f, 7.189495850e-01f }},
|
||||
{{ 2.981423970e+00f, 2.309401077e+00f, 1.192569588e+00f, 7.189495850e-01f }},
|
||||
{{ 2.359168820e+00f, 2.031565936e+00f, 1.444598386e+00f, 7.189495850e-01f }},
|
||||
/* 1.947005434e+00f, 1.764337084e+00f, 1.424707344e+00f, 9.755104127e-01f, 4.784482742e-01f */
|
||||
}};
|
||||
|
||||
|
||||
constexpr std::array<std::array<float,4>,8> FirstOrderDecoder{{
|
||||
{{ 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, }},
|
||||
{{ 1.250000000e-01f, 1.250000000e-01f, 1.250000000e-01f, -1.250000000e-01f, }},
|
||||
|
@ -99,37 +115,33 @@ auto CalcFirstOrder2DUp()
|
|||
}
|
||||
|
||||
|
||||
constexpr std::array<std::array<float,9>,14> SecondOrderDecoder{{
|
||||
{{ 7.142857143e-02f, 0.000000000e+00f, 0.000000000e+00f, 1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, 1.290994449e-01f, }},
|
||||
{{ 7.142857143e-02f, 0.000000000e+00f, 0.000000000e+00f, -1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, 1.290994449e-01f, }},
|
||||
{{ 7.142857143e-02f, 1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, -1.290994449e-01f, }},
|
||||
{{ 7.142857143e-02f, -1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, -7.453559925e-02f, 0.000000000e+00f, -1.290994449e-01f, }},
|
||||
{{ 7.142857143e-02f, 0.000000000e+00f, 1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 1.490711985e-01f, 0.000000000e+00f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, 0.000000000e+00f, -1.237179148e-01f, 0.000000000e+00f, 0.000000000e+00f, 0.000000000e+00f, 1.490711985e-01f, 0.000000000e+00f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, 9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, -9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, 7.142857143e-02f, -9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, 9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, 9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, 7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, -9.682458366e-02f, -9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, 7.142857143e-02f, -9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, -9.682458366e-02f, 0.000000000e+00f, }},
|
||||
{{ 7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, -7.142857143e-02f, 9.682458366e-02f, 9.682458366e-02f, 0.000000000e+00f, 9.682458366e-02f, 0.000000000e+00f, }},
|
||||
constexpr std::array<std::array<float,9>,12> SecondOrderDecoder{{
|
||||
{{ 8.333333333e-02f, 0.000000000e+00f, -7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, -1.443375673e-01f, 1.167715449e-01f, }},
|
||||
{{ 8.333333333e-02f, -1.227808683e-01f, 0.000000000e+00f, 7.588274978e-02f, -1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, }},
|
||||
{{ 8.333333333e-02f, -7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, }},
|
||||
{{ 8.333333333e-02f, 0.000000000e+00f, 7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, 1.443375673e-01f, 1.167715449e-01f, }},
|
||||
{{ 8.333333333e-02f, -1.227808683e-01f, 0.000000000e+00f, -7.588274978e-02f, 1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, }},
|
||||
{{ 8.333333333e-02f, 7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, }},
|
||||
{{ 8.333333333e-02f, 0.000000000e+00f, -7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, 1.443375673e-01f, 1.167715449e-01f, }},
|
||||
{{ 8.333333333e-02f, 1.227808683e-01f, 0.000000000e+00f, -7.588274978e-02f, -1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, }},
|
||||
{{ 8.333333333e-02f, 7.588274978e-02f, 1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, 1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, }},
|
||||
{{ 8.333333333e-02f, 0.000000000e+00f, 7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, -1.591525047e-02f, -1.443375673e-01f, 1.167715449e-01f, }},
|
||||
{{ 8.333333333e-02f, 1.227808683e-01f, 0.000000000e+00f, 7.588274978e-02f, 1.443375673e-01f, 0.000000000e+00f, -9.316949906e-02f, 0.000000000e+00f, -7.216878365e-02f, }},
|
||||
{{ 8.333333333e-02f, -7.588274978e-02f, -1.227808683e-01f, 0.000000000e+00f, 0.000000000e+00f, 1.443375673e-01f, 1.090847495e-01f, 0.000000000e+00f, -4.460276122e-02f, }},
|
||||
}};
|
||||
constexpr std::array<AmbiChannelFloatArray,14> SecondOrderEncoder{{
|
||||
CalcAmbiCoeffs( 0.0000000f, 0.0000000f, 1.0000000f),
|
||||
CalcAmbiCoeffs( 0.0000000f, 0.0000000f, -1.0000000f),
|
||||
CalcAmbiCoeffs( 1.0000000f, 0.0000000f, 0.0000000f),
|
||||
CalcAmbiCoeffs(-1.0000000f, 0.0000000f, 0.0000000f),
|
||||
CalcAmbiCoeffs( 0.0000000f, 1.0000000f, 0.0000000f),
|
||||
CalcAmbiCoeffs( 0.0000000f, -1.0000000f, 0.0000000f),
|
||||
CalcAmbiCoeffs( inv_sqrt3f, inv_sqrt3f, inv_sqrt3f),
|
||||
CalcAmbiCoeffs( inv_sqrt3f, inv_sqrt3f, -inv_sqrt3f),
|
||||
CalcAmbiCoeffs(-inv_sqrt3f, inv_sqrt3f, inv_sqrt3f),
|
||||
CalcAmbiCoeffs(-inv_sqrt3f, inv_sqrt3f, -inv_sqrt3f),
|
||||
CalcAmbiCoeffs( inv_sqrt3f, -inv_sqrt3f, inv_sqrt3f),
|
||||
CalcAmbiCoeffs( inv_sqrt3f, -inv_sqrt3f, -inv_sqrt3f),
|
||||
CalcAmbiCoeffs(-inv_sqrt3f, -inv_sqrt3f, inv_sqrt3f),
|
||||
CalcAmbiCoeffs(-inv_sqrt3f, -inv_sqrt3f, -inv_sqrt3f),
|
||||
constexpr std::array<AmbiChannelFloatArray,12> SecondOrderEncoder{{
|
||||
CalcAmbiCoeffs( 0.000000000e+00f, -5.257311121e-01f, 8.506508084e-01f),
|
||||
CalcAmbiCoeffs(-8.506508084e-01f, 0.000000000e+00f, 5.257311121e-01f),
|
||||
CalcAmbiCoeffs(-5.257311121e-01f, 8.506508084e-01f, 0.000000000e+00f),
|
||||
CalcAmbiCoeffs( 0.000000000e+00f, 5.257311121e-01f, 8.506508084e-01f),
|
||||
CalcAmbiCoeffs(-8.506508084e-01f, 0.000000000e+00f, -5.257311121e-01f),
|
||||
CalcAmbiCoeffs( 5.257311121e-01f, -8.506508084e-01f, 0.000000000e+00f),
|
||||
CalcAmbiCoeffs( 0.000000000e+00f, -5.257311121e-01f, -8.506508084e-01f),
|
||||
CalcAmbiCoeffs( 8.506508084e-01f, 0.000000000e+00f, -5.257311121e-01f),
|
||||
CalcAmbiCoeffs( 5.257311121e-01f, 8.506508084e-01f, 0.000000000e+00f),
|
||||
CalcAmbiCoeffs( 0.000000000e+00f, 5.257311121e-01f, -8.506508084e-01f),
|
||||
CalcAmbiCoeffs( 8.506508084e-01f, 0.000000000e+00f, 5.257311121e-01f),
|
||||
CalcAmbiCoeffs(-5.257311121e-01f, -8.506508084e-01f, 0.000000000e+00f),
|
||||
}};
|
||||
static_assert(SecondOrderDecoder.size() == SecondOrderEncoder.size(), "Second-order mismatch");
|
||||
|
||||
|
@ -371,21 +383,14 @@ const std::array<AmbiChannelFloatArray,16> AmbiScale::ThirdOrderUp{CalcThirdOrde
|
|||
const std::array<AmbiChannelFloatArray,16> AmbiScale::ThirdOrder2DUp{CalcThirdOrder2DUp()};
|
||||
const std::array<AmbiChannelFloatArray,25> AmbiScale::FourthOrder2DUp{CalcFourthOrder2DUp()};
|
||||
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale1O{{
|
||||
2.000000000e+00f, 1.154700538e+00f
|
||||
}};
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale1O2D{{
|
||||
1.414213562e+00f, 1.000000000e+00f
|
||||
}};
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale2O{{
|
||||
1.972026594e+00f, 1.527525232e+00f, 7.888106377e-01f
|
||||
}};
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale2O2D{{
|
||||
1.414213562e+00f, 1.224744871e+00f, 7.071067812e-01f
|
||||
}};
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale3O{{
|
||||
1.865086714e+00f, 1.606093894e+00f, 1.142055301e+00f, 5.683795528e-01f
|
||||
}};
|
||||
const std::array<float,MaxAmbiOrder+1> AmbiScale::DecoderHFScale3O2D{{
|
||||
1.414213562e+00f, 1.306562965e+00f, 1.000000000e+00f, 5.411961001e-01f
|
||||
}};
|
||||
|
||||
std::array<float,MaxAmbiOrder+1> AmbiScale::GetHFOrderScales(const uint src_order,
|
||||
const uint dev_order) noexcept
|
||||
{
|
||||
std::array<float,MaxAmbiOrder+1> res{};
|
||||
|
||||
for(size_t i{0};i < MaxAmbiOrder+1;++i)
|
||||
res[i] = HFScales[src_order][i] / HFScales[dev_order][i];
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -114,19 +114,8 @@ struct AmbiScale {
|
|||
}
|
||||
|
||||
/* Retrieves per-order HF scaling factors for "upsampling" ambisonic data. */
|
||||
static std::array<float,MaxAmbiOrder+1> GetHFOrderScales(const uint order, const bool is3D) noexcept
|
||||
{
|
||||
if(order >= 3) return is3D ? DecoderHFScale3O : DecoderHFScale3O2D;
|
||||
if(order == 2) return is3D ? DecoderHFScale2O : DecoderHFScale2O2D;
|
||||
return is3D ? DecoderHFScale1O : DecoderHFScale1O2D;
|
||||
}
|
||||
|
||||
static const std::array<float,MaxAmbiOrder+1> DecoderHFScale1O;
|
||||
static const std::array<float,MaxAmbiOrder+1> DecoderHFScale1O2D;
|
||||
static const std::array<float,MaxAmbiOrder+1> DecoderHFScale2O;
|
||||
static const std::array<float,MaxAmbiOrder+1> DecoderHFScale2O2D;
|
||||
static const std::array<float,MaxAmbiOrder+1> DecoderHFScale3O;
|
||||
static const std::array<float,MaxAmbiOrder+1> DecoderHFScale3O2D;
|
||||
static std::array<float,MaxAmbiOrder+1> GetHFOrderScales(const uint src_order,
|
||||
const uint dev_order) noexcept;
|
||||
|
||||
static const std::array<std::array<float,MaxAmbiChannels>,4> FirstOrderUp;
|
||||
static const std::array<std::array<float,MaxAmbiChannels>,4> FirstOrder2DUp;
|
||||
|
|
|
@ -262,7 +262,7 @@ void GetHrtfCoeffs(const HrtfStore *Hrtf, float elevation, float azimuth, float
|
|||
std::unique_ptr<DirectHrtfState> DirectHrtfState::Create(size_t num_chans)
|
||||
{ return std::unique_ptr<DirectHrtfState>{new(FamCount(num_chans)) DirectHrtfState{num_chans}}; }
|
||||
|
||||
void DirectHrtfState::build(const HrtfStore *Hrtf, const uint irSize,
|
||||
void DirectHrtfState::build(const HrtfStore *Hrtf, const uint irSize, const bool perHrirMin,
|
||||
const al::span<const AngularPoint> AmbiPoints, const float (*AmbiMatrix)[MaxAmbiChannels],
|
||||
const float XOverFreq, const al::span<const float,MaxAmbiOrder+1> AmbiOrderHFGain)
|
||||
{
|
||||
|
@ -318,13 +318,12 @@ void DirectHrtfState::build(const HrtfStore *Hrtf, const uint irSize,
|
|||
TRACE("Min delay: %.2f, max delay: %.2f, FIR length: %u\n",
|
||||
min_delay/double{HrirDelayFracOne}, max_delay/double{HrirDelayFracOne}, irSize);
|
||||
|
||||
const bool per_hrir_min{mChannels.size() > AmbiChannelsFromOrder(1)};
|
||||
auto tmpres = al::vector<std::array<double2,HrirLength>>(mChannels.size());
|
||||
max_delay = 0;
|
||||
for(size_t c{0u};c < AmbiPoints.size();++c)
|
||||
{
|
||||
const ConstHrirSpan hrir{impres[c].hrir};
|
||||
const uint base_delay{per_hrir_min ? minu(impres[c].ldelay, impres[c].rdelay) : min_delay};
|
||||
const uint base_delay{perHrirMin ? minu(impres[c].ldelay, impres[c].rdelay) : min_delay};
|
||||
const uint ldelay{hrir_delay_round(impres[c].ldelay - base_delay)};
|
||||
const uint rdelay{hrir_delay_round(impres[c].rdelay - base_delay)};
|
||||
max_delay = maxu(max_delay, maxu(impres[c].ldelay, impres[c].rdelay) - base_delay);
|
||||
|
|
|
@ -71,7 +71,7 @@ struct DirectHrtfState {
|
|||
* high-frequency gains for the decoder. The calculated impulse responses
|
||||
* are ordered and scaled according to the matrix input.
|
||||
*/
|
||||
void build(const HrtfStore *Hrtf, const uint irSize,
|
||||
void build(const HrtfStore *Hrtf, const uint irSize, const bool perHrirMin,
|
||||
const al::span<const AngularPoint> AmbiPoints, const float (*AmbiMatrix)[MaxAmbiChannels],
|
||||
const float XOverFreq, const al::span<const float,MaxAmbiOrder+1> AmbiOrderHFGain);
|
||||
|
||||
|
|
|
@ -899,7 +899,7 @@ void Voice::prepare(DeviceBase *device)
|
|||
{
|
||||
const uint8_t *OrderFromChan{Is2DAmbisonic(mFmtChannels) ?
|
||||
AmbiIndex::OrderFrom2DChannel().data() : AmbiIndex::OrderFromChannel().data()};
|
||||
const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, !Is2DAmbisonic(mFmtChannels));
|
||||
const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, device->mAmbiOrder);
|
||||
|
||||
const BandSplitter splitter{device->mXOverFreq / static_cast<float>(device->Frequency)};
|
||||
for(auto &chandata : mChans)
|
||||
|
|
Loading…
Reference in New Issue