]> git.tdb.fi Git - ext/openal.git/blob - core/cubic_tables.cpp
Import OpenAL Soft 1.23.1 sources
[ext/openal.git] / core / cubic_tables.cpp
1
2 #include "cubic_tables.h"
3
4 #include <algorithm>
5 #include <array>
6 #include <cassert>
7 #include <cmath>
8 #include <limits>
9 #include <memory>
10 #include <stdexcept>
11
12 #include "alnumbers.h"
13 #include "core/mixer/defs.h"
14
15
16 namespace {
17
18 using uint = unsigned int;
19
20 struct SplineFilterArray {
21     alignas(16) CubicCoefficients mTable[CubicPhaseCount]{};
22
23     constexpr SplineFilterArray()
24     {
25         /* Fill in the main coefficients. */
26         for(size_t pi{0};pi < CubicPhaseCount;++pi)
27         {
28             const double mu{static_cast<double>(pi) / CubicPhaseCount};
29             const double mu2{mu*mu}, mu3{mu2*mu};
30             mTable[pi].mCoeffs[0] = static_cast<float>(-0.5*mu3 +      mu2 + -0.5*mu);
31             mTable[pi].mCoeffs[1] = static_cast<float>( 1.5*mu3 + -2.5*mu2           + 1.0);
32             mTable[pi].mCoeffs[2] = static_cast<float>(-1.5*mu3 +  2.0*mu2 +  0.5*mu);
33             mTable[pi].mCoeffs[3] = static_cast<float>( 0.5*mu3 + -0.5*mu2);
34         }
35
36         /* Fill in the coefficient deltas. */
37         for(size_t pi{0};pi < CubicPhaseCount-1;++pi)
38         {
39             mTable[pi].mDeltas[0] = mTable[pi+1].mCoeffs[0] - mTable[pi].mCoeffs[0];
40             mTable[pi].mDeltas[1] = mTable[pi+1].mCoeffs[1] - mTable[pi].mCoeffs[1];
41             mTable[pi].mDeltas[2] = mTable[pi+1].mCoeffs[2] - mTable[pi].mCoeffs[2];
42             mTable[pi].mDeltas[3] = mTable[pi+1].mCoeffs[3] - mTable[pi].mCoeffs[3];
43         }
44
45         const size_t pi{CubicPhaseCount - 1};
46         mTable[pi].mDeltas[0] = -mTable[pi].mCoeffs[0];
47         mTable[pi].mDeltas[1] = -mTable[pi].mCoeffs[1];
48         mTable[pi].mDeltas[2] = 1.0f - mTable[pi].mCoeffs[2];
49         mTable[pi].mDeltas[3] = -mTable[pi].mCoeffs[3];
50     }
51
52     constexpr auto getTable() const noexcept { return al::as_span(mTable); }
53 };
54
55 constexpr SplineFilterArray SplineFilter{};
56
57 } // namespace
58
59 const CubicTable gCubicSpline{SplineFilter.getTable()};