|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 5 End-User License
- Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
- 27th April 2017).
-
- End User License Agreement: www.juce.com/juce-5-licence
- Privacy Policy: www.juce.com/juce-5-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- #pragma once
-
- #include "../JuceLibraryCode/JuceHeader.h"
-
- using namespace dsp;
-
- //==============================================================================
- struct DSPDemoParameterBase : public ChangeBroadcaster
- {
- DSPDemoParameterBase (const String& labelName) : name (labelName) {}
- virtual ~DSPDemoParameterBase() {}
-
- virtual Component* getComponent() = 0;
-
- virtual int getPreferredHeight() = 0;
- virtual int getPreferredWidth() = 0;
-
- String name;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSPDemoParameterBase)
- };
-
- //==============================================================================
- struct SliderParameter : public DSPDemoParameterBase,
- private Slider::Listener
- {
- SliderParameter (Range<double> range, double skew, double initialValue,
- const String& labelName, const String& suffix = {})
- : DSPDemoParameterBase (labelName)
- {
- slider.setRange (range.getStart(), range.getEnd(), 0.01);
- slider.setSkewFactor (skew);
- slider.setValue (initialValue);
-
- if (suffix.isNotEmpty())
- slider.setTextValueSuffix (suffix);
-
- slider.addListener (this);
- }
-
- Component* getComponent() override { return &slider; }
-
- int getPreferredHeight() override { return 40; }
- int getPreferredWidth() override { return 500; }
-
- double getCurrentValue() const { return slider.getValue(); }
-
- private:
- Slider slider;
-
- void sliderValueChanged (Slider*) override { sendChangeMessage(); }
- };
-
- //==============================================================================
- struct ChoiceParameter : public DSPDemoParameterBase,
- private ComboBox::Listener
- {
- ChoiceParameter (const StringArray& options, int initialId, const String& labelName)
- : DSPDemoParameterBase (labelName)
- {
- parameterBox.addItemList (options, 1);
- parameterBox.addListener (this);
-
- parameterBox.setSelectedId (initialId);
- }
-
- Component* getComponent() override { return ¶meterBox; }
-
- int getPreferredHeight() override { return 25; }
- int getPreferredWidth() override { return 250; }
-
- int getCurrentSelectedID() const { return parameterBox.getSelectedId(); }
-
- private:
- ComboBox parameterBox;
-
- void comboBoxChanged (ComboBox*) override { sendChangeMessage(); }
- };
-
- //==============================================================================
- // This is just a base class for the demos which exposes them as an AudioSource with
- // an array of parameters
- struct DSPDemoBase : public AudioSource
- {
- virtual const std::vector<DSPDemoParameterBase*>& getParameters() = 0;
-
- AudioSource* inputSource = nullptr;
- };
-
- //==============================================================================
- template <typename DemoType>
- struct DSPDemo : public DSPDemoBase,
- public ProcessorWrapper<DemoType>,
- private ChangeListener
- {
- DSPDemo()
- {
- for (auto* p : getParameters())
- p->addChangeListener (this);
- }
-
- void prepareToPlay (int blockSize, double sampleRate) override
- {
- inputSource->prepareToPlay (blockSize, sampleRate);
- this->prepare ({ sampleRate, (uint32) blockSize, 2 });
- }
-
- void releaseResources() override
- {
- inputSource->releaseResources();
- }
-
- void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override
- {
- jassert (bufferToFill.buffer != nullptr);
-
- inputSource->getNextAudioBlock (bufferToFill);
-
- dsp::AudioBlock<float> block (*bufferToFill.buffer,
- (size_t) bufferToFill.startSample);
-
- ScopedLock audioLock (audioCallbackLock);
- this->process (ProcessContextReplacing<float> (block));
- }
-
- const std::vector<DSPDemoParameterBase*>& getParameters() override
- {
- return this->processor.parameters;
- }
-
- void changeListenerCallback (ChangeBroadcaster*) override
- {
- ScopedLock audioLock (audioCallbackLock);
- static_cast<DemoType&> (this->processor).updateParameters();
- }
-
- CriticalSection audioCallbackLock;
- };
-
-
- //==============================================================================
- struct Demo
- {
- using CreateDemoFn = std::function<DSPDemoBase*(AudioSource&)>;
-
- String name, code;
- CreateDemoFn createDemo;
-
- Demo (const char* nameToUse, const char* codeToUse, CreateDemoFn create)
- : name (nameToUse), code (codeToUse), createDemo (create)
- {
- code = code.fromFirstOccurrenceOf ("// @@ START_DEMO", false, false)
- .upToLastOccurrenceOf ("// @@ END_DEMO", false, false)
- .trim();
-
- getList().add (this);
- }
-
- static Array<const Demo*>& getList()
- {
- static Array<const Demo*> demos;
- return demos;
- }
- };
-
- template <typename DemoType>
- struct RegisterDSPDemo : public Demo
- {
- RegisterDSPDemo (const char* nameToUse, const char* codeToUse)
- : Demo (nameToUse, codeToUse, [](AudioSource& input) { auto* demo = new DSPDemo<DemoType>(); demo->inputSource = &input; return demo; })
- {}
- };
|