36 template <
typename Fn,
typename Tuple,
size_t... Ix>
45 template <
typename Fn,
typename Tuple>
46 constexpr void forEachInTuple (
Fn&& fn, Tuple&& tuple)
51 template <
typename Context,
size_t Ix>
52 inline constexpr auto useContextDirectly = ! Context::usesSeparateInputAndOutputBlocks() || Ix == 0;
61template <
typename... Processors>
82 detail::forEachInTuple ([&] (
auto& proc,
auto) { proc.prepare (spec); }, processors);
88 detail::forEachInTuple ([] (
auto& proc,
auto) { proc.reset(); }, processors);
92 template <
typename ProcessContext>
95 detail::forEachInTuple ([
this, &context] (
auto& proc,
auto index)
noexcept { this->processOne (context, proc, index); },
100 template <
typename Context,
typename Proc,
size_t Ix>
103 if constexpr (detail::useContextDirectly<Context, Ix>)
105 auto contextCopy = context;
106 contextCopy.isBypassed = (bypassed[Ix] || context.isBypassed);
108 proc.process (contextCopy);
112 jassert (context.getOutputBlock().getNumChannels() == context.getInputBlock().getNumChannels());
113 ProcessContextReplacing<typename Context::SampleType> replacingContext (context.getOutputBlock());
114 replacingContext.isBypassed = (bypassed[Ix] || context.isBypassed);
116 proc.process (replacingContext);
127template <
int Index,
typename... Processors>
130 return chain.template get<Index>();
136template <
int Index,
typename... Processors>
139 return chain.template get<Index>();
145template <
int Index,
typename... Processors>
148 chain.template setBypassed<Index> (bypassed);
154template <
int Index,
typename... Processors>
157 return chain.template isBypassed<Index>();
166JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE (
"-Wmismatched-tags")
176JUCE_END_IGNORE_WARNINGS_GCC_LIKE
This variadically-templated class lets you join together any number of processor classes into a singl...
bool isBypassed() const noexcept
Query whether the processor at index Index is bypassed.
void setBypassed(bool b) noexcept
Set the processor at index Index to be bypassed or enabled.
void prepare(const ProcessSpec &spec)
Prepare all inner processors with the provided ProcessSpec.
void reset()
Reset all inner processors.
auto & get() noexcept
Get a reference to the processor at index Index.
const auto & get() const noexcept
Get a reference to the processor at index Index.
void process(const ProcessContext &context) noexcept
Process context through all inner processors in sequence.
auto & get(ProcessorChain< Processors... > &chain) noexcept
Non-member equivalent of ProcessorChain::get which avoids awkward member template syntax.
void setBypassed(ProcessorChain< Processors... > &chain, bool bypassed) noexcept
Non-member equivalent of ProcessorChain::setBypassed which avoids awkward member template syntax.
bool isBypassed(const ProcessorChain< Processors... > &chain) noexcept
Non-member equivalent of ProcessorChain::isBypassed which avoids awkward member template syntax.
This structure is passed into a DSP algorithm's prepare() method, and contains information about vari...