aboutsummaryrefslogtreecommitdiffstats
path: root/core/hrtf.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2021-04-22 10:26:20 -0700
committerChris Robinson <[email protected]>2021-04-22 10:26:20 -0700
commit65b85f7cb9cdac5cbad2cefbe2141141717c80cb (patch)
tree8766848438fc2ea0b32ffba7860b89c46e1728f6 /core/hrtf.h
parentd6d6fd73787bc159678a8c09cbf6833d2d336949 (diff)
Move hrtf.cpp/h to core
Diffstat (limited to 'core/hrtf.h')
-rw-r--r--core/hrtf.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/core/hrtf.h b/core/hrtf.h
new file mode 100644
index 00000000..f2dfc832
--- /dev/null
+++ b/core/hrtf.h
@@ -0,0 +1,91 @@
+#ifndef CORE_HRTF_H
+#define CORE_HRTF_H
+
+#include <array>
+#include <cstddef>
+#include <memory>
+#include <string>
+
+#include "almalloc.h"
+#include "aloptional.h"
+#include "alspan.h"
+#include "atomic.h"
+#include "ambidefs.h"
+#include "bufferline.h"
+#include "filters/splitter.h"
+#include "mixer/hrtfdefs.h"
+#include "intrusive_ptr.h"
+#include "vector.h"
+
+
+struct HrtfStore {
+ RefCount mRef;
+
+ uint sampleRate;
+ uint irSize;
+
+ struct Field {
+ float distance;
+ ubyte evCount;
+ };
+ /* NOTE: Fields are stored *backwards*. field[0] is the farthest field, and
+ * field[fdCount-1] is the nearest.
+ */
+ uint fdCount;
+ const Field *field;
+
+ struct Elevation {
+ ushort azCount;
+ ushort irOffset;
+ };
+ Elevation *elev;
+ const HrirArray *coeffs;
+ const ubyte2 *delays;
+
+ void add_ref();
+ void release();
+
+ DEF_PLACE_NEWDEL()
+};
+using HrtfStorePtr = al::intrusive_ptr<HrtfStore>;
+
+
+struct EvRadians { float value; };
+struct AzRadians { float value; };
+struct AngularPoint {
+ EvRadians Elev;
+ AzRadians Azim;
+};
+
+
+struct DirectHrtfState {
+ std::array<float,HrtfDirectDelay+BufferLineSize> mTemp;
+
+ /* HRTF filter state for dry buffer content */
+ uint mIrSize{0};
+ al::FlexArray<HrtfChannelState> mChannels;
+
+ DirectHrtfState(size_t numchans) : mChannels{numchans} { }
+ /**
+ * Produces HRTF filter coefficients for decoding B-Format, given a set of
+ * virtual speaker positions, a matching decoding matrix, and per-order
+ * 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,
+ const al::span<const AngularPoint> AmbiPoints, const float (*AmbiMatrix)[MaxAmbiChannels],
+ const float XOverFreq, const al::span<const float,MaxAmbiOrder+1> AmbiOrderHFGain);
+
+ static std::unique_ptr<DirectHrtfState> Create(size_t num_chans);
+
+ DEF_FAM_NEWDEL(DirectHrtfState, mChannels)
+};
+
+
+al::vector<std::string> EnumerateHrtf(al::optional<std::string> pathopt);
+HrtfStorePtr GetLoadedHrtf(const std::string &name, const uint devrate);
+
+void GetHrtfCoeffs(const HrtfStore *Hrtf, float elevation, float azimuth, float distance,
+ float spread, HrirArray &coeffs, const al::span<uint,2> delays);
+
+#endif /* CORE_HRTF_H */