aboutsummaryrefslogtreecommitdiffstats
path: root/core/mixer/defs.h
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2020-12-12 14:58:09 -0800
committerChris Robinson <[email protected]>2020-12-12 14:58:09 -0800
commite179bf0a12e80eb41041469bc04ba1fbcffe11e8 (patch)
tree0e42d2b17f1005fad29ec4f509b1530a15213b88 /core/mixer/defs.h
parent14df53411402bae0e5dcdea8bc0d2d3ba30e7923 (diff)
Move the mixer functions to core
Diffstat (limited to 'core/mixer/defs.h')
-rw-r--r--core/mixer/defs.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/core/mixer/defs.h b/core/mixer/defs.h
new file mode 100644
index 00000000..9dcf395f
--- /dev/null
+++ b/core/mixer/defs.h
@@ -0,0 +1,100 @@
+#ifndef CORE_MIXER_DEFS_H
+#define CORE_MIXER_DEFS_H
+
+#include <array>
+#include <stdlib.h>
+
+#include "alspan.h"
+#include "core/bufferline.h"
+
+struct HrtfChannelState;
+struct HrtfFilter;
+struct MixHrtfFilter;
+
+using uint = unsigned int;
+using float2 = std::array<float,2>;
+
+
+constexpr int MixerFracBits{12};
+constexpr int MixerFracOne{1 << MixerFracBits};
+constexpr int MixerFracMask{MixerFracOne - 1};
+
+/* Maximum number of samples to pad on the ends of a buffer for resampling.
+ * Note that the padding is symmetric (half at the beginning and half at the
+ * end)!
+ */
+constexpr int MaxResamplerPadding{48};
+
+constexpr float GainSilenceThreshold{0.00001f}; /* -100dB */
+
+
+enum class Resampler {
+ Point,
+ Linear,
+ Cubic,
+ FastBSinc12,
+ BSinc12,
+ FastBSinc24,
+ BSinc24,
+
+ Max = BSinc24
+};
+
+/* Interpolator state. Kind of a misnomer since the interpolator itself is
+ * stateless. This just keeps it from having to recompute scale-related
+ * mappings for every sample.
+ */
+struct BsincState {
+ float sf; /* Scale interpolation factor. */
+ uint m; /* Coefficient count. */
+ uint l; /* Left coefficient offset. */
+ /* Filter coefficients, followed by the phase, scale, and scale-phase
+ * delta coefficients. Starting at phase index 0, each subsequent phase
+ * index follows contiguously.
+ */
+ const float *filter;
+};
+
+union InterpState {
+ BsincState bsinc;
+};
+
+using ResamplerFunc = const float*(*)(const InterpState *state, const float *RESTRICT src,
+ uint frac, uint increment, const al::span<float> dst);
+
+ResamplerFunc PrepareResampler(Resampler resampler, uint increment, InterpState *state);
+
+
+template<typename TypeTag, typename InstTag>
+const float *Resample_(const InterpState *state, const float *RESTRICT src, uint frac,
+ uint increment, const al::span<float> dst);
+
+template<typename InstTag>
+void Mix_(const al::span<const float> InSamples, const al::span<FloatBufferLine> OutBuffer,
+ float *CurrentGains, const float *TargetGains, const size_t Counter, const size_t OutPos);
+
+template<typename InstTag>
+void MixHrtf_(const float *InSamples, float2 *AccumSamples, const uint IrSize,
+ const MixHrtfFilter *hrtfparams, const size_t BufferSize);
+template<typename InstTag>
+void MixHrtfBlend_(const float *InSamples, float2 *AccumSamples, const uint IrSize,
+ const HrtfFilter *oldparams, const MixHrtfFilter *newparams, const size_t BufferSize);
+template<typename InstTag>
+void MixDirectHrtf_(FloatBufferLine &LeftOut, FloatBufferLine &RightOut,
+ const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples,
+ float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize);
+
+/* Vectorized resampler helpers */
+inline void InitPosArrays(uint frac, uint increment, uint *frac_arr, uint *pos_arr, size_t size)
+{
+ pos_arr[0] = 0;
+ frac_arr[0] = frac;
+ for(size_t i{1};i < size;i++)
+ {
+ const uint frac_tmp{frac_arr[i-1] + increment};
+ pos_arr[i] = pos_arr[i-1] + (frac_tmp>>MixerFracBits);
+ frac_arr[i] = frac_tmp&MixerFracMask;
+ }
+}
+
+#endif /* CORE_MIXER_DEFS_H */