Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
processor_duplicator.hpp
Go to the documentation of this file.
1#pragma once
2
3// ProcessorDuplicator — apply a mono processor to multiple channels.
4// Template that wraps a mono DSP processor and applies it independently
5// to each channel of a multi-channel buffer.
6
7#include <algorithm>
8#include <cstddef>
9#include <vector>
10
11namespace pulp::signal {
12
29template<typename P, typename SampleType = float>
31public:
33
35 void prepare(int num_channels, SampleType sample_rate) {
36 processors_.resize(static_cast<std::size_t>(std::max(0, num_channels)));
37 for (auto& p : processors_) {
38 p.set_sample_rate(sample_rate);
39 }
40 }
41
46 void process(SampleType* const* channels, int num_channels, int num_samples) {
47 if (channels == nullptr || num_channels <= 0 || num_samples <= 0)
48 return;
49
50 int count = std::min(num_channels, static_cast<int>(processors_.size()));
51 for (int ch = 0; ch < count; ++ch) {
52 if (channels[ch] == nullptr)
53 continue;
54
55 process_buffer(processors_[ch], channels[ch], num_samples);
56 }
57 }
58
60 void process_channel(SampleType* buffer, int channel, int num_samples) {
61 if (buffer == nullptr || num_samples <= 0 ||
62 channel < 0 || channel >= static_cast<int>(processors_.size())) return;
63
64 process_buffer(processors_[static_cast<std::size_t>(channel)], buffer, num_samples);
65 }
66
68 P& operator[](int channel) { return processors_[static_cast<size_t>(channel)]; }
69 const P& operator[](int channel) const { return processors_[static_cast<size_t>(channel)]; }
70
72 template<typename Func>
73 void for_each(Func&& fn) {
74 for (auto& p : processors_)
75 fn(p);
76 }
77
79 void reset() {
80 for (auto& p : processors_)
81 p.reset();
82 }
83
84 int num_channels() const { return static_cast<int>(processors_.size()); }
85
86 private:
87 static void process_buffer(P& processor, SampleType* buffer, int num_samples) {
88 if constexpr (requires { processor.process(buffer, num_samples); }) {
89 processor.process(buffer, num_samples);
90 } else {
91 for (int i = 0; i < num_samples; ++i)
92 buffer[i] = processor.process(buffer[i]);
93 }
94 }
95
96 std::vector<P> processors_;
97};
98
99template<typename P>
101
102template<typename P>
104
105} // namespace pulp::signal
Duplicates a mono processor across N channels.
Definition processor_duplicator.hpp:30
void reset()
Reset all channel processors.
Definition processor_duplicator.hpp:79
void for_each(Func &&fn)
Set parameters on all channel processors.
Definition processor_duplicator.hpp:73
P & operator[](int channel)
Access individual channel processor (e.g., to set parameters).
Definition processor_duplicator.hpp:68
int num_channels() const
Definition processor_duplicator.hpp:84
void process(SampleType *const *channels, int num_channels, int num_samples)
Process a multi-channel buffer in-place channels: array of channel pointers num_channels: number of c...
Definition processor_duplicator.hpp:46
void prepare(int num_channels, SampleType sample_rate)
Prepare for processing with the given number of channels.
Definition processor_duplicator.hpp:35
void process_channel(SampleType *buffer, int channel, int num_samples)
Process a single channel.
Definition processor_duplicator.hpp:60
const P & operator[](int channel) const
Definition processor_duplicator.hpp:69
Definition additive_bank.hpp:218
@ buffer
A borrowed static buffer with a traversable playhead.
Definition granular.hpp:110
ProcessorDuplicatorT< P, double > ProcessorDuplicator64
Definition processor_duplicator.hpp:103
@ i
Definition formant_filter_bank.hpp:20
ProcessorDuplicatorT< P, float > ProcessorDuplicator
Definition processor_duplicator.hpp:100