LMMS
Loading...
Searching...
No Matches
juce_ProcessorChain.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28namespace dsp
29{
30
31//==============================================================================
32#ifndef DOXYGEN
36namespace detail
37{
38 template <typename Fn, typename Tuple, size_t... Ix>
39 constexpr void forEachInTuple (Fn&& fn, Tuple&& tuple, std::index_sequence<Ix...>)
40 {
41 (void) std::initializer_list<int> { ((void) fn (std::get<Ix> (tuple), std::integral_constant<size_t, Ix>()), 0)... };
42 }
43
44 template <typename T>
45 using TupleIndexSequence = std::make_index_sequence<std::tuple_size<std::remove_cv_t<std::remove_reference_t<T>>>::value>;
46
47 template <typename Fn, typename Tuple>
48 constexpr void forEachInTuple (Fn&& fn, Tuple&& tuple)
49 {
50 forEachInTuple (std::forward<Fn> (fn), std::forward<Tuple> (tuple), TupleIndexSequence<Tuple>{});
51 }
52
53 // This could be a template variable, but that code causes an internal compiler error in MSVC 19.00.24215
54 template <typename Context, size_t Ix>
56 {
57 static constexpr auto value = ! Context::usesSeparateInputAndOutputBlocks() || Ix == 0;
58 };
59}
60#endif
61
67template <typename... Processors>
69{
70public:
72 template <int Index> auto& get() noexcept { return std::get<Index> (processors); }
73
75 template <int Index> const auto& get() const noexcept { return std::get<Index> (processors); }
76
78 template <int Index>
79 void setBypassed (bool b) noexcept { bypassed[(size_t) Index] = b; }
80
82 template <int Index>
83 bool isBypassed() const noexcept { return bypassed[(size_t) Index]; }
84
86 void prepare (const ProcessSpec& spec)
87 {
88 detail::forEachInTuple ([&] (auto& proc, auto) { proc.prepare (spec); }, processors);
89 }
90
92 void reset()
93 {
94 detail::forEachInTuple ([] (auto& proc, auto) { proc.reset(); }, processors);
95 }
96
98 template <typename ProcessContext>
99 void process (const ProcessContext& context) noexcept
100 {
101 detail::forEachInTuple ([this, &context] (auto& proc, auto index) noexcept { this->processOne (context, proc, index); },
102 processors);
103 }
104
105private:
106 template <typename Context, typename Proc, size_t Ix, std::enable_if_t<! detail::UseContextDirectly<Context, Ix>::value, int> = 0>
107 void processOne (const Context& context, Proc& proc, std::integral_constant<size_t, Ix>) noexcept
108 {
109 jassert (context.getOutputBlock().getNumChannels() == context.getInputBlock().getNumChannels());
110 ProcessContextReplacing<typename Context::SampleType> replacingContext (context.getOutputBlock());
111 replacingContext.isBypassed = (bypassed[Ix] || context.isBypassed);
112
113 proc.process (replacingContext);
114 }
115
116 template <typename Context, typename Proc, size_t Ix, std::enable_if_t<detail::UseContextDirectly<Context, Ix>::value, int> = 0>
117 void processOne (const Context& context, Proc& proc, std::integral_constant<size_t, Ix>) noexcept
118 {
119 auto contextCopy = context;
120 contextCopy.isBypassed = (bypassed[Ix] || context.isBypassed);
121
122 proc.process (contextCopy);
123 }
124
125 std::tuple<Processors...> processors;
126 std::array<bool, sizeof...(Processors)> bypassed { {} };
127};
128
132template <int Index, typename... Processors>
133inline auto& get (ProcessorChain<Processors...>& chain) noexcept
134{
135 return chain.template get<Index>();
136}
137
141template <int Index, typename... Processors>
142inline auto& get (const ProcessorChain<Processors...>& chain) noexcept
143{
144 return chain.template get<Index>();
145}
146
150template <int Index, typename... Processors>
151inline void setBypassed (ProcessorChain<Processors...>& chain, bool bypassed) noexcept
152{
153 chain.template setBypassed<Index> (bypassed);
154}
155
159template <int Index, typename... Processors>
160inline bool isBypassed (const ProcessorChain<Processors...>& chain) noexcept
161{
162 return chain.template isBypassed<Index>();
163}
164
165} // namespace dsp
166} // namespace juce
167
168#ifndef DOXYGEN
169namespace std
170{
171
172JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmismatched-tags")
173
174
175template <typename... Processors>
176struct tuple_size<::juce::dsp::ProcessorChain<Processors...>> : integral_constant<size_t, sizeof... (Processors)> {};
177
179template <size_t I, typename... Processors>
180struct tuple_element<I, ::juce::dsp::ProcessorChain<Processors...>> : tuple_element<I, tuple<Processors...>> {};
181
183
184} // namespace std
185#endif
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_ProcessorChain.h:69
bool isBypassed() const noexcept
Definition juce_ProcessorChain.h:83
void setBypassed(bool b) noexcept
Definition juce_ProcessorChain.h:79
void prepare(const ProcessSpec &spec)
Definition juce_ProcessorChain.h:86
void processOne(const Context &context, Proc &proc, std::integral_constant< size_t, Ix >) noexcept
Definition juce_ProcessorChain.h:107
void reset()
Definition juce_ProcessorChain.h:92
auto & get() noexcept
Definition juce_ProcessorChain.h:72
std::tuple< Processors... > processors
Definition juce_ProcessorChain.h:125
const auto & get() const noexcept
Definition juce_ProcessorChain.h:75
std::array< bool, sizeof...(Processors)> bypassed
Definition juce_ProcessorChain.h:126
void process(const ProcessContext &context) noexcept
Definition juce_ProcessorChain.h:99
static PuglViewHint int value
Definition pugl.h:1708
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
#define jassert(expression)
Definition audio_fx.h:36
Definition juce_FixedSizeFunction.h:34
std::make_index_sequence< std::tuple_size< std::remove_cv_t< std::remove_reference_t< T > > >::value > TupleIndexSequence
Definition juce_ProcessorChain.h:45
constexpr void forEachInTuple(Fn &&fn, Tuple &&tuple, std::index_sequence< Ix... >)
Definition juce_ProcessorChain.h:39
Definition juce_AudioBlock.h:29
auto & get(ProcessorChain< Processors... > &chain) noexcept
Definition juce_ProcessorChain.h:133
void setBypassed(ProcessorChain< Processors... > &chain, bool bypassed) noexcept
Definition juce_ProcessorChain.h:151
bool isBypassed(const ProcessorChain< Processors... > &chain) noexcept
Definition juce_ProcessorChain.h:160
Definition carla_juce.cpp:31
Definition juce_Uuid.h:141
Definition juce_ProcessContext.h:88
bool isBypassed
Definition juce_ProcessContext.h:119
Definition juce_ProcessContext.h:38
Definition juce_ProcessorChain.h:56
static constexpr auto value
Definition juce_ProcessorChain.h:57
const char const char const char const char char * fn
Definition swell-functions.h:168
b
Definition crypt.c:628
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137