35 constexpr void setBuffer(std::span<int32_t> buffer) { buffer_ = buffer; }
37 constexpr void mute() { std::fill(buffer_.begin(), buffer_.end(), 0); }
39 constexpr void setDamp(
float val) {
40 damp1_ = val * std::numeric_limits<int32_t>::max();
41 damp2_ = std::numeric_limits<int32_t>::max() - damp1_;
44 [[nodiscard]]
constexpr float getDamp()
const {
return damp1_ / std::numeric_limits<int32_t>::max(); }
46 constexpr void setFeedback(int32_t val) { feedback_ = val; }
48 [[nodiscard]]
constexpr int32_t getFeedback()
const {
return feedback_; }
51 inline int32_t process(int32_t input) {
52 int32_t output = buffer_[bufidx_];
54 filterstore_ = (multiply_32x32_rshift32_rounded(output, damp2_) +
55 multiply_32x32_rshift32_rounded(filterstore_, damp1_))
58 buffer_[bufidx_] = input + (multiply_32x32_rshift32_rounded(filterstore_, feedback_) << 1);
60 if (++bufidx_ >= buffer_.size()) {
69 int32_t filterstore_{0};
72 std::span<int32_t> buffer_;