diff --git a/examples/Assets/DemoUtilities.h b/examples/Assets/DemoUtilities.h index 70ab73f9433a..e57ba137a706 100644 --- a/examples/Assets/DemoUtilities.h +++ b/examples/Assets/DemoUtilities.h @@ -67,10 +67,19 @@ inline File getExamplesDirectory() noexcept if (exampleDir.exists()) return exampleDir; - int numTries = 0; // keep track of the number of parent directories so we don't go on endlessly + // keep track of the number of parent directories so we don't go on endlessly + for (int numTries = 0; numTries < 15; ++numTries) + { + if (currentFile.getFileName() == "examples") + return currentFile; + + const auto sibling = currentFile.getSiblingFile ("examples"); + + if (sibling.exists()) + return sibling; - while (currentFile.getFileName() != "examples" && numTries++ < 15) currentFile = currentFile.getParentDirectory(); + } return currentFile; #endif diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h index 70ab73f9433a..e57ba137a706 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h @@ -67,10 +67,19 @@ inline File getExamplesDirectory() noexcept if (exampleDir.exists()) return exampleDir; - int numTries = 0; // keep track of the number of parent directories so we don't go on endlessly + // keep track of the number of parent directories so we don't go on endlessly + for (int numTries = 0; numTries < 15; ++numTries) + { + if (currentFile.getFileName() == "examples") + return currentFile; + + const auto sibling = currentFile.getSiblingFile ("examples"); + + if (sibling.exists()) + return sibling; - while (currentFile.getFileName() != "examples" && numTries++ < 15) currentFile = currentFile.getParentDirectory(); + } return currentFile; #endif diff --git a/examples/Plugins/AUv3SynthPluginDemo.h b/examples/Plugins/AUv3SynthPluginDemo.h index c5f6f6a21dbe..e2f7f41ebc95 100644 --- a/examples/Plugins/AUv3SynthPluginDemo.h +++ b/examples/Plugins/AUv3SynthPluginDemo.h @@ -259,9 +259,9 @@ class AUv3SynthEditor : public AudioProcessorEditor, //============================================================================== AudioProcessorParameter* getParameter (const String& paramId) { - if (auto* processor = getAudioProcessor()) + if (auto* audioProcessor = getAudioProcessor()) { - auto& params = processor->getParameters(); + auto& params = audioProcessor->getParameters(); for (auto p : params) { @@ -356,13 +356,14 @@ class AUv3SynthProcessor : public AudioProcessor reverb.processStereo (buffer.getWritePointer (0), buffer.getWritePointer (1), buffer.getNumSamples()); } + using AudioProcessor::processBlock; + //============================================================================== void releaseResources() override { currentRecording.setSize (1, 1); } //============================================================================== bool acceptsMidi() const override { return true; } bool producesMidi() const override { return false; } - bool silenceInProducesSilenceOut() const override { return false; } double getTailLengthSeconds() const override { return 0.0; } //============================================================================== @@ -383,6 +384,7 @@ class AUv3SynthProcessor : public AudioProcessor case 1: return "Singing"; case 2: return "Pinched Balloon"; case 3: return "Gazeebo"; + default: break; } return ""; @@ -408,6 +410,7 @@ class AUv3SynthProcessor : public AudioProcessor roomSizeParam->setValueNotifyingHost (stream.readFloat()); } + private: //============================================================================== void loadNewSampleBinary (const void* data, int dataSize, const char* format) diff --git a/examples/Plugins/ArpeggiatorPluginDemo.h b/examples/Plugins/ArpeggiatorPluginDemo.h index 6f8f5756e8a4..07df336144f4 100644 --- a/examples/Plugins/ArpeggiatorPluginDemo.h +++ b/examples/Plugins/ArpeggiatorPluginDemo.h @@ -71,7 +71,7 @@ class Arpeggiator : public AudioProcessor notes.clear(); currentNote = 0; lastNoteValue = -1; - time = 0.0; + time = 0; rate = static_cast (sampleRate); } @@ -119,6 +119,8 @@ class Arpeggiator : public AudioProcessor time = (time + numSamples) % noteDuration; } + using AudioProcessor::processBlock; + //============================================================================== bool isMidiEffect() const override { return true; } diff --git a/examples/Plugins/AudioPluginDemo.h b/examples/Plugins/AudioPluginDemo.h index 05da3d0a2d85..a0173af702f2 100644 --- a/examples/Plugins/AudioPluginDemo.h +++ b/examples/Plugins/AudioPluginDemo.h @@ -275,7 +275,7 @@ class JuceDemoPluginAudioProcessor : public AudioProcessor } //============================================================================== - const String getName() const override { return JucePlugin_Name; } + const String getName() const override { return "AudioPluginDemo"; } bool acceptsMidi() const override { return true; } bool producesMidi() const override { return true; } double getTailLengthSeconds() const override { return 0.0; } diff --git a/examples/Plugins/DSPModulePluginDemo.h b/examples/Plugins/DSPModulePluginDemo.h index ff640748c02c..2fd7b34b70c1 100644 --- a/examples/Plugins/DSPModulePluginDemo.h +++ b/examples/Plugins/DSPModulePluginDemo.h @@ -198,6 +198,8 @@ class DspModulePluginDemoAudioProcessor : public AudioProcessor } } + using AudioProcessor::processBlock; + void reset() override { lowPassFilter .reset(); @@ -217,7 +219,7 @@ class DspModulePluginDemoAudioProcessor : public AudioProcessor //============================================================================== bool acceptsMidi() const override { return false; } bool producesMidi() const override { return false; } - const String getName() const override { return JucePlugin_Name; } + const String getName() const override { return "DSPModulePluginDemo"; } double getTailLengthSeconds() const override { return 0.0; } //============================================================================== diff --git a/examples/Plugins/GainPluginDemo.h b/examples/Plugins/GainPluginDemo.h index 4e50cdd97f08..f58dcfcc0e5f 100644 --- a/examples/Plugins/GainPluginDemo.h +++ b/examples/Plugins/GainPluginDemo.h @@ -71,6 +71,11 @@ class GainProcessor : public AudioProcessor buffer.applyGain (*gain); } + void processBlock (AudioBuffer& buffer, MidiBuffer&) override + { + buffer.applyGain ((float) *gain); + } + //============================================================================== AudioProcessorEditor* createEditor() override { return new GenericAudioProcessorEditor (*this); } bool hasEditor() const override { return true; } diff --git a/examples/Plugins/InterAppAudioEffectPluginDemo.h b/examples/Plugins/InterAppAudioEffectPluginDemo.h index 30736ccf6f3a..b37533c69353 100644 --- a/examples/Plugins/InterAppAudioEffectPluginDemo.h +++ b/examples/Plugins/InterAppAudioEffectPluginDemo.h @@ -79,8 +79,6 @@ class SimpleMeter : public Component, g.fillRoundedRectangle (area.toFloat(), 6.0); } - void resized() override {} - //============================================================================== // Called from the audio thread. void update (float newLevel) @@ -215,7 +213,7 @@ class IAAEffectProcessor : public AudioProcessor bool hasEditor() const override { return true; } //============================================================================== - const String getName() const override { return JucePlugin_Name; } + const String getName() const override { return "InterAppAudioEffectPlugin"; } bool acceptsMidi() const override { return false; } bool producesMidi() const override { return false; } double getTailLengthSeconds() const override { return 0.0; } diff --git a/examples/Plugins/MidiLoggerPluginDemo.h b/examples/Plugins/MidiLoggerPluginDemo.h index ce49c7ebe7cd..0f7fc7234640 100644 --- a/examples/Plugins/MidiLoggerPluginDemo.h +++ b/examples/Plugins/MidiLoggerPluginDemo.h @@ -73,12 +73,49 @@ class MidiQueue std::vector messages = std::vector (queueSize); }; +// Stores the last N messages. Safe to access from the message thread only. +class MidiListModel +{ +public: + template + void addMessages (It begin, It end) + { + const auto numNewMessages = (int) std::distance (begin, end); + const auto numToAdd = juce::jmin (numToStore, numNewMessages); + const auto numToRemove = jmax (0, (int) messages.size() + numToAdd - numToStore); + messages.erase (messages.begin(), std::next (messages.begin(), numToRemove)); + messages.insert (messages.end(), std::prev (end, numToAdd), end); + + if (onChange != nullptr) + onChange(); + } + + void clear() + { + messages.clear(); + + if (onChange != nullptr) + onChange(); + } + + const MidiMessage& operator[] (size_t ind) const { return messages[ind]; } + + size_t size() const { return messages.size(); } + + std::function onChange; + +private: + static constexpr auto numToStore = 1000; + std::vector messages; +}; + //============================================================================== class MidiTable : public Component, private TableListBoxModel { public: - MidiTable() + MidiTable (MidiListModel& m) + : messages (m) { addAndMakeVisible (table); @@ -92,26 +129,13 @@ class MidiTable : public Component, header->addColumn ("Data", dataColumn, 200, 30, -1, TableHeaderComponent::notSortable); return header; }()); - } - void resized() override { table.setBounds (getLocalBounds()); } - - template - void addMessages (It begin, It end) - { - const auto numNewMessages = (int) std::distance (begin, end); - const auto numToAdd = juce::jmin (numToStore, numNewMessages); - const auto numToRemove = jmax (0, (int) messages.size() + numToAdd - numToStore); - messages.erase (messages.begin(), std::next (messages.begin(), numToRemove)); - messages.insert (messages.end(), end - numToAdd, end); - table.updateContent(); + messages.onChange = [&] { table.updateContent(); }; } - void clear() - { - messages.clear(); - table.updateContent(); - } + ~MidiTable() override { messages.onChange = nullptr; } + + void resized() override { table.setBounds (getLocalBounds()); } private: enum @@ -185,22 +209,24 @@ class MidiTable : public Component, return {}; } - static constexpr auto numToStore = 1000; - std::vector messages; - + MidiListModel& messages; TableListBox table; }; //============================================================================== -class MidiLoggerPluginDemoProcessor : public AudioPluginInstance +class MidiLoggerPluginDemoProcessor : public AudioProcessor, + private Timer { public: MidiLoggerPluginDemoProcessor() - : AudioPluginInstance (BusesProperties()) + : AudioProcessor (BusesProperties()) { state.addChild ({ "uiState", { { "width", 500 }, { "height", 300 } }, {} }, -1, nullptr); + startTimerHz (60); } + ~MidiLoggerPluginDemoProcessor() override { stopTimer(); } + void processBlock (AudioBuffer& audio, MidiBuffer& midi) override { process (audio, midi); } void processBlock (AudioBuffer& audio, MidiBuffer& midi) override { process (audio, midi); } @@ -211,7 +237,7 @@ class MidiLoggerPluginDemoProcessor : public AudioPluginInstance const String getName() const override { return "MIDILogger"; } bool acceptsMidi() const override { return true; } - bool producesMidi() const override { return false; } + bool producesMidi() const override { return true; } double getTailLengthSeconds() const override { return 0.0; } int getNumPrograms() override { return 0; } @@ -235,28 +261,15 @@ class MidiLoggerPluginDemoProcessor : public AudioPluginInstance state = ValueTree::fromXml (*xmlState); } - void fillInPluginDescription (PluginDescription& d) const override - { - d.name = getName(); - d.uid = d.name.hashCode(); - d.category = "Utility"; - d.pluginFormatName = "Internal"; - d.manufacturerName = "JUCE"; - d.version = "1.0"; - d.isInstrument = false; - d.numInputChannels = getTotalNumInputChannels(); - d.numOutputChannels = getTotalNumOutputChannels(); - } - private: class Editor : public AudioProcessorEditor, - private Timer, private Value::Listener { public: explicit Editor (MidiLoggerPluginDemoProcessor& ownerIn) : AudioProcessorEditor (ownerIn), - owner (ownerIn) + owner (ownerIn), + table (owner.model) { addAndMakeVisible (table); addAndMakeVisible (clearButton); @@ -269,15 +282,7 @@ class MidiLoggerPluginDemoProcessor : public AudioPluginInstance lastUIWidth. addListener (this); lastUIHeight.addListener (this); - clearButton.onClick = [&] { table.clear(); }; - - startTimerHz (60); - } - - ~Editor() override - { - stopTimer(); - owner.editorBeingDeleted (this); + clearButton.onClick = [&] { owner.model.clear(); }; } void paint (Graphics& g) override @@ -297,13 +302,6 @@ class MidiLoggerPluginDemoProcessor : public AudioPluginInstance } private: - void timerCallback() override - { - std::vector messages; - owner.queue.pop (std::back_inserter (messages)); - table.addMessages (messages.begin(), messages.end()); - } - void valueChanged (Value&) override { setSize (lastUIWidth.getValue(), lastUIHeight.getValue()); @@ -317,6 +315,13 @@ class MidiLoggerPluginDemoProcessor : public AudioPluginInstance Value lastUIWidth, lastUIHeight; }; + void timerCallback() override + { + std::vector messages; + queue.pop (std::back_inserter (messages)); + model.addMessages (messages.begin(), messages.end()); + } + template void process (AudioBuffer& audio, MidiBuffer& midi) { @@ -326,6 +331,8 @@ class MidiLoggerPluginDemoProcessor : public AudioPluginInstance ValueTree state { "state" }; MidiQueue queue; + MidiListModel model; // The data to show in the UI. We keep it around in the processor so that + // the view is persistent even when the plugin UI is closed and reopened. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiLoggerPluginDemoProcessor) }; diff --git a/examples/Plugins/MultiOutSynthPluginDemo.h b/examples/Plugins/MultiOutSynthPluginDemo.h index e3d77f9990b2..c5913dc07120 100644 --- a/examples/Plugins/MultiOutSynthPluginDemo.h +++ b/examples/Plugins/MultiOutSynthPluginDemo.h @@ -124,6 +124,8 @@ class MultiOutSynth : public AudioProcessor } } + using AudioProcessor::processBlock; + //============================================================================== AudioProcessorEditor* createEditor() override { return new GenericAudioProcessorEditor (*this); } bool hasEditor() const override { return true; } diff --git a/examples/Plugins/NoiseGatePluginDemo.h b/examples/Plugins/NoiseGatePluginDemo.h index a8e3b7d64def..3e773567e669 100644 --- a/examples/Plugins/NoiseGatePluginDemo.h +++ b/examples/Plugins/NoiseGatePluginDemo.h @@ -105,6 +105,8 @@ class NoiseGate : public AudioProcessor } } + using AudioProcessor::processBlock; + //============================================================================== AudioProcessorEditor* createEditor() override { return new GenericAudioProcessorEditor (*this); } bool hasEditor() const override { return true; } diff --git a/examples/Plugins/SamplerPluginDemo.h b/examples/Plugins/SamplerPluginDemo.h index a64a71d26f2f..e0388d4bb31f 100644 --- a/examples/Plugins/SamplerPluginDemo.h +++ b/examples/Plugins/SamplerPluginDemo.h @@ -95,53 +95,73 @@ enum class LoopMode pingpong }; -template -class MoveOnlyFifo final +// We want to send type-erased commands to the audio thread, but we also +// want those commands to contain move-only resources, so that we can +// construct resources on the gui thread, and then transfer ownership +// cheaply to the audio thread. We can't do this with std::function +// because it enforces that functions are copy-constructible. +// Therefore, we use a very simple templated type-eraser here. +template +struct Command +{ + virtual ~Command() noexcept = default; + virtual void run (Proc& proc) = 0; +}; + +template +class TemplateCommand : public Command, + private Func +{ +public: + template + explicit TemplateCommand (FuncPrime&& funcPrime) + : Func (std::forward (funcPrime)) + {} + + void run (Proc& proc) override { (*this) (proc); } +}; + +template +class CommandFifo final { public: - explicit MoveOnlyFifo (int size) + explicit CommandFifo (int size) : buffer ((size_t) size), abstractFifo (size) {} - MoveOnlyFifo() - : MoveOnlyFifo (1024) + CommandFifo() + : CommandFifo (1024) {} - template - Convertible push (Convertible item) noexcept + template + void push (Item&& item) noexcept { - auto writer = abstractFifo.write (1); + auto command = makeCommand (std::forward (item)); - if (writer.blockSize1 == 1) + abstractFifo.write (1).forEach ([&] (int index) { - buffer[(size_t) writer.startIndex1] = move (item); - item = {}; - } - else if (writer.blockSize2 == 1) - { - buffer[(size_t) writer.startIndex2] = move (item); - item = {}; - } - - return item; + buffer[size_t (index)] = std::move (command); + }); } - Movable pop() noexcept + void call (Proc& proc) noexcept { - auto reader = abstractFifo.read (1); - - if (reader.blockSize1 == 1) - return move (buffer[(size_t) reader.startIndex1]); - - if (reader.blockSize2 == 1) - return move (buffer[(size_t) reader.startIndex2]); - - return {}; + abstractFifo.read (abstractFifo.getNumReady()).forEach ([&] (int index) + { + buffer[size_t (index)]->run (proc); + }); } private: - std::vector buffer; + template + static std::unique_ptr> makeCommand (Func&& func) + { + using Decayed = typename std::decay::type; + return std::make_unique> (std::forward (func)); + } + + std::vector>> buffer; AbstractFifo abstractFifo; }; @@ -239,7 +259,7 @@ class MPESamplerVoice : public MPESynthesiserVoice { public: explicit MPESamplerVoice (std::shared_ptr sound) - : samplerSound (move (sound)) + : samplerSound (std::move (sound)) { jassert (samplerSound != nullptr); } @@ -290,6 +310,25 @@ class MPESamplerVoice : public MPESynthesiserVoice void renderNextBlock (AudioBuffer& outputBuffer, int startSample, int numSamples) override + { + render (outputBuffer, startSample, numSamples); + } + + void renderNextBlock (AudioBuffer& outputBuffer, + int startSample, + int numSamples) override + { + render (outputBuffer, startSample, numSamples); + } + + double getCurrentSamplePosition() const + { + return currentSamplePos; + } + +private: + template + void render (AudioBuffer& outputBuffer, int startSample, int numSamples) { jassert (samplerSound->getSample() != nullptr); @@ -316,16 +355,11 @@ class MPESamplerVoice : public MPESynthesiserVoice writePos += 1; } - double getCurrentSamplePosition() const - { - return currentSamplePos; - } - -private: + template bool renderNextSample (const float* inL, const float* inR, - float* outL, - float* outR, + Element* outL, + Element* outR, size_t writePos) { auto currentLevel = level.getNextValue(); @@ -347,13 +381,13 @@ class MPESamplerVoice : public MPESynthesiserVoice auto pos = (int) currentSamplePos; auto nextPos = pos + 1; - auto alpha = (float) (currentSamplePos - pos); + auto alpha = (Element) (currentSamplePos - pos); auto invAlpha = 1.0f - alpha; // just using a very simple linear interpolation here.. - auto l = static_cast (currentLevel * (inL[pos] * invAlpha + inL[nextPos] * alpha)); - auto r = static_cast ((inR != nullptr) ? currentLevel * (inR[pos] * invAlpha + inR[nextPos] * alpha) - : l); + auto l = static_cast (currentLevel * (inL[pos] * invAlpha + inL[nextPos] * alpha)); + auto r = static_cast ((inR != nullptr) ? currentLevel * (inR[pos] * invAlpha + inR[nextPos] * alpha) + : l); if (outR != nullptr) { @@ -416,6 +450,9 @@ class MPESamplerVoice : public MPESynthesiserVoice case Direction::backward: nextSamplePos -= nextPitchRatio; break; + + default: + break; } // Update current sample position, taking loop mode into account @@ -521,7 +558,7 @@ class MemoryAudioFormatReaderFactory : public AudioFormatReaderFactory dataSize (dataSizeIn) {} - std::unique_ptr make (AudioFormatManager&manager ) const override + std::unique_ptr make (AudioFormatManager& manager) const override { return makeAudioFormatReader (manager, sampleData, dataSize); } @@ -621,7 +658,7 @@ struct VariantConverter> } // namespace juce //============================================================================== -class VisibleRangeDataModel : public ValueTree::Listener +class VisibleRangeDataModel : private ValueTree::Listener { public: class Listener @@ -722,7 +759,7 @@ class VisibleRangeDataModel : public ValueTree::Listener }; //============================================================================== -class MPESettingsDataModel : public ValueTree::Listener +class MPESettingsDataModel : private ValueTree::Listener { public: class Listener @@ -912,7 +949,7 @@ class MPESettingsDataModel : public ValueTree::Listener }; //============================================================================== -class DataModel : public ValueTree::Listener +class DataModel : private ValueTree::Listener { public: class Listener @@ -1098,7 +1135,7 @@ constexpr int controlSeparation = 6; //============================================================================== class MPELegacySettingsComponent final : public Component, - public MPESettingsDataModel::Listener + private MPESettingsDataModel::Listener { public: explicit MPELegacySettingsComponent (const MPESettingsDataModel& model, @@ -1220,7 +1257,7 @@ class MPELegacySettingsComponent final : public Component, //============================================================================== class MPENewSettingsComponent final : public Component, - public MPESettingsDataModel::Listener + private MPESettingsDataModel::Listener { public: MPENewSettingsComponent (const MPESettingsDataModel& model, @@ -1316,7 +1353,7 @@ class MPENewSettingsComponent final : public Component, //============================================================================== class MPESettingsComponent final : public Component, - public MPESettingsDataModel::Listener + private MPESettingsDataModel::Listener { public: MPESettingsComponent (const MPESettingsDataModel& model, @@ -1487,7 +1524,7 @@ class LoopPointMarker : public Component //============================================================================== class Ruler : public Component, - public VisibleRangeDataModel::Listener + private VisibleRangeDataModel::Listener { public: explicit Ruler (const VisibleRangeDataModel& model) @@ -1533,14 +1570,13 @@ class Ruler : public Component, auto xPos = (time - visibleRange.getVisibleRange().getStart()) * getWidth() / visibleRange.getVisibleRange().getLength(); - std::ostringstream out_stream; - out_stream << std::setprecision (roundToInt (precision)) << roundToInt (time); + std::ostringstream outStream; + outStream << std::setprecision (roundToInt (precision)) << time; - g.drawText (out_stream.str(), - Rectangle (Point (roundToInt (xPos) + 3, 0), - Point (roundToInt (xPos + minDivisionWidth), getHeight())), - Justification::centredLeft, - false); + const auto bounds = Rectangle (Point (roundToInt (xPos) + 3, 0), + Point (roundToInt (xPos + minDivisionWidth), getHeight())); + + g.drawText (outStream.str(), bounds, Justification::centredLeft, false); g.drawVerticalLine (roundToInt (xPos), 2.0f, (float) getHeight()); } @@ -1579,8 +1615,8 @@ class Ruler : public Component, //============================================================================== class LoopPointsOverlay : public Component, - public DataModel::Listener, - public VisibleRangeDataModel::Listener + private DataModel::Listener, + private VisibleRangeDataModel::Listener { public: LoopPointsOverlay (const DataModel& dModel, @@ -1680,8 +1716,8 @@ class LoopPointsOverlay : public Component, //============================================================================== class PlaybackPositionOverlay : public Component, - public Timer, - public VisibleRangeDataModel::Listener + private Timer, + private VisibleRangeDataModel::Listener { public: using Provider = std::function()>; @@ -1727,9 +1763,9 @@ class PlaybackPositionOverlay : public Component, //============================================================================== class WaveformView : public Component, - public ChangeListener, - public DataModel::Listener, - public VisibleRangeDataModel::Listener + private ChangeListener, + private DataModel::Listener, + private VisibleRangeDataModel::Listener { public: WaveformView (const DataModel& model, @@ -1814,7 +1850,7 @@ class WaveformView : public Component, //============================================================================== class WaveformEditor : public Component, - public DataModel::Listener + private DataModel::Listener { public: WaveformEditor (const DataModel& model, @@ -1870,7 +1906,8 @@ class WaveformEditor : public Component, //============================================================================== class MainSamplerView : public Component, - public DataModel::Listener + private DataModel::Listener, + private ChangeListener { public: MainSamplerView (const DataModel& model, @@ -1878,19 +1915,21 @@ class MainSamplerView : public Component, UndoManager& um) : dataModel (model), waveformEditor (dataModel, move (provider), um), - undoManager (&um) + undoManager (um) { dataModel.addListener (*this); addAndMakeVisible (waveformEditor); addAndMakeVisible (loadNewSampleButton); + addAndMakeVisible (undoButton); + addAndMakeVisible (redoButton); auto setReader = [this] (const FileChooser& fc) { - undoManager->beginNewTransaction(); + undoManager.beginNewTransaction(); auto readerFactory = new FileAudioFormatReaderFactory (fc.getResult()); dataModel.setSampleReader (std::unique_ptr (readerFactory), - undoManager); + &undoManager); }; loadNewSampleButton.onClick = [this, setReader] @@ -1903,9 +1942,9 @@ class MainSamplerView : public Component, addAndMakeVisible (centreFrequency); centreFrequency.onValueChange = [this] { - undoManager->beginNewTransaction(); + undoManager.beginNewTransaction(); dataModel.setCentreFrequencyHz (centreFrequency.getValue(), - centreFrequency.isMouseButtonDown() ? nullptr : undoManager); + centreFrequency.isMouseButtonDown() ? nullptr : &undoManager); }; centreFrequency.setRange (20, 20000, 1); @@ -1925,8 +1964,8 @@ class MainSamplerView : public Component, { if (loopKindNone.getToggleState()) { - undoManager->beginNewTransaction(); - dataModel.setLoopMode (LoopMode::none, undoManager); + undoManager.beginNewTransaction(); + dataModel.setLoopMode (LoopMode::none, &undoManager); } }; @@ -1934,8 +1973,8 @@ class MainSamplerView : public Component, { if (loopKindForward.getToggleState()) { - undoManager->beginNewTransaction(); - dataModel.setLoopMode (LoopMode::forward, undoManager); + undoManager.beginNewTransaction(); + dataModel.setLoopMode (LoopMode::forward, &undoManager); } }; @@ -1943,16 +1982,36 @@ class MainSamplerView : public Component, { if (loopKindPingpong.getToggleState()) { - undoManager->beginNewTransaction(); - dataModel.setLoopMode (LoopMode::pingpong, undoManager); + undoManager.beginNewTransaction(); + dataModel.setLoopMode (LoopMode::pingpong, &undoManager); } }; + undoButton.onClick = [this] { undoManager.undo(); }; + redoButton.onClick = [this] { undoManager.redo(); }; + addAndMakeVisible (centreFrequencyLabel); addAndMakeVisible (loopKindLabel); + + changeListenerCallback (&undoManager); + undoManager.addChangeListener (this); + } + + ~MainSamplerView() override + { + undoManager.removeChangeListener (this); } private: + void changeListenerCallback (ChangeBroadcaster* source) override + { + if (source == &undoManager) + { + undoButton.setEnabled (undoManager.canUndo()); + redoButton.setEnabled (undoManager.canRedo()); + } + } + void resized() override { auto bounds = getLocalBounds(); @@ -1960,6 +2019,8 @@ class MainSamplerView : public Component, auto topBar = bounds.removeFromTop (50); auto padding = 4; loadNewSampleButton .setBounds (topBar.removeFromRight (100).reduced (padding)); + redoButton .setBounds (topBar.removeFromRight (100).reduced (padding)); + undoButton .setBounds (topBar.removeFromRight (100).reduced (padding)); centreFrequencyLabel.setBounds (topBar.removeFromLeft (100).reduced (padding)); centreFrequency .setBounds (topBar.removeFromLeft (100).reduced (padding)); @@ -1985,6 +2046,9 @@ class MainSamplerView : public Component, case LoopMode::pingpong: loopKindPingpong.setToggleState (true, dontSendNotification); break; + + default: + break; } } @@ -1996,6 +2060,8 @@ class MainSamplerView : public Component, DataModel dataModel; WaveformEditor waveformEditor; TextButton loadNewSampleButton { "Load New Sample" }; + TextButton undoButton { "Undo" }; + TextButton redoButton { "Redo" }; Slider centreFrequency; TextButton loopKindNone { "None" }, @@ -2009,7 +2075,7 @@ class MainSamplerView : public Component, FileChooser fileChooser { "Select a file to load...", File(), dataModel.getAudioFormatManager().getWildcardForAllFormats() }; - UndoManager* undoManager; + UndoManager& undoManager; }; //============================================================================== @@ -2074,7 +2140,7 @@ class SamplerAudioProcessor : public AudioProcessor // This function will be called from the message thread. We lock the command // queue to ensure that no messages are processed for the duration of this // call. - std::lock_guard lock (commandQueueMutex); + SpinLock::ScopedLockType lock (commandQueueMutex); ProcessorState state; state.synthVoices = synthesiser.getNumVoices(); @@ -2096,7 +2162,7 @@ class SamplerAudioProcessor : public AudioProcessor bool hasEditor() const override { return true; } //============================================================================== - const String getName() const override { return JucePlugin_Name; } + const String getName() const override { return "SamplerPlugin"; } bool acceptsMidi() const override { return true; } bool producesMidi() const override { return false; } bool isMidiEffect() const override { return false; } @@ -2114,49 +2180,14 @@ class SamplerAudioProcessor : public AudioProcessor void setStateInformation (const void*, int) override {} //============================================================================== - void processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) override + void processBlock (AudioBuffer& buffer, MidiBuffer& midi) override { - // Try to acquire a lock on the command queue. - // If we were successful, we pop all pending commands off the queue and - // apply them to the processor. - // If we weren't able to acquire the lock, it's because someone called - // createEditor, which requires that the processor data model stays in - // a valid state for the duration of the call. - std::unique_lock lock (commandQueueMutex, std::try_to_lock); - - if (lock.owns_lock()) - { - while (auto command = incomingCommands.pop()) - { - command->run (*this); - // We push the command onto the outgoing buffer, as long as it has - // room. If it doesn't have room for some reason, we'll delete - // the command right here on this thread, which might take a while - // and cause the audio to glitch, so I hope the buffer size is big - // enough! - outgoingCommands.push (move (command)); - } - } - - synthesiser.renderNextBlock (buffer, midiMessages, 0, buffer.getNumSamples()); - - auto loadedSamplerSound = samplerSound; - - if (loadedSamplerSound->getSample() == nullptr) - return; - - auto numVoices = synthesiser.getNumVoices(); - - // Update the current playback positions - for (auto i = 0; i < maxVoices; ++i) - { - auto* voicePtr = dynamic_cast (synthesiser.getVoice (i)); + process (buffer, midi); + } - if (i < numVoices && voicePtr != nullptr) - playbackPositions[(size_t) i] = static_cast (voicePtr->getCurrentSamplePosition() / loadedSamplerSound->getSample()->getSampleRate()); - else - playbackPositions[(size_t) i] = 0.0f; - } + void processBlock (AudioBuffer& buffer, MidiBuffer& midi) override + { + process (buffer, midi); } // These should be called from the GUI thread, and will block until the @@ -2205,75 +2236,75 @@ class SamplerAudioProcessor : public AudioProcessor if (fact == nullptr) { - pushCommand (SetSampleCommand (move (fact), - nullptr, - move (newSamplerVoices))); + commands.push (SetSampleCommand (move (fact), + nullptr, + move (newSamplerVoices))); } else { auto reader = fact->make (formatManager); - pushCommand (SetSampleCommand (move (fact), - std::unique_ptr (new Sample (*reader, 10.0)), - move (newSamplerVoices))); + commands.push (SetSampleCommand (move (fact), + std::unique_ptr (new Sample (*reader, 10.0)), + move (newSamplerVoices))); } } void setCentreFrequency (double centreFrequency) { - pushCommand ([centreFrequency] (SamplerAudioProcessor& proc) - { - auto loaded = proc.samplerSound; - if (loaded != nullptr) - loaded->setCentreFrequencyInHz (centreFrequency); - }); + commands.push ([centreFrequency] (SamplerAudioProcessor& proc) + { + auto loaded = proc.samplerSound; + if (loaded != nullptr) + loaded->setCentreFrequencyInHz (centreFrequency); + }); } void setLoopMode (LoopMode loopMode) { - pushCommand ([loopMode] (SamplerAudioProcessor& proc) - { - auto loaded = proc.samplerSound; - if (loaded != nullptr) - loaded->setLoopMode (loopMode); - }); + commands.push ([loopMode] (SamplerAudioProcessor& proc) + { + auto loaded = proc.samplerSound; + if (loaded != nullptr) + loaded->setLoopMode (loopMode); + }); } void setLoopPoints (Range loopPoints) { - pushCommand ([loopPoints] (SamplerAudioProcessor& proc) - { - auto loaded = proc.samplerSound; - if (loaded != nullptr) - loaded->setLoopPointsInSeconds (loopPoints); - }); + commands.push ([loopPoints] (SamplerAudioProcessor& proc) + { + auto loaded = proc.samplerSound; + if (loaded != nullptr) + loaded->setLoopPointsInSeconds (loopPoints); + }); } void setMPEZoneLayout (MPEZoneLayout layout) { - pushCommand ([layout] (SamplerAudioProcessor& proc) - { - // setZoneLayout will lock internally, so we don't care too much about - // ensuring that the layout doesn't get copied or destroyed on the - // audio thread. If the audio glitches while updating midi settings - // it doesn't matter too much. - proc.synthesiser.setZoneLayout (layout); - }); + commands.push ([layout] (SamplerAudioProcessor& proc) + { + // setZoneLayout will lock internally, so we don't care too much about + // ensuring that the layout doesn't get copied or destroyed on the + // audio thread. If the audio glitches while updating midi settings + // it doesn't matter too much. + proc.synthesiser.setZoneLayout (layout); + }); } void setLegacyModeEnabled (int pitchbendRange, Range channelRange) { - pushCommand ([pitchbendRange, channelRange] (SamplerAudioProcessor& proc) - { - proc.synthesiser.enableLegacyMode (pitchbendRange, channelRange); - }); + commands.push ([pitchbendRange, channelRange] (SamplerAudioProcessor& proc) + { + proc.synthesiser.enableLegacyMode (pitchbendRange, channelRange); + }); } void setVoiceStealingEnabled (bool voiceStealingEnabled) { - pushCommand ([voiceStealingEnabled] (SamplerAudioProcessor& proc) - { - proc.synthesiser.setVoiceStealingEnabled (voiceStealingEnabled); - }); + commands.push ([voiceStealingEnabled] (SamplerAudioProcessor& proc) + { + proc.synthesiser.setVoiceStealingEnabled (voiceStealingEnabled); + }); } void setNumberOfVoices (int numberOfVoices) @@ -2287,7 +2318,7 @@ class SamplerAudioProcessor : public AudioProcessor { public: SetNumVoicesCommand (std::vector> newVoicesIn) - : newVoices (move (newVoicesIn)) + : newVoices (std::move (newVoicesIn)) {} void operator() (SamplerAudioProcessor& proc) @@ -2311,7 +2342,7 @@ class SamplerAudioProcessor : public AudioProcessor for (auto i = 0; i != numberOfVoices; ++i) newSamplerVoices.emplace_back (new MPESamplerVoice (loadedSamplerSound)); - pushCommand (SetNumVoicesCommand (move (newSamplerVoices))); + commands.push (SetNumVoicesCommand (move (newSamplerVoices))); } // These accessors are just for an 'overview' and won't give the exact @@ -2327,8 +2358,8 @@ class SamplerAudioProcessor : public AudioProcessor //============================================================================== class SamplerAudioProcessorEditor : public AudioProcessorEditor, public FileDragAndDropTarget, - public DataModel::Listener, - public MPESettingsDataModel::Listener + private DataModel::Listener, + private MPESettingsDataModel::Listener { public: SamplerAudioProcessorEditor (SamplerAudioProcessor& p, ProcessorState state) @@ -2497,6 +2528,7 @@ class SamplerAudioProcessor : public AudioProcessor DataModel dataModel { formatManager }; UndoManager undoManager; MPESettingsDataModel mpeSettings { dataModel.mpeSettings() }; + TabbedComponent tabbedComponent { TabbedButtonBar::Orientation::TabsAtTop }; MPESettingsComponent settingsComponent { dataModel.mpeSettings(), undoManager }; MainSamplerView mainSamplerView; @@ -2505,79 +2537,43 @@ class SamplerAudioProcessor : public AudioProcessor }; //============================================================================== - // We want to send type-erased commands to the audio thread, but we also - // want those commands to contain move-only resources, so that we can - // construct resources on the gui thread, and then transfer ownership - // cheaply to the audio thread. We can't do this with std::function - // because it enforces that functions are copy-constructible. - // Therefore, we use a very simple templated type-eraser here. - struct Command - { - virtual ~Command() noexcept = default; - virtual void run (SamplerAudioProcessor& proc) = 0; - }; - - template - class TemplateCommand : public Command, - public Func + template + void process (AudioBuffer& buffer, MidiBuffer& midiMessages) { - public: - template - explicit TemplateCommand (FuncPrime&& funcPrime) - : Func (std::forward (funcPrime)) - {} + // Try to acquire a lock on the command queue. + // If we were successful, we pop all pending commands off the queue and + // apply them to the processor. + // If we weren't able to acquire the lock, it's because someone called + // createEditor, which requires that the processor data model stays in + // a valid state for the duration of the call. + const GenericScopedTryLock lock (commandQueueMutex); - void run (SamplerAudioProcessor& proc) override - { - (*this) (proc); - } - }; + if (lock.isLocked()) + commands.call (*this); - template - static std::unique_ptr make_command (Func&& func) - { - return std::unique_ptr> (new TemplateCommand (std::forward (func))); - } + synthesiser.renderNextBlock (buffer, midiMessages, 0, buffer.getNumSamples()); - using CommandFifo = MoveOnlyFifo>; + auto loadedSamplerSound = samplerSound; - class OutgoingBufferCleaner : public Timer - { - public: - explicit OutgoingBufferCleaner (CommandFifo& bufferToEmpty) - : buffer (bufferToEmpty) - { - startTimer (500); - } + if (loadedSamplerSound->getSample() == nullptr) + return; - private: - void timerCallback() override + auto numVoices = synthesiser.getNumVoices(); + + // Update the current playback positions + for (auto i = 0; i < maxVoices; ++i) { - while (auto command = buffer.pop()) - command = {}; - } + auto* voicePtr = dynamic_cast (synthesiser.getVoice (i)); - CommandFifo& buffer; - }; + if (i < numVoices && voicePtr != nullptr) + playbackPositions[(size_t) i] = static_cast (voicePtr->getCurrentSamplePosition() / loadedSamplerSound->getSample()->getSampleRate()); + else + playbackPositions[(size_t) i] = 0.0f; + } - // Spin, trying to post a command to the sampler sound, until there's - // enough room in the command buffer to accept the new command. - template - void pushCommand (Func&& func) - { - auto command = make_command (std::forward (func)); - while (command) - command = incomingCommands.push (move (command)); } - // We have an incoming and an outgoing command queue. The incoming commands - // are used to update the sampler sound in a thread-safe way, without - // blocking. Once we've consumed a command, we push it back onto the - // outgoing command queue, which is cleaned up periodically by the - // outgoingBufferCleaner. - CommandFifo incomingCommands; - CommandFifo outgoingCommands; - OutgoingBufferCleaner outgoingBufferCleaner { outgoingCommands }; + CommandFifo commands; MemoryBlock mb; std::unique_ptr readerFactory; @@ -2587,9 +2583,9 @@ class SamplerAudioProcessor : public AudioProcessor // This mutex is used to ensure we don't modify the processor state during // a call to createEditor, which would cause the UI to become desynched // with the real state of the processor. - std::mutex commandQueueMutex; + SpinLock commandQueueMutex; - static const int maxVoices { 20 }; + static constexpr auto maxVoices { 20 }; // This is used for visualising the current playback position of each voice. std::array, maxVoices> playbackPositions; diff --git a/examples/Plugins/SurroundPluginDemo.h b/examples/Plugins/SurroundPluginDemo.h index e15d3cc12fe6..b973788d2784 100644 --- a/examples/Plugins/SurroundPluginDemo.h +++ b/examples/Plugins/SurroundPluginDemo.h @@ -270,6 +270,8 @@ class SurroundProcessor : public AudioProcessor, } } + using AudioProcessor::processBlock; + //============================================================================== AudioProcessorEditor* createEditor() override { return new SurroundEditor (*this); } bool hasEditor() const override { return true; } diff --git a/extras/AudioPluginHost/AudioPluginHost.jucer b/extras/AudioPluginHost/AudioPluginHost.jucer index 954eb3566e40..3aa6af21fea8 100644 --- a/extras/AudioPluginHost/AudioPluginHost.jucer +++ b/extras/AudioPluginHost/AudioPluginHost.jucer @@ -29,6 +29,7 @@ + @@ -51,6 +52,7 @@ + + + + + + @@ -207,7 +214,7 @@ @@ -219,6 +226,7 @@ + diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index 5b2beba4bd89..71a2458ddc1f 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -20,9 +20,9 @@ include_directories( AFTER enable_language(ASM) IF(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions("-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=0" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DDEBUG=1" "-D_DEBUG=1") + add_definitions("-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DDEBUG=1" "-D_DEBUG=1") ELSEIF(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions("-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=0" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DNDEBUG=1") + add_definitions("-DJUCER_ANDROIDSTUDIO_7F0E4A25=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DNDEBUG=1") if(NOT (ANDROID_ABI STREQUAL "mips" OR ANDROID_ABI STREQUAL "mips64")) SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto") SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto") @@ -785,6 +785,63 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_data_structures/juce_data_structures.cpp" "../../../../../modules/juce_data_structures/juce_data_structures.mm" "../../../../../modules/juce_data_structures/juce_data_structures.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" + "../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" + "../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" + "../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" + "../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" + "../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Convolution.h" + "../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" + "../../../../../modules/juce_dsp/frequency/juce_FFT.h" + "../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" + "../../../../../modules/juce_dsp/frequency/juce_Windowing.h" + "../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" + "../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" + "../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" + "../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" + "../../../../../modules/juce_dsp/maths/juce_LookupTable.h" + "../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" + "../../../../../modules/juce_dsp/maths/juce_Matrix.h" + "../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" + "../../../../../modules/juce_dsp/maths/juce_Phase.h" + "../../../../../modules/juce_dsp/maths/juce_Polynomial.h" + "../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" + "../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" + "../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" + "../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" + "../../../../../modules/juce_dsp/processors/juce_Bias.h" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" + "../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_Gain.h" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" + "../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" + "../../../../../modules/juce_dsp/processors/juce_LadderFilter.cpp" + "../../../../../modules/juce_dsp/processors/juce_LadderFilter.h" + "../../../../../modules/juce_dsp/processors/juce_Oscillator.h" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" + "../../../../../modules/juce_dsp/processors/juce_Oversampling.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" + "../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" + "../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" + "../../../../../modules/juce_dsp/processors/juce_Reverb.h" + "../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" + "../../../../../modules/juce_dsp/processors/juce_WaveShaper.h" + "../../../../../modules/juce_dsp/juce_dsp.cpp" + "../../../../../modules/juce_dsp/juce_dsp.mm" + "../../../../../modules/juce_dsp/juce_dsp.h" "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" "../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" "../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" @@ -1398,6 +1455,7 @@ add_library( ${BINARY_NAME} "../../../JuceLibraryCode/include_juce_core.cpp" "../../../JuceLibraryCode/include_juce_cryptography.cpp" "../../../JuceLibraryCode/include_juce_data_structures.cpp" + "../../../JuceLibraryCode/include_juce_dsp.cpp" "../../../JuceLibraryCode/include_juce_events.cpp" "../../../JuceLibraryCode/include_juce_graphics.cpp" "../../../JuceLibraryCode/include_juce_gui_basics.cpp" @@ -2150,6 +2208,63 @@ set_source_files_properties("../../../../../modules/juce_data_structures/values/ set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.mm" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_data_structures/juce_data_structures.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_AudioBlock_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/containers/juce_SIMDRegister_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/filter_design/juce_FilterDesign.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Convolution.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_FFT_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/frequency/juce_Windowing.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_FastMathApproximations.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LogRampedValue_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_LookupTable.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Matrix_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Phase.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_Polynomial.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/maths/juce_SpecialFunctions.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_avx_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_fallback_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_neon_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/native/juce_sse_SIMDNativeOps.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Bias.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_FIRFilter_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Gain.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_IIRFilter_Impl.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LadderFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_LadderFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oscillator.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Oversampling.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessContext.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorChain_test.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorDuplicator.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_ProcessorWrapper.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_Reverb.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_StateVariableFilter.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/processors/juce_WaveShaper.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.mm" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_dsp/juce_dsp.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_events/broadcasters/juce_ActionListener.h" PROPERTIES HEADER_FILE_ONLY TRUE) diff --git a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile index 0813d0618b60..f7fb6da92b42 100644 --- a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile @@ -35,7 +35,7 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=0" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" JUCE_TARGET_APP := AudioPluginHost @@ -56,7 +56,7 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=0" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_REPORT_APP_USAGE=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60000" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_USE_CAMERA=0" "-DJUCE_STANDALONE_APPLICATION=1" $(shell pkg-config --cflags alsa x11 xinerama xext freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" JUCE_TARGET_APP := AudioPluginHost @@ -83,6 +83,7 @@ OBJECTS_APP := \ $(JUCE_OBJDIR)/include_juce_core_f26d17db.o \ $(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \ $(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o \ + $(JUCE_OBJDIR)/include_juce_dsp_aeb2060f.o \ $(JUCE_OBJDIR)/include_juce_events_fd7d695.o \ $(JUCE_OBJDIR)/include_juce_graphics_f817e147.o \ $(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \ @@ -178,6 +179,11 @@ $(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o: ../../JuceLibraryCode/in @echo "Compiling include_juce_data_structures.cpp" $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" +$(JUCE_OBJDIR)/include_juce_dsp_aeb2060f.o: ../../JuceLibraryCode/include_juce_dsp.cpp + -$(V_AT)mkdir -p $(JUCE_OBJDIR) + @echo "Compiling include_juce_dsp.cpp" + $(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<" + $(JUCE_OBJDIR)/include_juce_events_fd7d695.o: ../../JuceLibraryCode/include_juce_events.cpp -$(V_AT)mkdir -p $(JUCE_OBJDIR) @echo "Compiling include_juce_events.cpp" diff --git a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj index 8366540d2fef..b99693457ede 100644 --- a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj @@ -141,6 +141,10 @@ isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; }; + A5F0B3B7175766C8AF1D6C3E = { + isa = PBXBuildFile; + fileRef = 36689CA4EFC2AF183A0848AE; + }; 7DE202DC1D876F49266D9E7D = { isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; @@ -221,6 +225,13 @@ path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 36689CA4EFC2AF183A0848AE = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.objcpp; + name = "include_juce_dsp.mm"; + path = "../../JuceLibraryCode/include_juce_dsp.mm"; + sourceTree = "SOURCE_ROOT"; + }; 37E4D5C341406B7072120006 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; @@ -417,6 +428,13 @@ path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 9320A145F2A8ACD687D6608E = { + isa = PBXFileReference; + lastKnownFileType = file; + name = "juce_dsp"; + path = "../../../../modules/juce_dsp"; + sourceTree = "SOURCE_ROOT"; + }; 938AE72315C6C93949F6220E = { isa = PBXFileReference; lastKnownFileType = file; @@ -668,6 +686,7 @@ 3D57FE2A8877F12A61054726, FA21631C5536EA3DF55C7FA6, B86B918291E1090C6A720971, + 9320A145F2A8ACD687D6608E, 59842A98E5EBBC54B50C04CD, 94CB96C8E4B51F52776C2638, 938AE72315C6C93949F6220E, @@ -691,6 +710,7 @@ 683CEE986A2467C850FE99E6, B8E24A5CEE6B7055537725CF, 5EF1D381F42AA8764597F189, + 36689CA4EFC2AF183A0848AE, 8290D7BAC160B3A56B66891A, 82800DBA287EF4BAB13B42FB, 8FE7B37CDE0818DB27BDDEBD, @@ -794,6 +814,7 @@ "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", "JUCE_MODULE_AVAILABLE_juce_data_structures=1", + "JUCE_MODULE_AVAILABLE_juce_dsp=1", "JUCE_MODULE_AVAILABLE_juce_events=1", "JUCE_MODULE_AVAILABLE_juce_graphics=1", "JUCE_MODULE_AVAILABLE_juce_gui_basics=1", @@ -805,7 +826,7 @@ "JUCE_DIRECTSOUND=1", "JUCE_ALSA=1", "JUCE_USE_FLAC=0", - "JUCE_USE_OGGVORBIS=0", + "JUCE_USE_OGGVORBIS=1", "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", @@ -871,6 +892,7 @@ "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", "JUCE_MODULE_AVAILABLE_juce_data_structures=1", + "JUCE_MODULE_AVAILABLE_juce_dsp=1", "JUCE_MODULE_AVAILABLE_juce_events=1", "JUCE_MODULE_AVAILABLE_juce_graphics=1", "JUCE_MODULE_AVAILABLE_juce_gui_basics=1", @@ -882,7 +904,7 @@ "JUCE_DIRECTSOUND=1", "JUCE_ALSA=1", "JUCE_USE_FLAC=0", - "JUCE_USE_OGGVORBIS=0", + "JUCE_USE_OGGVORBIS=1", "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", @@ -1058,6 +1080,7 @@ 76A80851698FC773D2479B4E, E4A926EF695823F0F13268FF, A09E93F1B354E1FF8B3E9ABE, + A5F0B3B7175766C8AF1D6C3E, 7DE202DC1D876F49266D9E7D, 075C54DDDBDEA5AAD2F60154, 2C3D221D2AA87F07B3F1044D, diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj index f3db3c2e9057..0e7c0c9028e5 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=0;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) MultiThreadedDebugDLL true @@ -106,7 +106,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=0;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -1025,6 +1025,72 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -1919,6 +1985,7 @@ + @@ -2346,6 +2413,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters index faec4a60ff75..4bd2d17b4dc8 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters @@ -266,6 +266,27 @@ {911F0159-A7A8-4A43-3FD4-154F62F4A44B} + + {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} + + + {29C6FE02-507E-F3FE-16CD-74D84842C1EA} + + + {8001BD68-125B-E392-8D3B-1F9C9520A65A} + + + {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} + + + {B813BD14-6565-2525-9AC3-E3AA48EDDA85} + + + {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} + + + {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} + {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} @@ -1381,6 +1402,75 @@ JUCE Modules\juce_data_structures + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\filter_design + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp + + + JUCE Modules\juce_dsp + JUCE Modules\juce_events\broadcasters @@ -2359,6 +2449,9 @@ JUCE Library Code + + JUCE Library Code + JUCE Library Code @@ -3636,6 +3729,108 @@ JUCE Modules\juce_data_structures + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\filter_design + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp + JUCE Modules\juce_events\broadcasters diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj index 35870f9878fe..46eff04ce414 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=0;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) MultiThreadedDebugDLL true @@ -106,7 +106,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=0;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -1025,6 +1025,72 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -1919,6 +1985,7 @@ + @@ -2346,6 +2413,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters index d84b6ad583fb..8297afdec8a8 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters @@ -266,6 +266,27 @@ {911F0159-A7A8-4A43-3FD4-154F62F4A44B} + + {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} + + + {29C6FE02-507E-F3FE-16CD-74D84842C1EA} + + + {8001BD68-125B-E392-8D3B-1F9C9520A65A} + + + {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} + + + {B813BD14-6565-2525-9AC3-E3AA48EDDA85} + + + {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} + + + {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} + {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} @@ -1381,6 +1402,75 @@ JUCE Modules\juce_data_structures + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\filter_design + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp + + + JUCE Modules\juce_dsp + JUCE Modules\juce_events\broadcasters @@ -2359,6 +2449,9 @@ JUCE Library Code + + JUCE Library Code + JUCE Library Code @@ -3636,6 +3729,108 @@ JUCE Modules\juce_data_structures + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\filter_design + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp + JUCE Modules\juce_events\broadcasters diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index 1b7a41738f28..212edcaa215d 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=0;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) MultiThreadedDebugDLL true @@ -106,7 +106,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=0;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_REPORT_APP_USAGE=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60000;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_USE_CAMERA=0;JUCE_STANDALONE_APPLICATION=1;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -1025,6 +1025,72 @@ true + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + true @@ -1919,6 +1985,7 @@ + @@ -2346,6 +2413,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index ee229dd6261f..2dc24a282a43 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -266,6 +266,27 @@ {911F0159-A7A8-4A43-3FD4-154F62F4A44B} + + {53CF03D3-988B-CD28-9130-CE08FDCEF7E9} + + + {29C6FE02-507E-F3FE-16CD-74D84842C1EA} + + + {8001BD68-125B-E392-8D3B-1F9C9520A65A} + + + {EDC17061-CFA0-8EA0-0ADA-90F31C2FB0F2} + + + {B813BD14-6565-2525-9AC3-E3AA48EDDA85} + + + {DDF4BA73-8578-406D-21F8-06B9BC70BFEA} + + + {5DD60D0E-B16A-0BED-EDC4-C56E6960CA9E} + {9D5816C2-E2B2-2E3F-B095-AC8BD1100D29} @@ -1381,6 +1402,75 @@ JUCE Modules\juce_data_structures + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\filter_design + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp + + + JUCE Modules\juce_dsp + JUCE Modules\juce_events\broadcasters @@ -2359,6 +2449,9 @@ JUCE Library Code + + JUCE Library Code + JUCE Library Code @@ -3636,6 +3729,108 @@ JUCE Modules\juce_data_structures + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\containers + + + JUCE Modules\juce_dsp\filter_design + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\frequency + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\maths + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\native + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp\processors + + + JUCE Modules\juce_dsp + JUCE Modules\juce_events\broadcasters diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj index 70f13a4a311a..46898eb32abc 100644 --- a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj @@ -145,6 +145,10 @@ isa = PBXBuildFile; fileRef = 5EF1D381F42AA8764597F189; }; + A5F0B3B7175766C8AF1D6C3E = { + isa = PBXBuildFile; + fileRef = 36689CA4EFC2AF183A0848AE; + }; 7DE202DC1D876F49266D9E7D = { isa = PBXBuildFile; fileRef = 8290D7BAC160B3A56B66891A; @@ -246,6 +250,13 @@ path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 36689CA4EFC2AF183A0848AE = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.cpp.objcpp; + name = "include_juce_dsp.mm"; + path = "../../JuceLibraryCode/include_juce_dsp.mm"; + sourceTree = "SOURCE_ROOT"; + }; 37E4D5C341406B7072120006 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; @@ -428,6 +439,13 @@ path = "../../JuceLibraryCode/include_juce_gui_basics.mm"; sourceTree = "SOURCE_ROOT"; }; + 9320A145F2A8ACD687D6608E = { + isa = PBXFileReference; + lastKnownFileType = file; + name = "juce_dsp"; + path = "../../../../modules/juce_dsp"; + sourceTree = "SOURCE_ROOT"; + }; 938AE72315C6C93949F6220E = { isa = PBXFileReference; lastKnownFileType = file; @@ -679,6 +697,7 @@ 3D57FE2A8877F12A61054726, FA21631C5536EA3DF55C7FA6, B86B918291E1090C6A720971, + 9320A145F2A8ACD687D6608E, 59842A98E5EBBC54B50C04CD, 94CB96C8E4B51F52776C2638, 938AE72315C6C93949F6220E, @@ -702,6 +721,7 @@ 683CEE986A2467C850FE99E6, B8E24A5CEE6B7055537725CF, 5EF1D381F42AA8764597F189, + 36689CA4EFC2AF183A0848AE, 8290D7BAC160B3A56B66891A, 82800DBA287EF4BAB13B42FB, 8FE7B37CDE0818DB27BDDEBD, @@ -808,6 +828,7 @@ "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", "JUCE_MODULE_AVAILABLE_juce_data_structures=1", + "JUCE_MODULE_AVAILABLE_juce_dsp=1", "JUCE_MODULE_AVAILABLE_juce_events=1", "JUCE_MODULE_AVAILABLE_juce_graphics=1", "JUCE_MODULE_AVAILABLE_juce_gui_basics=1", @@ -819,7 +840,7 @@ "JUCE_DIRECTSOUND=1", "JUCE_ALSA=1", "JUCE_USE_FLAC=0", - "JUCE_USE_OGGVORBIS=0", + "JUCE_USE_OGGVORBIS=1", "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", @@ -886,6 +907,7 @@ "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", "JUCE_MODULE_AVAILABLE_juce_data_structures=1", + "JUCE_MODULE_AVAILABLE_juce_dsp=1", "JUCE_MODULE_AVAILABLE_juce_events=1", "JUCE_MODULE_AVAILABLE_juce_graphics=1", "JUCE_MODULE_AVAILABLE_juce_gui_basics=1", @@ -897,7 +919,7 @@ "JUCE_DIRECTSOUND=1", "JUCE_ALSA=1", "JUCE_USE_FLAC=0", - "JUCE_USE_OGGVORBIS=0", + "JUCE_USE_OGGVORBIS=1", "JUCE_PLUGINHOST_VST3=1", "JUCE_PLUGINHOST_AU=1", "JUCE_PLUGINHOST_LADSPA=1", @@ -1077,6 +1099,7 @@ 76A80851698FC773D2479B4E, E4A926EF695823F0F13268FF, A09E93F1B354E1FF8B3E9ABE, + A5F0B3B7175766C8AF1D6C3E, 7DE202DC1D876F49266D9E7D, 075C54DDDBDEA5AAD2F60154, 2C3D221D2AA87F07B3F1044D, diff --git a/extras/AudioPluginHost/CMakeLists.txt b/extras/AudioPluginHost/CMakeLists.txt index 8ae21a49ed05..15adc821337b 100644 --- a/extras/AudioPluginHost/CMakeLists.txt +++ b/extras/AudioPluginHost/CMakeLists.txt @@ -48,5 +48,6 @@ target_compile_definitions(AudioPluginHost PRIVATE target_link_libraries(AudioPluginHost PRIVATE juce::juce_audio_utils juce::juce_cryptography + juce::juce_dsp juce::juce_opengl juce::juce_video) diff --git a/extras/AudioPluginHost/JuceLibraryCode/JuceHeader.h b/extras/AudioPluginHost/JuceLibraryCode/JuceHeader.h index 7501b2830b43..abe4445afefd 100644 --- a/extras/AudioPluginHost/JuceLibraryCode/JuceHeader.h +++ b/extras/AudioPluginHost/JuceLibraryCode/JuceHeader.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include diff --git a/extras/AudioPluginHost/JuceLibraryCode/include_juce_dsp.cpp b/extras/AudioPluginHost/JuceLibraryCode/include_juce_dsp.cpp new file mode 100644 index 000000000000..0f0af6599988 --- /dev/null +++ b/extras/AudioPluginHost/JuceLibraryCode/include_juce_dsp.cpp @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/AudioPluginHost/JuceLibraryCode/include_juce_dsp.mm b/extras/AudioPluginHost/JuceLibraryCode/include_juce_dsp.mm new file mode 100644 index 000000000000..a5cb956cfcba --- /dev/null +++ b/extras/AudioPluginHost/JuceLibraryCode/include_juce_dsp.mm @@ -0,0 +1,8 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include diff --git a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp index d8b7637f9553..9bb7234b2d1e 100644 --- a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp +++ b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.cpp @@ -20,109 +20,127 @@ #include "InternalPlugins.h" #include "PluginGraph.h" +#include "../../../../examples/Plugins/AUv3SynthPluginDemo.h" +#include "../../../../examples/Plugins/ArpeggiatorPluginDemo.h" +#include "../../../../examples/Plugins/AudioPluginDemo.h" +#include "../../../../examples/Plugins/DSPModulePluginDemo.h" +#include "../../../../examples/Plugins/GainPluginDemo.h" #include "../../../../examples/Plugins/MidiLoggerPluginDemo.h" +#include "../../../../examples/Plugins/MultiOutSynthPluginDemo.h" +#include "../../../../examples/Plugins/NoiseGatePluginDemo.h" +#include "../../../../examples/Plugins/SamplerPluginDemo.h" +#include "../../../../examples/Plugins/SurroundPluginDemo.h" //============================================================================== class InternalPlugin : public AudioPluginInstance { -protected: - InternalPlugin (const PluginDescription& descr, - const AudioChannelSet& channelSetToUse = AudioChannelSet::stereo()) - : AudioPluginInstance (getBusProperties (descr.numInputChannels == 0, channelSetToUse)), - name (descr.fileOrIdentifier.upToFirstOccurrenceOf (":", false, false)), - state (descr.fileOrIdentifier.fromFirstOccurrenceOf (":", false, false)), - isGenerator (descr.numInputChannels == 0), - hasMidi (descr.isInstrument), - channelSet (channelSetToUse) - { - jassert (channelSetToUse.size() == descr.numOutputChannels); - } - public: - //============================================================================== - const String getName() const override { return name; } - double getTailLengthSeconds() const override { return 0.0; } - bool acceptsMidi() const override { return hasMidi; } - bool producesMidi() const override { return hasMidi; } - AudioProcessorEditor* createEditor() override { return nullptr; } - bool hasEditor() const override { return false; } - int getNumPrograms() override { return 0; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override {} - const String getProgramName (int) override { return {}; } - void changeProgramName (int, const String&) override {} - void getStateInformation (juce::MemoryBlock&) override {} - void setStateInformation (const void*, int) override {} - - //============================================================================== - bool isBusesLayoutSupported (const BusesLayout& layout) const override + explicit InternalPlugin (std::unique_ptr innerIn) + : inner (std::move (innerIn)) { - if (! isGenerator) - if (layout.getMainOutputChannelSet() != channelSet) - return false; + jassert (inner != nullptr); - if (layout.getMainInputChannelSet() != channelSet) - return false; + for (auto isInput : { true, false }) + matchChannels (isInput); - return true; + setBusesLayout (inner->getBusesLayout()); } + //============================================================================== + const String getName() const override { return inner->getName(); } + StringArray getAlternateDisplayNames() const override { return inner->getAlternateDisplayNames(); } + double getTailLengthSeconds() const override { return inner->getTailLengthSeconds(); } + bool acceptsMidi() const override { return inner->acceptsMidi(); } + bool producesMidi() const override { return inner->producesMidi(); } + AudioProcessorEditor* createEditor() override { return inner->createEditor(); } + bool hasEditor() const override { return inner->hasEditor(); } + int getNumPrograms() override { return inner->getNumPrograms(); } + int getCurrentProgram() override { return inner->getCurrentProgram(); } + void setCurrentProgram (int i) override { inner->setCurrentProgram (i); } + const String getProgramName (int i) override { return inner->getProgramName (i); } + void changeProgramName (int i, const String& n) override { inner->changeProgramName (i, n); } + void getStateInformation (juce::MemoryBlock& b) override { inner->getStateInformation (b); } + void setStateInformation (const void* d, int s) override { inner->setStateInformation (d, s); } + void getCurrentProgramStateInformation (juce::MemoryBlock& b) override { inner->getCurrentProgramStateInformation (b); } + void setCurrentProgramStateInformation (const void* d, int s) override { inner->setCurrentProgramStateInformation (d, s); } + void prepareToPlay (double sr, int bs) override { inner->setRateAndBufferSizeDetails (sr, bs); inner->prepareToPlay (sr, bs); } + void releaseResources() override { inner->releaseResources(); } + void memoryWarningReceived() override { inner->memoryWarningReceived(); } + void processBlock (AudioBuffer& a, MidiBuffer& m) override { inner->processBlock (a, m); } + void processBlock (AudioBuffer& a, MidiBuffer& m) override { inner->processBlock (a, m); } + void processBlockBypassed (AudioBuffer& a, MidiBuffer& m) override { inner->processBlockBypassed (a, m); } + void processBlockBypassed (AudioBuffer& a, MidiBuffer& m) override { inner->processBlockBypassed (a, m); } + bool supportsDoublePrecisionProcessing() const override { return inner->supportsDoublePrecisionProcessing(); } + bool supportsMPE() const override { return inner->supportsMPE(); } + bool isMidiEffect() const override { return inner->isMidiEffect(); } + void reset() override { inner->reset(); } + void setNonRealtime (bool b) noexcept override { inner->setNonRealtime (b); } + void refreshParameterList() override { inner->refreshParameterList(); } + void numChannelsChanged() override { inner->numChannelsChanged(); } + void numBusesChanged() override { inner->numBusesChanged(); } + void processorLayoutsChanged() override { inner->processorLayoutsChanged(); } + void setPlayHead (AudioPlayHead* p) override { inner->setPlayHead (p); } + void updateTrackProperties (const TrackProperties& p) override { inner->updateTrackProperties (p); } + bool isBusesLayoutSupported (const BusesLayout& layout) const override { return inner->checkBusesLayoutSupported (layout); } + + bool canAddBus (bool) const override { return true; } + bool canRemoveBus (bool) const override { return true; } + //============================================================================== void fillInPluginDescription (PluginDescription& description) const override { - description = getPluginDescription (name + ":" + state, - isGenerator, - hasMidi, - channelSet); + description = getPluginDescription (*inner); } - static PluginDescription getPluginDescription (const String& identifier, - bool registerAsGenerator, - bool acceptsMidi, - const AudioChannelSet& channelSetToUse - = AudioChannelSet::stereo()) +private: + static PluginDescription getPluginDescription (const AudioProcessor& proc) { + const auto ins = proc.getTotalNumInputChannels(); + const auto outs = proc.getTotalNumOutputChannels(); + const auto identifier = proc.getName(); + const auto registerAsGenerator = ins == 0; + const auto acceptsMidi = proc.acceptsMidi(); + PluginDescription descr; - auto pluginName = identifier.upToFirstOccurrenceOf (":", false, false); - auto pluginState = identifier.fromFirstOccurrenceOf (":", false, false); - descr.name = pluginName; - descr.descriptiveName = pluginName; - descr.pluginFormatName = "Internal"; + descr.name = identifier; + descr.descriptiveName = identifier; + descr.pluginFormatName = InternalPluginFormat::getIdentifier(); descr.category = (registerAsGenerator ? (acceptsMidi ? "Synth" : "Generator") : "Effect"); descr.manufacturerName = "JUCE"; descr.version = ProjectInfo::versionString; - descr.fileOrIdentifier = pluginName + ":" + pluginState; - descr.uid = pluginName.hashCode(); + descr.fileOrIdentifier = identifier; + descr.uid = identifier.hashCode(); descr.isInstrument = (acceptsMidi && registerAsGenerator); - descr.numInputChannels = (registerAsGenerator ? 0 : channelSetToUse.size()); - descr.numOutputChannels = channelSetToUse.size(); + descr.numInputChannels = ins; + descr.numOutputChannels = outs; return descr; } -private: - static BusesProperties getBusProperties (bool registerAsGenerator, - const AudioChannelSet& channelSetToUse) + + void matchChannels (bool isInput) { - return registerAsGenerator ? BusesProperties().withOutput ("Output", channelSetToUse) - : BusesProperties().withInput ("Input", channelSetToUse) - .withOutput ("Output", channelSetToUse); + const auto inBuses = inner->getBusCount (isInput); + + while (getBusCount (isInput) < inBuses) + addBus (isInput); + + while (inBuses < getBusCount (isInput)) + removeBus (isInput); } - //============================================================================== - String name, state; - bool isGenerator, hasMidi; - AudioChannelSet channelSet; + std::unique_ptr inner; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalPlugin) }; //============================================================================== -class SineWaveSynth : public InternalPlugin +class SineWaveSynth : public AudioProcessor { public: - SineWaveSynth (const PluginDescription& descr) : InternalPlugin (descr) + SineWaveSynth() + : AudioProcessor (BusesProperties().withOutput ("Output", AudioChannelSet::stereo())) { const int numVoices = 8; @@ -139,11 +157,6 @@ class SineWaveSynth : public InternalPlugin return "Sine Wave Synth"; } - static PluginDescription getPluginDescription() - { - return InternalPlugin::getPluginDescription (getIdentifier(), true, true); - } - //============================================================================== void prepareToPlay (double newSampleRate, int) override { @@ -162,7 +175,21 @@ class SineWaveSynth : public InternalPlugin buffer.applyGain (0.8f); } - using InternalPlugin::processBlock; + using AudioProcessor::processBlock; + + const String getName() const override { return getIdentifier(); } + double getTailLengthSeconds() const override { return 0.0; } + bool acceptsMidi() const override { return true; } + bool producesMidi() const override { return true; } + AudioProcessorEditor* createEditor() override { return nullptr; } + bool hasEditor() const override { return false; } + int getNumPrograms() override { return 1; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return {}; } + void changeProgramName (int, const String&) override {} + void getStateInformation (juce::MemoryBlock&) override {} + void setStateInformation (const void*, int) override {} private: //============================================================================== @@ -285,10 +312,12 @@ class SineWaveSynth : public InternalPlugin }; //============================================================================== -class ReverbPlugin : public InternalPlugin +class ReverbPlugin : public AudioProcessor { public: - ReverbPlugin (const PluginDescription& descr) : InternalPlugin (descr) + ReverbPlugin() + : AudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo()) + .withOutput ("Output", AudioChannelSet::stereo())) {} static String getIdentifier() @@ -296,11 +325,6 @@ class ReverbPlugin : public InternalPlugin return "Reverb"; } - static PluginDescription getPluginDescription() - { - return InternalPlugin::getPluginDescription (getIdentifier(), false, false); - } - void prepareToPlay (double newSampleRate, int) override { reverb.setSampleRate (newSampleRate); @@ -328,53 +352,82 @@ class ReverbPlugin : public InternalPlugin buffer.clear (ch, 0, buffer.getNumSamples()); } - using InternalPlugin::processBlock; + using AudioProcessor::processBlock; + + const String getName() const override { return getIdentifier(); } + double getTailLengthSeconds() const override { return 0.0; } + bool acceptsMidi() const override { return false; } + bool producesMidi() const override { return false; } + AudioProcessorEditor* createEditor() override { return nullptr; } + bool hasEditor() const override { return false; } + int getNumPrograms() override { return 1; } + int getCurrentProgram() override { return 0; } + void setCurrentProgram (int) override {} + const String getProgramName (int) override { return {}; } + void changeProgramName (int, const String&) override {} + void getStateInformation (juce::MemoryBlock&) override {} + void setStateInformation (const void*, int) override {} private: Reverb reverb; }; //============================================================================== -InternalPluginFormat::InternalPluginFormat() -{ - { - AudioProcessorGraph::AudioGraphIOProcessor p (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode); - p.fillInPluginDescription (audioOutDesc); - } - { - AudioProcessorGraph::AudioGraphIOProcessor p (AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode); - p.fillInPluginDescription (audioInDesc); - } +InternalPluginFormat::InternalPluginFactory::InternalPluginFactory (const std::initializer_list& constructorsIn) + : constructors (constructorsIn), + descriptions ([&] + { + std::vector result; - { - AudioProcessorGraph::AudioGraphIOProcessor p (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode); - p.fillInPluginDescription (midiInDesc); - } + for (const auto& constructor : constructors) + result.push_back (constructor()->getPluginDescription()); - { - AudioProcessorGraph::AudioGraphIOProcessor p (AudioProcessorGraph::AudioGraphIOProcessor::midiOutputNode); - p.fillInPluginDescription (midiOutDesc); - } + return result; + }()) +{} - { - MidiLoggerPluginDemoProcessor p; - p.fillInPluginDescription (midiMonitorDesc); +std::unique_ptr InternalPluginFormat::InternalPluginFactory::createInstance (const String& name) const +{ + const auto begin = descriptions.begin(); + const auto it = std::find_if (begin, + descriptions.end(), + [&] (const PluginDescription& desc) { return name == desc.name; }); + + if (it == descriptions.end()) + return nullptr; + + const auto index = (size_t) std::distance (begin, it); + return constructors[index](); +} + +InternalPluginFormat::InternalPluginFormat() + : factory { + [] { return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode); }, + [] { return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode); }, + [] { return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode); }, + [] { return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::midiOutputNode); }, + + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); }, + [] { return std::make_unique (std::make_unique()); } } +{ } std::unique_ptr InternalPluginFormat::createInstance (const String& name) { - if (name == audioOutDesc.name) return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode); - if (name == audioInDesc.name) return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode); - if (name == midiInDesc.name) return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode); - if (name == midiOutDesc.name) return std::make_unique (AudioProcessorGraph::AudioGraphIOProcessor::midiOutputNode); - if (name == midiMonitorDesc.name) return std::make_unique(); - - if (name == SineWaveSynth::getIdentifier()) return std::make_unique (SineWaveSynth::getPluginDescription()); - if (name == ReverbPlugin::getIdentifier()) return std::make_unique (ReverbPlugin::getPluginDescription()); - - return {}; + return factory.createInstance (name); } void InternalPluginFormat::createPluginInstance (const PluginDescription& desc, @@ -392,13 +445,7 @@ bool InternalPluginFormat::requiresUnblockedMessageThreadDuringCreation (const P return false; } -Array InternalPluginFormat::getAllTypes() const +const std::vector& InternalPluginFormat::getAllTypes() const { - return { audioInDesc, - audioOutDesc, - midiInDesc, - midiOutDesc, - midiMonitorDesc, - SineWaveSynth::getPluginDescription(), - ReverbPlugin::getPluginDescription() }; + return factory.getDescriptions(); } diff --git a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h index 56cbebd10e4d..94b522c3a170 100644 --- a/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h +++ b/extras/AudioPluginHost/Source/Plugins/InternalPlugins.h @@ -32,11 +32,11 @@ class InternalPluginFormat : public AudioPluginFormat InternalPluginFormat(); //============================================================================== - PluginDescription audioInDesc, audioOutDesc, midiInDesc, midiOutDesc, midiMonitorDesc; - Array getAllTypes() const; + const std::vector& getAllTypes() const; //============================================================================== - String getName() const override { return "Internal"; } + static String getIdentifier() { return "Internal"; } + String getName() const override { return getIdentifier(); } bool fileMightContainThisPluginType (const String&) override { return true; } FileSearchPath getDefaultLocationsToSearch() override { return {}; } bool canScanForPlugins() const override { return false; } @@ -48,6 +48,22 @@ class InternalPluginFormat : public AudioPluginFormat StringArray searchPathsForPlugins (const FileSearchPath&, bool, bool) override { return {}; } private: + class InternalPluginFactory + { + public: + using Constructor = std::function()>; + + explicit InternalPluginFactory (const std::initializer_list& constructorsIn); + + const std::vector& getDescriptions() const { return descriptions; } + + std::unique_ptr createInstance (const String& name) const; + + private: + const std::vector constructors; + const std::vector descriptions; + }; + //============================================================================== void createPluginInstance (const PluginDescription&, double initialSampleRate, int initialBufferSize, @@ -56,4 +72,6 @@ class InternalPluginFormat : public AudioPluginFormat std::unique_ptr createInstance (const String& name); bool requiresUnblockedMessageThreadDuringCreation (const PluginDescription&) const override; + + InternalPluginFactory factory; }; diff --git a/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp b/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp index 6407fce6410c..1a72be33fdf8 100644 --- a/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp +++ b/extras/AudioPluginHost/Source/Plugins/PluginGraph.cpp @@ -191,10 +191,12 @@ void PluginGraph::newDocument() InternalPluginFormat internalFormat; - addPlugin (internalFormat.audioInDesc, { 0.5, 0.1 }); - addPlugin (internalFormat.midiInDesc, { 0.25, 0.1 }); - addPlugin (internalFormat.audioOutDesc, { 0.5, 0.9 }); - addPlugin (internalFormat.midiOutDesc, { 0.25, 0.9 }); + jassert (internalFormat.getAllTypes().size() > 3); + + addPlugin (internalFormat.getAllTypes()[0], { 0.5, 0.1 }); + addPlugin (internalFormat.getAllTypes()[1], { 0.25, 0.1 }); + addPlugin (internalFormat.getAllTypes()[2], { 0.5, 0.9 }); + addPlugin (internalFormat.getAllTypes()[3], { 0.25, 0.9 }); MessageManager::callAsync ([this] { diff --git a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp index 0e4b30c4b99f..9c13738ac9f7 100644 --- a/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp +++ b/extras/AudioPluginHost/Source/UI/MainHostWindow.cpp @@ -363,20 +363,26 @@ void MainHostWindow::addPluginsToMenu (PopupMenu& m) int i = 0; for (auto& t : internalTypes) - m.addItem (++i, t.name + " (" + t.pluginFormatName + ")", - graphHolder->graph->getNodeForName (t.name) == nullptr); + m.addItem (++i, t.name + " (" + t.pluginFormatName + ")"); } m.addSeparator(); - pluginDescriptions = knownPluginList.getTypes(); - KnownPluginList::addToMenu (m, pluginDescriptions, pluginSortMethod); + auto pluginDescriptionsToShow = knownPluginList.getTypes(); + + // This avoids showing the internal types again later on in the list + pluginDescriptionsToShow.removeIf ([] (PluginDescription& desc) + { + return desc.pluginFormatName == InternalPluginFormat::getIdentifier(); + }); + + KnownPluginList::addToMenu (m, pluginDescriptionsToShow, pluginSortMethod); } PluginDescription MainHostWindow::getChosenType (const int menuID) const { - if (menuID >= 1 && menuID < 1 + internalTypes.size()) - return internalTypes [menuID - 1]; + if (menuID >= 1 && menuID < (int) (1 + internalTypes.size())) + return internalTypes[(size_t) (menuID - 1)]; return pluginDescriptions[KnownPluginList::getIndexChosenByMenu (pluginDescriptions, menuID)]; } diff --git a/extras/AudioPluginHost/Source/UI/MainHostWindow.h b/extras/AudioPluginHost/Source/UI/MainHostWindow.h index 97051323359b..821494772a95 100644 --- a/extras/AudioPluginHost/Source/UI/MainHostWindow.h +++ b/extras/AudioPluginHost/Source/UI/MainHostWindow.h @@ -91,7 +91,7 @@ class MainHostWindow : public DocumentWindow, AudioDeviceManager deviceManager; AudioPluginFormatManager formatManager; - Array internalTypes; + std::vector internalTypes; KnownPluginList knownPluginList; KnownPluginList::SortMethod pluginSortMethod; Array pluginDescriptions;