Deluge Firmware 1.3.0
Build date: 2025.06.05
Loading...
Searching...
No Matches
interpolate.h
1#pragma once
2#include "definitions_cxx.hpp"
3#include "deluge/dsp/stereo_sample.h"
4#include <array>
5#include <cstdint>
6
7extern const int16_t windowedSincKernel[][17][16];
8
9namespace deluge::dsp {
10struct [[gnu::hot]] Interpolator {
11
12 Interpolator() = default;
13 StereoSample interpolate(size_t channels, int32_t whichKernel, uint32_t oscPos);
14 StereoSample interpolateLinear(size_t channels, uint32_t oscPos);
15
16 [[gnu::always_inline]] constexpr void pushL(int16_t value) {
17#pragma unroll
18 for (int32_t i = kInterpolationMaxNumSamples - 1; i >= 1; i--) {
19 buffer_l[i] = buffer_l[i - 1];
20 }
21 buffer_l[0] = value;
22 }
23
24 [[gnu::always_inline]] constexpr void pushR(int16_t value) {
25#pragma unroll
26 for (int32_t i = kInterpolationMaxNumSamples - 1; i >= 1; i--) {
27 buffer_r[i] = buffer_r[i - 1];
28 }
29 buffer_r[0] = value;
30 }
31
32 [[gnu::always_inline]] constexpr void jumpForward(size_t num_samples) {
33#pragma unroll
34 for (int32_t i = kInterpolationMaxNumSamples - 1; i >= num_samples; i--) {
35 buffer_l[i] = buffer_l[i - num_samples];
36 buffer_r[i] = buffer_r[i - num_samples];
37 }
38 }
39
40 // These are the state buffers (quadword alignment for NEON)
41 alignas(sizeof(int32_t) * 4) std::array<int16_t, kInterpolationMaxNumSamples> buffer_l;
42 alignas(sizeof(int32_t) * 4) std::array<int16_t, kInterpolationMaxNumSamples> buffer_r;
43};
44} // namespace deluge::dsp
Definition stereo_sample.h:25