29AudioProcessorParameterGroup::AudioProcessorParameterNode::~AudioProcessorParameterNode() =
default;
76 name = std::move (other.name);
78 children = std::move (other.children);
89 if (
auto*
group = child->getGroup())
148 if (
auto*
group = child->getGroup())
153 group->getSubgroups (previousGroups,
true);
162 if (
auto* parameter = child->getParameter())
163 previousParameters.
add (parameter);
165 child->getGroup()->getParameters (previousParameters,
true);
173 if (child->getParameter() == parameter)
176 if (
auto*
group = child->getGroup())
177 if (
auto* foundGroup =
group->getGroupForParameter (parameter))
187class ParameterGroupTests :
public UnitTest
190 ParameterGroupTests()
194 void runTest()
override
196 beginTest (
"ParameterGroups");
198 auto g1 = std::make_unique<AudioProcessorParameterGroup> (
"g1",
"g1",
" - ");
200 auto* p1 =
new AudioParameterFloat (
"p1",
"p1", { 0.0f, 2.0f }, 0.5f);
201 auto* p2 =
new AudioParameterFloat (
"p2",
"p2", { 0.0f, 2.0f }, 0.5f);
202 auto* p3 =
new AudioParameterFloat (
"p3",
"p3", { 0.0f, 2.0f }, 0.5f);
204 g1->addChild (std::unique_ptr<AudioParameterFloat> (p1));
205 g1->addChild (std::unique_ptr<AudioParameterFloat> (p2),
206 std::unique_ptr<AudioParameterFloat> (p3));
208 auto p4 = std::make_unique<AudioParameterFloat> (
"p4",
"p4", NormalisableRange<float> (0.0f, 2.0f), 0.5f);
209 auto p5 = std::make_unique<AudioParameterFloat> (
"p5",
"p5", NormalisableRange<float> (0.0f, 2.0f), 0.5f);
210 auto p6 = std::make_unique<AudioParameterFloat> (
"p6",
"p6", NormalisableRange<float> (0.0f, 2.0f), 0.5f);
212 g1->addChild (std::move (p4));
213 g1->addChild (std::move (p5),
217 auto topLevelParams = g1->getParameters (
false);
218 auto params = g1->getParameters (
true);
219 expect (topLevelParams == params);
220 expectEquals (params.size(), 6);
222 expect (params[0] == (AudioProcessorParameter*) p1);
223 expect (params[1] == (AudioProcessorParameter*) p2);
224 expect (params[2] == (AudioProcessorParameter*) p3);
226 expect (
dynamic_cast<AudioParameterFloat*
> (params[3])->
name ==
"p4");
227 expect (
dynamic_cast<AudioParameterFloat*
> (params[4])->
name ==
"p5");
228 expect (
dynamic_cast<AudioParameterFloat*
> (params[5])->
name ==
"p6");
231 auto* p7 =
new AudioParameterFloat (
"p7",
"p7", { 0.0f, 2.0f }, 0.5f);
232 auto* p8 =
new AudioParameterFloat (
"p8",
"p8", { 0.0f, 2.0f }, 0.5f);
233 auto* p9 =
new AudioParameterFloat (
"p9",
"p9", { 0.0f, 2.0f }, 0.5f);
235 auto p10 = std::make_unique<AudioParameterFloat> (
"p10",
"p10", NormalisableRange<float> (0.0f, 2.0f), 0.5f);
236 auto p11 = std::make_unique<AudioParameterFloat> (
"p11",
"p11", NormalisableRange<float> (0.0f, 2.0f), 0.5f);
237 auto p12 = std::make_unique<AudioParameterFloat> (
"p12",
"p12", NormalisableRange<float> (0.0f, 2.0f), 0.5f);
239 auto g2 = std::make_unique<AudioProcessorParameterGroup> (
"g2",
"g2",
" | ", std::unique_ptr<AudioParameterFloat> (p7));
240 auto g3 = std::make_unique<AudioProcessorParameterGroup> (
"g3",
"g3",
" | ", std::unique_ptr<AudioParameterFloat> (p8), std::unique_ptr<AudioParameterFloat> (p9));
241 auto g4 = std::make_unique<AudioProcessorParameterGroup> (
"g4",
"g4",
" | ", std::move (p10));
242 auto g5 = std::make_unique<AudioProcessorParameterGroup> (
"g5",
"g5",
" | ", std::move (p11), std::move (p12));
244 g1->addChild (std::move (g2));
245 g4->addChild (std::move (g5));
246 g1->addChild (std::move (g3), std::move (g4));
249 auto topLevelParams = g1->getParameters (
false);
250 auto params = g1->getParameters (
true);
251 expectEquals (topLevelParams.size(), 6);
252 expectEquals (params.size(), 12);
254 expect (params[0] == (AudioProcessorParameter*) p1);
255 expect (params[1] == (AudioProcessorParameter*) p2);
256 expect (params[2] == (AudioProcessorParameter*) p3);
258 expect (
dynamic_cast<AudioParameterFloat*
> (params[3])->
name ==
"p4");
259 expect (
dynamic_cast<AudioParameterFloat*
> (params[4])->
name ==
"p5");
260 expect (
dynamic_cast<AudioParameterFloat*
> (params[5])->
name ==
"p6");
262 expect (params[6] == (AudioProcessorParameter*) p7);
263 expect (params[7] == (AudioProcessorParameter*) p8);
264 expect (params[8] == (AudioProcessorParameter*) p9);
266 expect (
dynamic_cast<AudioParameterFloat*
> (params[9]) ->
name ==
"p10");
267 expect (
dynamic_cast<AudioParameterFloat*
> (params[10])->
name ==
"p11");
268 expect (
dynamic_cast<AudioParameterFloat*
> (params[11])->
name ==
"p12");
271 g1->addChild (std::make_unique<AudioProcessorParameterGroup> (
"g6",
"g6",
" | ",
272 std::make_unique<AudioParameterFloat> (
"p13",
"p13", NormalisableRange<float> (0.0f, 2.0f), 0.5f),
273 std::make_unique<AudioProcessorParameterGroup> (
"g7",
"g7",
" | ",
274 std::make_unique<AudioParameterFloat> (
"p14",
"p14", NormalisableRange<float> (0.0f, 2.0f), 0.5f)),
275 std::make_unique<AudioParameterFloat> (
"p15",
"p15", NormalisableRange<float> (0.0f, 2.0f), 0.5f)));
277 TestAudioProcessor processor;
279 processor.addParameter (
new AudioParameterFloat (
"pstart",
"pstart", NormalisableRange<float> (0.0f, 2.0f), 0.5f));
280 auto groupParams = g1->getParameters (
true);
281 processor.addParameterGroup (std::move (g1));
282 processor.addParameter (
new AudioParameterFloat (
"pend",
"pend", NormalisableRange<float> (0.0f, 2.0f), 0.5f));
284 auto& processorParams = processor.getParameters();
285 expect (
dynamic_cast<AudioParameterFloat*
> (processorParams.getFirst())->name ==
"pstart");
286 expect (
dynamic_cast<AudioParameterFloat*
> (processorParams.getLast()) ->name ==
"pend");
288 auto numParams = processorParams.size();
290 for (
int i = 1;
i < numParams - 1; ++
i)
291 expect (processorParams[
i] == groupParams[
i - 1]);
295 struct TestAudioProcessor :
public AudioProcessor
297 const String getName()
const override {
return "ap"; }
298 void prepareToPlay (
double,
int)
override {}
299 void releaseResources()
override {}
300 void processBlock (AudioBuffer<float>&, MidiBuffer&)
override {}
301 using AudioProcessor::processBlock;
302 double getTailLengthSeconds()
const override {
return 0.0; }
303 bool acceptsMidi()
const override {
return false; }
304 bool producesMidi()
const override {
return false; }
305 AudioProcessorEditor* createEditor()
override {
return nullptr; }
306 bool hasEditor()
const override {
return false; }
307 int getNumPrograms()
override {
return 0; }
308 int getCurrentProgram()
override {
return 0; }
309 void setCurrentProgram (
int)
override {}
310 const String getProgramName (
int)
override {
return {}; }
311 void changeProgramName (
int,
const String&)
override {}
312 void getStateInformation (MemoryBlock&)
override {}
313 void setStateInformation (
const void*,
int)
override {}
317static ParameterGroupTests parameterGroupTests;
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_Array.h:56
void insert(int indexToInsertAt, ParameterType newElement)
Definition juce_Array.h:462
void add(const ElementType &newElement)
Definition juce_Array.h:418
Definition juce_AudioProcessorParameterGroup.h:60
friend class AudioProcessorParameterGroup
Definition juce_AudioProcessorParameterGroup.h:84
AudioProcessorParameterGroup * parent
Definition juce_AudioProcessorParameterGroup.h:82
AudioProcessorParameterNode(AudioProcessorParameterNode &&)
Definition juce_AudioProcessorParameterGroup.cpp:31
AudioProcessorParameterGroup * getGroup() const
Definition juce_AudioProcessorParameterGroup.cpp:52
AudioProcessorParameter * getParameter() const
Definition juce_AudioProcessorParameterGroup.cpp:51
std::unique_ptr< AudioProcessorParameterGroup > group
Definition juce_AudioProcessorParameterGroup.h:80
std::unique_ptr< AudioProcessorParameter > parameter
Definition juce_AudioProcessorParameterGroup.h:81
AudioProcessorParameterGroup * getParent() const
Definition juce_AudioProcessorParameterGroup.cpp:50
AudioProcessorParameterGroup * parent
Definition juce_AudioProcessorParameterGroup.h:249
String getSeparator() const
Definition juce_AudioProcessorParameterGroup.cpp:96
const AudioProcessorParameterGroup * getGroupForParameter(AudioProcessorParameter *) const
Definition juce_AudioProcessorParameterGroup.cpp:169
void setName(String newName)
Definition juce_AudioProcessorParameterGroup.cpp:99
String getName() const
Definition juce_AudioProcessorParameterGroup.cpp:95
Array< const AudioProcessorParameterGroup * > getGroupsForParameter(AudioProcessorParameter *) const
Definition juce_AudioProcessorParameterGroup.cpp:128
const AudioProcessorParameterNode *const * end() const noexcept
Definition juce_AudioProcessorParameterGroup.cpp:102
Array< AudioProcessorParameter * > getParameters(bool recursive) const
Definition juce_AudioProcessorParameterGroup.cpp:121
String identifier
Definition juce_AudioProcessorParameterGroup.h:247
const AudioProcessorParameterGroup * getParent() const noexcept
Definition juce_AudioProcessorParameterGroup.cpp:97
~AudioProcessorParameterGroup()
OwnedArray< AudioProcessorParameterNode > children
Definition juce_AudioProcessorParameterGroup.h:248
String separator
Definition juce_AudioProcessorParameterGroup.h:247
void append(std::unique_ptr< AudioProcessorParameter >)
Definition juce_AudioProcessorParameterGroup.cpp:104
Array< const AudioProcessorParameterGroup * > getSubgroups(bool recursive) const
Definition juce_AudioProcessorParameterGroup.cpp:114
const AudioProcessorParameterNode *const * begin() const noexcept
Definition juce_AudioProcessorParameterGroup.cpp:101
String name
Definition juce_AudioProcessorParameterGroup.h:247
String getID() const
Definition juce_AudioProcessorParameterGroup.cpp:94
AudioProcessorParameterGroup()
void updateChildParentage()
Definition juce_AudioProcessorParameterGroup.cpp:83
Definition juce_AudioProcessorParameter.h:40
Definition juce_String.h:53
Definition juce_UnitTest.h:70
register unsigned i
Definition inflate.c:1575
static const char * name
Definition pugl.h:1582
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
@ group
Definition juce_AccessibilityRole.h:61
Definition juce_Uuid.h:141
#define const
Definition zconf.h:137