Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
processor_chain.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <tuple>
7#include <cstddef>
8
9namespace pulp::signal {
10
25template<typename SampleType, typename... Processors>
27public:
28 ProcessorChainT() = default;
29
31 template<std::size_t Index>
32 auto& get() { return std::get<Index>(processors_); }
33
34 template<std::size_t Index>
35 const auto& get() const { return std::get<Index>(processors_); }
36
38 SampleType process(SampleType input) {
39 return process_impl(input, std::index_sequence_for<Processors...>{});
40 }
41
43 void process(SampleType* data, int num_samples) {
44 for (int i = 0; i < num_samples; ++i) {
45 data[i] = process(data[i]);
46 }
47 }
48
50 void reset() {
51 reset_impl(std::index_sequence_for<Processors...>{});
52 }
53
55 static constexpr std::size_t size() { return sizeof...(Processors); }
56
57private:
58 std::tuple<Processors...> processors_;
59
60 template<std::size_t... Is>
61 SampleType process_impl(SampleType input, std::index_sequence<Is...>) {
62 SampleType value = input;
63 ((value = std::get<Is>(processors_).process(value)), ...);
64 return value;
65 }
66
67 template<std::size_t I>
68 void reset_one() {
69 if constexpr (requires { std::get<I>(processors_).reset(); }) {
70 std::get<I>(processors_).reset();
71 }
72 }
73
74 template<std::size_t... Is>
75 void reset_impl(std::index_sequence<Is...>) {
76 (reset_one<Is>(), ...);
77 }
78};
79
80template<typename... Processors>
81using ProcessorChain = ProcessorChainT<float, Processors...>;
82
83template<typename... Processors>
84using ProcessorChain64 = ProcessorChainT<double, Processors...>;
85
86} // namespace pulp::signal
Chain multiple DSP processors in series.
Definition processor_chain.hpp:26
auto & get()
Access a processor by index.
Definition processor_chain.hpp:32
void process(SampleType *data, int num_samples)
Process a buffer in-place through the entire chain.
Definition processor_chain.hpp:43
static constexpr std::size_t size()
Number of processors in the chain.
Definition processor_chain.hpp:55
const auto & get() const
Definition processor_chain.hpp:35
void reset()
Reset all processors in the chain.
Definition processor_chain.hpp:50
SampleType process(SampleType input)
Process a single sample through the entire chain.
Definition processor_chain.hpp:38
Definition additive_bank.hpp:218
ProcessorChainT< float, Processors... > ProcessorChain
Definition processor_chain.hpp:81
ProcessorChainT< double, Processors... > ProcessorChain64
Definition processor_chain.hpp:84
@ i
Definition formant_filter_bank.hpp:20