diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e46934b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +cmake-build-* +.idea \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..271c8e66 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/juce"] + path = deps/juce + url = https://github.com/kcoul/JUCE.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 1533bab1..4a3b771d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ endif() option(UniversalBinary "Build universal binary for mac" ON) if (APPLE) - set (CMAKE_OSX_DEPLOYMENT_TARGET "10.10" CACHE INTERNAL "") + set (CMAKE_OSX_DEPLOYMENT_TARGET "10.11" CACHE INTERNAL "") if (UniversalBinary) set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE INTERNAL "") #set(CMAKE_OSX_ARCHITECTURES arm64 x86_64) @@ -396,20 +396,29 @@ function(sono_add_custom_plugin_target target_name product_name formats is_instr JUCE_VST3_CAN_REPLACE_VST2=0 JUCE_DISPLAY_SPLASH_SCREEN=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 - JUCE_USE_WINDOWS_MEDIA_FORMAT=1 JUCE_LOAD_CURL_SYMBOLS_LAZILY=1 - JUCE_ASIO=1 - JUCE_WASAPI=1 - JUCE_DIRECTSOUND=0 - JUCE_JACK=1 - JUCE_ALSA=1 JUCE_USE_ANDROID_OBOE=1 JUCE_USE_OBOE_STABILIZED_CALLBACK=1 - JUCE_LOAD_CURL_SYMBOLS_LAZILY=1 FF_AUDIO_ALLOW_ALLOCATIONS_IN_MEASURE_BLOCK=0 PAULXSTRETCH_BUILD_VERSION="${VERSION}" ${PLAT_COMPILE_DEFS} ) +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + target_compile_definitions("${target_name}" + PUBLIC + JUCE_ASIO=1 + JUCE_WASAPI=1 + JUCE_DIRECTSOUND=0 + JUCE_USE_WINDOWS_MEDIA_FORMAT=1 + ) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") + target_compile_definitions("${target_name}" + PUBLIC + JUCE_JACK=1 + JUCE_ALSA=1 + ) +endif() + juce_add_binary_data("${target_name}_PSData" SOURCES images/freeze.svg images/loop_icon.svg diff --git a/Source/CustomLookAndFeel.cpp b/Source/CustomLookAndFeel.cpp index 3cfcb792..d569d129 100644 --- a/Source/CustomLookAndFeel.cpp +++ b/Source/CustomLookAndFeel.cpp @@ -208,6 +208,7 @@ Rectangle CustomLookAndFeel::getTabButtonExtraComponentBounds (const TabBar default: jassertfalse; break; } } + /* else if (button.getExtraComponentPlacement() == TabBarButton::aboveText) { switch (orientation) @@ -235,7 +236,7 @@ Rectangle CustomLookAndFeel::getTabButtonExtraComponentBounds (const TabBar default: jassertfalse; break; } } - + */ return extraComp; } @@ -1182,12 +1183,12 @@ void CustomLookAndFeel::drawDrawableButton (Graphics& g, DrawableButton& button, // imageratio = sonobutt->getForegroundImageRatio(); //} - if (button.getStyle() == DrawableButton::ImageAboveTextLabel || button.getStyle() == DrawableButton::ImageBelowTextLabel) { + if (button.getStyle() == DrawableButton::ImageAboveTextLabel /*|| button.getStyle() == DrawableButton::ImageBelowTextLabel*/) { textH = jmin (14, button.proportionOfHeight (0.2f)); - } else if (button.getStyle() == DrawableButton::ImageLeftOfTextLabel || button.getStyle() == DrawableButton::ImageRightOfTextLabel) { + } /*else if (button.getStyle() == DrawableButton::ImageLeftOfTextLabel || button.getStyle() == DrawableButton::ImageRightOfTextLabel) { textH = jmin (14, button.proportionOfHeight (0.8f)); textW = jmax (20, button.proportionOfWidth (1.0f - imageratio)); - } + }*/ if (textH > 0) @@ -1205,7 +1206,7 @@ void CustomLookAndFeel::drawDrawableButton (Graphics& g, DrawableButton& button, button.getWidth() - 4, textH, Justification::centred, 1); } - else if (button.getStyle() == DrawableButton::ImageBelowTextLabel) { + /*else if (button.getStyle() == DrawableButton::ImageBelowTextLabel) { g.drawFittedText (button.getButtonText(), 2, 1, button.getWidth() - 4, textH, @@ -1222,7 +1223,7 @@ void CustomLookAndFeel::drawDrawableButton (Graphics& g, DrawableButton& button, button.getWidth() - textW - 4 , 1, textW , button.getHeight() - 2, Justification::centred, 2, 0.6f); - } + }*/ } } diff --git a/Source/CustomStandaloneFilterApp.cpp b/Source/CustomStandaloneFilterApp.cpp index 2b388d71..80e5c3df 100644 --- a/Source/CustomStandaloneFilterApp.cpp +++ b/Source/CustomStandaloneFilterApp.cpp @@ -3,17 +3,19 @@ #include "../JuceLibraryCode/JuceHeader.h" #include "juce_core/system/juce_TargetPlatform.h" -#include "juce_audio_plugin_client/utility/juce_CheckSettingMacros.h" +//#include "juce_audio_plugin_client/utility/juce_CheckSettingMacros.h" -#include "juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h" -#include "juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h" -#include "juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h" -#include "juce_audio_plugin_client/utility/juce_WindowsHooks.h" +//#include "juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h" +//#include "juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h" +//#include "juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h" +//#include "juce_audio_plugin_client/utility/juce_WindowsHooks.h" #include #include #include +#include "PluginProcessor.h" + // #include "DebugLogC.h" // You can set this flag in your build if you need to specify a different @@ -63,11 +65,15 @@ class StandaloneFilterApp : public JUCEApplication } - void urlOpened(const URL& url) override { + bool urlOpened(const URL& url) override { DBG("URL opened: " << url.toString(false)); if (mainWindow.get() != nullptr) + { mainWindow->pluginHolder->urlOpened(url); + return true; + } + return false; } CustomLookAndFeel sonoLNF; diff --git a/Source/CustomStandaloneFilterWindow.h b/Source/CustomStandaloneFilterWindow.h index 42f91383..d211bcef 100644 --- a/Source/CustomStandaloneFilterWindow.h +++ b/Source/CustomStandaloneFilterWindow.h @@ -1,12 +1,42 @@ -// SPDX-License-Identifier: GPLv3-or-later WITH Appstore-exception +/* + ============================================================================== -//#if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client -//extern juce::AudioProcessor* JUCE_API JUCE_CALLTYPE createPluginFilterOfType (juce::AudioProcessor::WrapperType type); -//#endif + This file is part of the JUCE framework. + Copyright (c) Raw Material Software Limited -#include "CrossPlatformUtils.h" + JUCE is an open source framework subject to commercial or open source + licensing. -#include "PluginEditor.h" + By downloading, installing, or using the JUCE framework, or combining the + JUCE framework with any other source code, object code, content or any other + copyrightable work, you agree to the terms of the JUCE End User Licence + Agreement, and all incorporated terms including the JUCE Privacy Policy and + the JUCE Website Terms of Service, as applicable, which will bind you. If you + do not agree to the terms of these agreements, we will not license the JUCE + framework to you, and you must discontinue the installation or download + process and cease use of the JUCE framework. + + JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/ + JUCE Privacy Policy: https://juce.com/juce-privacy-policy + JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/ + + Or: + + You may also use this code under the terms of the AGPLv3: + https://www.gnu.org/licenses/agpl-3.0.en.html + + THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL + WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. + + ============================================================================== +*/ + +#pragma once + +#ifndef DOXYGEN + #include +#endif namespace juce { @@ -22,7 +52,8 @@ namespace juce @tags{Audio} */ class StandalonePluginHolder : private AudioIODeviceCallback, - private Timer + private Timer, + private Value::Listener { public: //============================================================================== @@ -50,7 +81,7 @@ class StandalonePluginHolder : private AudioIODeviceCallback, const AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions = nullptr, const Array& channels = Array(), #if JUCE_ANDROID || JUCE_IOS - bool shouldAutoOpenMidiDevices = false + bool shouldAutoOpenMidiDevices = true #else bool shouldAutoOpenMidiDevices = false #endif @@ -58,11 +89,16 @@ class StandalonePluginHolder : private AudioIODeviceCallback, : settings (settingsToUse, takeOwnershipOfSettings), channelConfiguration (channels), - shouldMuteInput(var((bool)false)), - //shouldMuteInput (! isInterAppAudioConnected()), autoOpenMidiDevices (shouldAutoOpenMidiDevices) { - createPlugin(); + // Only one StandalonePluginHolder may be created at a time + jassert (currentInstance == nullptr); + currentInstance = this; + + shouldMuteInput.addListener (this); + shouldMuteInput = ! isInterAppAudioConnected(); + + handleCreatePlugin(); auto inChannels = (channelConfiguration.size() > 0 ? channelConfiguration[0].numIns : processor->getMainBusNumInputChannels()); @@ -90,42 +126,43 @@ class StandalonePluginHolder : private AudioIODeviceCallback, startTimer (500); } - virtual ~StandalonePluginHolder() + ~StandalonePluginHolder() override { stopTimer(); - deletePlugin(); + handleDeletePlugin(); shutDownAudioDevices(); + + currentInstance = nullptr; } //============================================================================== virtual void createPlugin() { - #if JUCE_MODULE_AVAILABLE_juce_audio_plugin_client - processor.reset (::createPluginFilterOfType (AudioProcessor::wrapperType_Standalone)); - #else - AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Standalone); - processor.reset (createPluginFilter()); - AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Undefined); - #endif - jassert (processor != nullptr); // Your createPluginFilter() function must return a valid object! - - processor->disableNonMainBuses(); - processor->setRateAndBufferSizeDetails (44100, 512); + handleCreatePlugin(); + } - int inChannels = (channelConfiguration.size() > 0 ? channelConfiguration[0].numIns - : processor->getMainBusNumInputChannels()); + virtual void deletePlugin() + { + handleDeletePlugin(); + } - int outChannels = (channelConfiguration.size() > 0 ? channelConfiguration[0].numOuts - : processor->getMainBusNumOutputChannels()); + int getNumInputChannels() const + { + if (processor == nullptr) + return 0; - // processorHasPotentialFeedbackLoop = (inChannels > 0 && outChannels > 0); + return (channelConfiguration.size() > 0 ? channelConfiguration[0].numIns + : processor->getMainBusNumInputChannels()); } - virtual void deletePlugin() + int getNumOutputChannels() const { - stopPlaying(); - processor = nullptr; + if (processor == nullptr) + return 0; + + return (channelConfiguration.size() > 0 ? channelConfiguration[0].numOuts + : processor->getMainBusNumOutputChannels()); } static String getFilePatterns (const String& fileSuffix) @@ -139,6 +176,7 @@ class StandalonePluginHolder : private AudioIODeviceCallback, //============================================================================== Value& getMuteInputValue() { return shouldMuteInput; } bool getProcessorHasPotentialFeedbackLoop() const { return processorHasPotentialFeedbackLoop; } + void valueChanged (Value& value) override { muteInput = (bool) value.getValue(); } //============================================================================== File getLastFile() const @@ -163,48 +201,63 @@ class StandalonePluginHolder : private AudioIODeviceCallback, /** Pops up a dialog letting the user save the processor's state to a file. */ void askUserToSaveState (const String& fileSuffix = String()) { - #if JUCE_MODAL_LOOPS_PERMITTED - FileChooser fc (TRANS("Save current state"), getLastFile(), getFilePatterns (fileSuffix)); - - if (fc.browseForFileToSave (true)) + stateFileChooser = std::make_unique (TRANS ("Save current state"), + getLastFile(), + getFilePatterns (fileSuffix)); + auto flags = FileBrowserComponent::saveMode + | FileBrowserComponent::canSelectFiles + | FileBrowserComponent::warnAboutOverwriting; + + stateFileChooser->launchAsync (flags, [this] (const FileChooser& fc) { + if (fc.getResult() == File{}) + return; + setLastFile (fc); MemoryBlock data; processor->getStateInformation (data); if (! fc.getResult().replaceWithData (data.getData(), data.getSize())) - AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, - TRANS("Error whilst saving"), - TRANS("Couldn't write to the specified file!")); - } - #else - ignoreUnused (fileSuffix); - #endif + { + auto opts = MessageBoxOptions::makeOptionsOk (AlertWindow::WarningIcon, + TRANS ("Error whilst saving"), + TRANS ("Couldn't write to the specified file!")); + messageBox = AlertWindow::showScopedAsync (opts, nullptr); + } + }); } /** Pops up a dialog letting the user re-load the processor's state from a file. */ void askUserToLoadState (const String& fileSuffix = String()) { - #if JUCE_MODAL_LOOPS_PERMITTED - FileChooser fc (TRANS("Load a saved state"), getLastFile(), getFilePatterns (fileSuffix)); + stateFileChooser = std::make_unique (TRANS ("Load a saved state"), + getLastFile(), + getFilePatterns (fileSuffix)); + auto flags = FileBrowserComponent::openMode + | FileBrowserComponent::canSelectFiles; - if (fc.browseForFileToOpen()) + stateFileChooser->launchAsync (flags, [this] (const FileChooser& fc) { + if (fc.getResult() == File{}) + return; + setLastFile (fc); MemoryBlock data; if (fc.getResult().loadFileAsData (data)) + { processor->setStateInformation (data.getData(), (int) data.getSize()); + } else - AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, - TRANS("Error whilst loading"), - TRANS("Couldn't read from the specified file!")); - } - #else - ignoreUnused (fileSuffix); - #endif + { + auto opts = MessageBoxOptions::makeOptionsOk (AlertWindow::WarningIcon, + TRANS ("Error whilst loading"), + TRANS ("Couldn't read from the specified file!")); + messageBox = AlertWindow::showScopedAsync (opts, nullptr); + } + }); } //============================================================================== @@ -215,7 +268,7 @@ class StandalonePluginHolder : private AudioIODeviceCallback, #if JucePlugin_Enable_IAA && JUCE_IOS if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) { - processor->setPlayHead (device->getAudioPlayHead()); + processor->setPlayHead (device->getAudioPlayHead()); device->setMidiMessageCollector (&player.getMidiMessageCollector()); } #endif @@ -228,106 +281,51 @@ class StandalonePluginHolder : private AudioIODeviceCallback, //============================================================================== /** Shows an audio properties dialog box modally. */ - void showAudioSettingsDialog(Component * calloutTarget=nullptr, Component * calloutParent=nullptr) + void showAudioSettingsDialog() { + DialogWindow::LaunchOptions o; - int minNumInputs = std::numeric_limits::max(), maxNumInputs = 0, - minNumOutputs = std::numeric_limits::max(), maxNumOutputs = 0; + int maxNumInputs = 0, maxNumOutputs = 0; - auto updateMinAndMax = [] (int newValue, int& minValue, int& maxValue) - { - minValue = jmin (minValue, newValue); - maxValue = jmax (maxValue, newValue); - }; - - /* if (channelConfiguration.size() > 0) { - auto defaultConfig = channelConfiguration.getReference (0); - updateMinAndMax ((int) defaultConfig.numIns, minNumInputs, maxNumInputs); - updateMinAndMax ((int) defaultConfig.numOuts, minNumOutputs, maxNumOutputs); - } - */ + auto& defaultConfig = channelConfiguration.getReference (0); - if (auto* bus = processor->getBus (true, 0)) { - auto maxsup = bus->getMaxSupportedChannels(128); - updateMinAndMax (maxsup, minNumInputs, maxNumInputs); - updateMinAndMax (bus->getDefaultLayout().size(), minNumInputs, maxNumInputs); - if (bus->isNumberOfChannelsSupported(1)) { - updateMinAndMax (1, minNumInputs, maxNumInputs); - } - if (bus->isNumberOfChannelsSupported(0)) { - updateMinAndMax (0, minNumInputs, maxNumInputs); - } - } - - if (auto* bus = processor->getBus (false, 0)) { - auto maxsup = bus->getMaxSupportedChannels(128); - updateMinAndMax (maxsup, minNumOutputs, maxNumOutputs); - updateMinAndMax (bus->getDefaultLayout().size(), minNumOutputs, maxNumOutputs); - if (bus->isNumberOfChannelsSupported(1)) { - updateMinAndMax (1, minNumOutputs, maxNumOutputs); - } - if (bus->isNumberOfChannelsSupported(0)) { - updateMinAndMax (0, minNumOutputs, maxNumOutputs); - } + maxNumInputs = jmax (0, (int) defaultConfig.numIns); + maxNumOutputs = jmax (0, (int) defaultConfig.numOuts); } - minNumInputs = jmin (minNumInputs, maxNumInputs); - minNumOutputs = jmin (minNumOutputs, maxNumOutputs); - - auto * content = new SettingsComponent (*this, deviceManager, - minNumInputs, - maxNumInputs, - minNumOutputs, - maxNumOutputs); - if (calloutTarget && calloutParent) { - - auto wrap = std::make_unique(); - wrap->setViewedComponent(content, true); // takes ownership of content + if (auto* bus = processor->getBus (true, 0)) + maxNumInputs = jmax (0, bus->getDefaultLayout().size()); - //std::unique_ptr contptr(content); - int defWidth = 450; - int defHeight = 550; + if (auto* bus = processor->getBus (false, 0)) + maxNumOutputs = jmax (0, bus->getDefaultLayout().size()); -#if JUCE_IOS - defWidth = 320; - defHeight = 400; -#endif - - content->setSize (defWidth, defHeight); - wrap->setSize(jmin(defWidth, calloutParent->getWidth() - 20), jmin(defHeight, calloutParent->getHeight() - 24)); + auto content = std::make_unique (*this, deviceManager, maxNumInputs, maxNumOutputs); + content->setSize (500, 550); + content->setToRecommendedSize(); - auto bounds = calloutParent->getLocalArea(nullptr, calloutTarget->getScreenBounds()); - auto & cb = CallOutBox::launchAsynchronously(std::move(wrap), bounds, calloutParent); - cb.setDismissalMouseClicksAreAlwaysConsumed(true); - } - else { - DialogWindow::LaunchOptions o; + o.content.setOwned (content.release()); - o.content.setOwned (content); - o.content->setSize (500, 550); + o.dialogTitle = TRANS ("Audio/MIDI Settings"); + o.dialogBackgroundColour = o.content->getLookAndFeel().findColour (ResizableWindow::backgroundColourId); + o.escapeKeyTriggersCloseButton = true; + o.useNativeTitleBar = true; + o.resizable = false; - o.dialogTitle = TRANS("Audio/MIDI Settings"); - o.dialogBackgroundColour = o.content->getLookAndFeel().findColour (ResizableWindow::backgroundColourId); - o.escapeKeyTriggersCloseButton = true; - o.useNativeTitleBar = true; - o.resizable = false; - - o.launchAsync(); - } + o.launchAsync(); } void saveAudioDeviceState() { if (settings != nullptr) { - std::unique_ptr xml (deviceManager.createStateXml()); + auto xml = deviceManager.createStateXml(); settings->setValue ("audioSetup", xml.get()); #if ! (JUCE_IOS || JUCE_ANDROID) - // settings->setValue ("shouldMuteInput", (bool) shouldMuteInput.getValue()); + settings->setValue ("shouldMuteInput", (bool) shouldMuteInput.getValue()); #endif } } @@ -343,22 +341,21 @@ class StandalonePluginHolder : private AudioIODeviceCallback, savedState = settings->getXmlValue ("audioSetup"); #if ! (JUCE_IOS || JUCE_ANDROID) - // shouldMuteInput.setValue (settings->getBoolValue ("shouldMuteInput", true)); + shouldMuteInput.setValue (settings->getBoolValue ("shouldMuteInput", true)); #endif } - auto totalInChannels = processor->getMainBusNumInputChannels(); - auto totalOutChannels = processor->getMainBusNumOutputChannels(); + auto inputChannels = getNumInputChannels(); + auto outputChannels = getNumOutputChannels(); - if (channelConfiguration.size() > 0) + if (inputChannels == 0 && outputChannels == 0 && processor->isMidiEffect()) { - auto defaultConfig = channelConfiguration.getReference (0); - totalInChannels = defaultConfig.numIns; - totalOutChannels = defaultConfig.numOuts; + // add a dummy output channel for MIDI effect plug-ins so they can receive audio callbacks + outputChannels = 1; } - deviceManager.initialise (enableAudioInput ? totalInChannels : 0, - totalOutChannels, + deviceManager.initialise (enableAudioInput ? inputChannels : 0, + outputChannels, savedState.get(), true, preferredDefaultDeviceName, @@ -407,19 +404,16 @@ class StandalonePluginHolder : private AudioIODeviceCallback, return false; } - #if JUCE_MODULE_AVAILABLE_juce_gui_basics - Image getIAAHostIcon (int size) + Image getIAAHostIcon ([[maybe_unused]] int size) { #if JUCE_IOS && JucePlugin_Enable_IAA if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) return device->getIcon (size); #else - ignoreUnused (size); #endif return {}; } - #endif void urlOpened(const URL& url) { if (urlOpenedCallback) @@ -428,8 +422,10 @@ class StandalonePluginHolder : private AudioIODeviceCallback, std::function urlOpenedCallback; - - static StandalonePluginHolder* getInstance(); + static StandalonePluginHolder* getInstance() + { + return currentInstance; + } //============================================================================== OptionalScopedPointer settings; @@ -439,32 +435,139 @@ class StandalonePluginHolder : private AudioIODeviceCallback, Array channelConfiguration; // avoid feedback loop by default - bool processorHasPotentialFeedbackLoop = false; // or not + bool processorHasPotentialFeedbackLoop = true; + std::atomic muteInput { true }; Value shouldMuteInput; AudioBuffer emptyBuffer; - bool autoOpenMidiDevices = false; + bool autoOpenMidiDevices; std::unique_ptr options; Array lastMidiDevices; + std::unique_ptr stateFileChooser; + ScopedMessageBox messageBox; + private: + inline static StandalonePluginHolder* currentInstance = nullptr; + + //============================================================================== + void handleCreatePlugin() + { + processor = createPluginFilterOfType (AudioProcessor::wrapperType_Standalone); + processor->disableNonMainBuses(); + processor->setRateAndBufferSizeDetails (44100, 512); + + processorHasPotentialFeedbackLoop = (getNumInputChannels() > 0 && getNumOutputChannels() > 0); + } + + void handleDeletePlugin() + { + stopPlaying(); + processor = nullptr; + } + + //============================================================================== + /* This class can be used to ensure that audio callbacks use buffers with a + predictable maximum size. + + On some platforms (such as iOS 10), the expected buffer size reported in + audioDeviceAboutToStart may be smaller than the blocks passed to + audioDeviceIOCallbackWithContext. This can lead to out-of-bounds reads if the render + callback depends on additional buffers which were initialised using the + smaller size. + + As a workaround, this class will ensure that the render callback will + only ever be called with a block with a length less than or equal to the + expected block size. + */ + class CallbackMaxSizeEnforcer : public AudioIODeviceCallback + { + public: + explicit CallbackMaxSizeEnforcer (AudioIODeviceCallback& callbackIn) + : inner (callbackIn) {} + + void audioDeviceAboutToStart (AudioIODevice* device) override + { + maximumSize = device->getCurrentBufferSizeSamples(); + storedInputChannels .resize ((size_t) device->getActiveInputChannels() .countNumberOfSetBits()); + storedOutputChannels.resize ((size_t) device->getActiveOutputChannels().countNumberOfSetBits()); + + inner.audioDeviceAboutToStart (device); + } + + void audioDeviceIOCallbackWithContext (const float* const* inputChannelData, + [[maybe_unused]] int numInputChannels, + float* const* outputChannelData, + [[maybe_unused]] int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override + { + jassert ((int) storedInputChannels.size() == numInputChannels); + jassert ((int) storedOutputChannels.size() == numOutputChannels); + + int position = 0; + + while (position < numSamples) + { + const auto blockLength = jmin (maximumSize, numSamples - position); + + initChannelPointers (inputChannelData, storedInputChannels, position); + initChannelPointers (outputChannelData, storedOutputChannels, position); + + inner.audioDeviceIOCallbackWithContext (storedInputChannels.data(), + (int) storedInputChannels.size(), + storedOutputChannels.data(), + (int) storedOutputChannels.size(), + blockLength, + context); + + position += blockLength; + } + } + + void audioDeviceStopped() override + { + inner.audioDeviceStopped(); + } + + private: + struct GetChannelWithOffset + { + int offset; + + template + auto operator() (Ptr ptr) const noexcept -> Ptr { return ptr + offset; } + }; + + template + void initChannelPointers (Ptr&& source, Vector&& target, int offset) + { + std::transform (source, source + target.size(), target.begin(), GetChannelWithOffset { offset }); + } + + AudioIODeviceCallback& inner; + int maximumSize = 0; + std::vector storedInputChannels; + std::vector storedOutputChannels; + }; + + CallbackMaxSizeEnforcer maxSizeEnforcer { *this }; + //============================================================================== class SettingsComponent : public Component { public: SettingsComponent (StandalonePluginHolder& pluginHolder, AudioDeviceManager& deviceManagerToUse, - int minAudioInputChannels, int maxAudioInputChannels, - int minAudioOutputChannels, int maxAudioOutputChannels) : owner (pluginHolder), deviceSelector (deviceManagerToUse, - minAudioInputChannels, maxAudioInputChannels, - minAudioOutputChannels, maxAudioOutputChannels, - true, // show midi + 0, maxAudioInputChannels, + 0, maxAudioOutputChannels, + true, (pluginHolder.processor.get() != nullptr && pluginHolder.processor->producesMidi()), - false, false), + true, false), shouldMuteLabel ("Feedback Loop:", "Feedback Loop:"), shouldMuteButton ("Mute audio input") { @@ -482,10 +585,6 @@ class StandalonePluginHolder : private AudioIODeviceCallback, shouldMuteLabel.attachToComponent (&shouldMuteButton, true); } - -#if JUCE_IOS || JUCE_ANDROID - deviceSelector.setItemHeight(38); -#endif } void paint (Graphics& g) override @@ -495,6 +594,8 @@ class StandalonePluginHolder : private AudioIODeviceCallback, void resized() override { + const ScopedValueSetter scope (isResizing, true); + auto r = getLocalBounds(); if (owner.getProcessorHasPotentialFeedbackLoop()) @@ -512,34 +613,59 @@ class StandalonePluginHolder : private AudioIODeviceCallback, deviceSelector.setBounds (r); } + void childBoundsChanged (Component* childComp) override + { + if (! isResizing && childComp == &deviceSelector) + setToRecommendedSize(); + } + + void setToRecommendedSize() + { + const auto extraHeight = [&] + { + if (! owner.getProcessorHasPotentialFeedbackLoop()) + return 0; + + const auto itemHeight = deviceSelector.getItemHeight(); + const auto separatorHeight = (itemHeight >> 1); + return itemHeight + separatorHeight; + }(); + + setSize (getWidth(), deviceSelector.getHeight() + extraHeight); + } + private: //============================================================================== StandalonePluginHolder& owner; AudioDeviceSelectorComponent deviceSelector; Label shouldMuteLabel; ToggleButton shouldMuteButton; + bool isResizing = false; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComponent) }; //============================================================================== - void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) override + void audioDeviceIOCallbackWithContext (const float* const* inputChannelData, + int numInputChannels, + float* const* outputChannelData, + int numOutputChannels, + int numSamples, + const AudioIODeviceCallbackContext& context) override { - const bool inputMuted = shouldMuteInput.getValue(); - - if (inputMuted) + if (muteInput) { emptyBuffer.clear(); inputChannelData = emptyBuffer.getArrayOfReadPointers(); } - player.audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); + player.audioDeviceIOCallbackWithContext (inputChannelData, + numInputChannels, + outputChannelData, + numOutputChannels, + numSamples, + context); } void audioDeviceAboutToStart (AudioIODevice* device) override @@ -549,15 +675,6 @@ class StandalonePluginHolder : private AudioIODeviceCallback, player.audioDeviceAboutToStart (device); player.setMidiOutput (deviceManager.getDefaultMidiOutput()); - -#if 0 -#if JUCE_IOS - if (auto iosdevice = dynamic_cast (deviceManager.getCurrentAudioDevice())) { - processorHasPotentialFeedbackLoop = !iosdevice->isHeadphonesConnected() && device->getActiveInputChannels() > 0; - shouldMuteInput.setValue(processorHasPotentialFeedbackLoop); - } -#endif -#endif } void audioDeviceStopped() override @@ -572,7 +689,7 @@ class StandalonePluginHolder : private AudioIODeviceCallback, const String& preferredDefaultDeviceName, const AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions) { - deviceManager.addAudioCallback (this); + deviceManager.addAudioCallback (&maxSizeEnforcer); deviceManager.addMidiInputDeviceCallback ({}, &player); reloadAudioDeviceState (enableAudioInput, preferredDefaultDeviceName, preferredSetupOptions); @@ -583,7 +700,7 @@ class StandalonePluginHolder : private AudioIODeviceCallback, saveAudioDeviceState(); deviceManager.removeMidiInputDeviceCallback ({}, &player); - deviceManager.removeAudioCallback (this); + deviceManager.removeAudioCallback (&maxSizeEnforcer); } void timerCallback() override @@ -599,6 +716,8 @@ class StandalonePluginHolder : private AudioIODeviceCallback, for (auto& newDevice : newMidiDevices) if (! lastMidiDevices.contains (newDevice)) deviceManager.setMidiInputDeviceEnabled (newDevice.identifier, true); + + lastMidiDevices = newMidiDevices; } } @@ -616,36 +735,21 @@ class StandalonePluginHolder : private AudioIODeviceCallback, @tags{Audio} */ class StandaloneFilterWindow : public DocumentWindow, - public Button::Listener + private Button::Listener { public: //============================================================================== typedef StandalonePluginHolder::PluginInOuts PluginInOuts; - //============================================================================== - /** Creates a window with a given title and colour. - The settings object can be a PropertySet that the class should use to - store its settings (it can also be null). If takeOwnershipOfSettings is - true, then the settings object will be owned and deleted by this object. - */ StandaloneFilterWindow (const String& title, Colour backgroundColour, - PropertySet* settingsToUse, - bool takeOwnershipOfSettings, - const String& preferredDefaultDeviceName = String(), - const AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions = nullptr, - const Array& constrainToConfiguration = {}, - #if JUCE_ANDROID || JUCE_IOS - bool autoOpenMidiDevices = false - #else - bool autoOpenMidiDevices = false - #endif - ) + std::unique_ptr pluginHolderIn) : DocumentWindow (title, backgroundColour, DocumentWindow::minimiseButton | DocumentWindow::closeButton), + pluginHolder (std::move (pluginHolderIn)), optionsButton ("Options") { - - + setConstrainer (&decoratorConstrainer); + #if JUCE_IOS || JUCE_ANDROID setTitleBarHeight (0); #else @@ -654,39 +758,87 @@ class StandaloneFilterWindow : public DocumentWindow, Component::addAndMakeVisible (optionsButton); optionsButton.addListener (this); optionsButton.setTriggeredOnMouseDown (true); - setUsingNativeTitleBar(true); - #endif - - setResizable (true, false); - - pluginHolder.reset (new StandalonePluginHolder (settingsToUse, takeOwnershipOfSettings, - preferredDefaultDeviceName, preferredSetupOptions, - constrainToConfiguration, autoOpenMidiDevices)); + #endif #if JUCE_IOS || JUCE_ANDROID setFullScreen (true); - setContentOwned (new MainContentComponent (*this), false); + updateContent(); #else - setContentOwned (new MainContentComponent (*this), true); + updateContent(); - if (auto* props = pluginHolder->settings.get()) + const auto windowScreenBounds = [this]() -> Rectangle { - const int x = props->getIntValue ("windowX", -100); - const int y = props->getIntValue ("windowY", -100); + const auto width = getWidth(); + const auto height = getHeight(); - if (x != -100 && y != -100) - setBoundsConstrained ({ x, y, getWidth(), getHeight() }); - else - centreWithSize (getWidth(), getHeight()); - } - else - { - centreWithSize (getWidth(), getHeight()); - } + const auto& displays = Desktop::getInstance().getDisplays(); + + if (displays.displays.isEmpty()) + return { width, height }; + + if (auto* props = pluginHolder->settings.get()) + { + constexpr int defaultValue = -100; + + const auto x = props->getIntValue ("windowX", defaultValue); + const auto y = props->getIntValue ("windowY", defaultValue); + + if (x != defaultValue && y != defaultValue) + { + const auto screenLimits = displays.getDisplayForRect ({ x, y, width, height })->userArea; + + return { jlimit (screenLimits.getX(), jmax (screenLimits.getX(), screenLimits.getRight() - width), x), + jlimit (screenLimits.getY(), jmax (screenLimits.getY(), screenLimits.getBottom() - height), y), + width, height }; + } + } + + const auto displayArea = displays.getPrimaryDisplay()->userArea; + + return { displayArea.getCentreX() - width / 2, + displayArea.getCentreY() - height / 2, + width, height }; + }(); + + setBoundsConstrained (windowScreenBounds); + + if (auto* processor = getAudioProcessor()) + if (auto* editor = processor->getActiveEditor()) + setResizable (editor->isResizable(), false); #endif } - ~StandaloneFilterWindow() + //============================================================================== + /** Creates a window with a given title and colour. + The settings object can be a PropertySet that the class should use to + store its settings (it can also be null). If takeOwnershipOfSettings is + true, then the settings object will be owned and deleted by this object. + */ + StandaloneFilterWindow (const String& title, + Colour backgroundColour, + PropertySet* settingsToUse, + bool takeOwnershipOfSettings, + const String& preferredDefaultDeviceName = String(), + const AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions = nullptr, + const Array& constrainToConfiguration = {}, + #if JUCE_ANDROID || JUCE_IOS + bool autoOpenMidiDevices = true + #else + bool autoOpenMidiDevices = false + #endif + ) + : StandaloneFilterWindow (title, + backgroundColour, + std::make_unique (settingsToUse, + takeOwnershipOfSettings, + preferredDefaultDeviceName, + preferredSetupOptions, + constrainToConfiguration, + autoOpenMidiDevices)) + { + } + + ~StandaloneFilterWindow() override { #if (! JUCE_IOS) && (! JUCE_ANDROID) if (auto* props = pluginHolder->settings.get()) @@ -716,7 +868,7 @@ class StandaloneFilterWindow : public DocumentWindow, props->removeValue ("filterState"); pluginHolder->createPlugin(); - setContentOwned (new MainContentComponent (*this), true); + updateContent(); pluginHolder->startPlaying(); } @@ -728,20 +880,6 @@ class StandaloneFilterWindow : public DocumentWindow, JUCEApplicationBase::quit(); } - void buttonClicked (Button*) override - { - PopupMenu m; - m.addItem (1, TRANS("Audio/MIDI Settings...")); - m.addSeparator(); - m.addItem (2, TRANS("Save current state...")); - m.addItem (3, TRANS("Load a saved state...")); - m.addSeparator(); - m.addItem (4, TRANS("Reset to default state")); - - m.showMenuAsync (PopupMenu::Options(), - ModalCallbackFunction::forComponent (menuCallback, this)); - } - void handleMenuResult (int result) { switch (result) @@ -770,8 +908,35 @@ class StandaloneFilterWindow : public DocumentWindow, std::unique_ptr pluginHolder; - private: + void updateContent() + { + auto* content = new MainContentComponent (*this); + decoratorConstrainer.setMainContentComponent (content); + + #if JUCE_IOS || JUCE_ANDROID + constexpr auto resizeAutomatically = false; + #else + constexpr auto resizeAutomatically = true; + #endif + + setContentOwned (content, resizeAutomatically); + } + + void buttonClicked (Button*) override + { + PopupMenu m; + m.addItem (1, TRANS ("Audio/MIDI Settings...")); + m.addSeparator(); + m.addItem (2, TRANS ("Save current state...")); + m.addItem (3, TRANS ("Load a saved state...")); + m.addSeparator(); + m.addItem (4, TRANS ("Reset to default state")); + + m.showMenuAsync (PopupMenu::Options(), + ModalCallbackFunction::forComponent (menuCallback, this)); + } + //============================================================================== class MainContentComponent : public Component, private Value::Listener, @@ -781,28 +946,15 @@ class StandaloneFilterWindow : public DocumentWindow, public: MainContentComponent (StandaloneFilterWindow& filterWindow) : owner (filterWindow), notification (this), - editor (owner.getAudioProcessor()->createEditorIfNeeded()) + editor (owner.getAudioProcessor()->hasEditor() ? owner.getAudioProcessor()->createEditorIfNeeded() + : new GenericAudioProcessorEditor (*owner.getAudioProcessor())) { - // because the plugin editor may have changed this - //filterWindow.setBackgroundColour(LookAndFeel::getDefaultLookAndFeel().findColour (ResizableWindow::backgroundColourId)); - filterWindow.setBackgroundColour(Colours::black); - - Value& inputMutedValue = owner.pluginHolder->getMuteInputValue(); + inputMutedValue.referTo (owner.pluginHolder->getMuteInputValue()); if (editor != nullptr) { - // hack to allow editor to get devicemanager - if (auto * sonoeditor = dynamic_cast(editor.get())) { - sonoeditor->getAudioDeviceManager = [this]() { return &owner.getDeviceManager(); }; - sonoeditor->showAudioSettingsDialog = [this](Component* calloutTarget, Component* calloutParent) { owner.pluginHolder->showAudioSettingsDialog(calloutTarget, calloutParent); }; - - owner.pluginHolder->urlOpenedCallback = [sonoeditor](const URL& url) { - sonoeditor->urlOpened(url); - }; - } - editor->addComponentListener (this); - componentMovedOrResized (*editor, false, true); + handleMovedOrResized(); addAndMakeVisible (editor.get()); } @@ -818,7 +970,7 @@ class StandaloneFilterWindow : public DocumentWindow, inputMutedChanged (shouldShowNotification); } - ~MainContentComponent() + ~MainContentComponent() override { if (editor != nullptr) { @@ -829,63 +981,42 @@ class StandaloneFilterWindow : public DocumentWindow, } void resized() override - { - auto r = getLocalBounds(); - - bool portrait = getWidth() < getHeight(); - bool tall = getHeight() > 500; + { + handleResized(); + } - float safetop=0.0f, safebottom=0.0f, safeleft=0.0f, saferight=0.0f; - int notchPos = 0; - getSafeAreaInsets(getWindowHandle(), safetop, safebottom, safeleft, saferight, notchPos); + ComponentBoundsConstrainer* getEditorConstrainer() const + { + if (auto* e = editor.get()) + return e->getConstrainer(); - if (portrait != isPortrait || isTall != tall || orientation != notchPos) { - isPortrait = portrait; - isTall = tall; - orientation = notchPos; + return nullptr; + } - // call resized again if on iOS, due to dumb stuff related to safe area insets not being updated -#if JUCE_IOS - Timer::callAfterDelay(150, [this]() { - this->resized(); - }); - //return; -#endif - } + BorderSize computeBorder() const + { + const auto nativeFrame = [&]() -> BorderSize + { + if (auto* peer = owner.getPeer()) + if (const auto frameSize = peer->getFrameSizeIfPresent()) + return *frameSize; - topInset = safetop; - bottomInset = safebottom; - leftInset = safeleft * (notchPos == 3 ? 0.75f : 0.5f); - rightInset = saferight * (notchPos == 4 ? 0.75f : 0.5f); - - r.removeFromTop(topInset); - r.removeFromBottom(bottomInset); - r.removeFromLeft(leftInset); - r.removeFromRight(rightInset); - - - if (shouldShowNotification) { - notification.setBounds (r.removeFromTop (NotificationArea::height)); - topInset += NotificationArea::height; - } + return {}; + }(); - editor->setBounds (r); + return nativeFrame.addedTo (owner.getContentComponentBorder()) + .addedTo (BorderSize { shouldShowNotification ? NotificationArea::height : 0, 0, 0, 0 }); } private: - - bool isPortrait = false; - bool isTall = false; - int orientation = 0; - //============================================================================== class NotificationArea : public Component { public: - enum { height = 60 }; + enum { height = 30 }; NotificationArea (Button::Listener* settingsButtonListener) - : notification ("notification", "Audio input is muted to avoid\nfeedback loop.\nHeadphones recommended!"), + : notification ("notification", "Audio input is muted to avoid feedback loop"), #if JUCE_IOS || JUCE_ANDROID settingsButton ("Unmute Input") #else @@ -932,11 +1063,14 @@ class StandaloneFilterWindow : public DocumentWindow, notification.setVisible (shouldShowNotification); #if JUCE_IOS || JUCE_ANDROID - resized(); + handleResized(); #else - setSize (editor->getWidth(), - editor->getHeight() - + (shouldShowNotification ? NotificationArea::height : 0)); + if (editor != nullptr) + { + const int extraHeight = shouldShowNotification ? NotificationArea::height : 0; + const auto rect = getSizeToContainEditor(); + setSize (rect.getWidth(), rect.getHeight() + extraHeight); + } #endif } @@ -951,48 +1085,97 @@ class StandaloneFilterWindow : public DocumentWindow, } //============================================================================== - void componentMovedOrResized (Component&, bool, bool wasResized) override + void handleResized() + { + auto r = getLocalBounds(); + + if (shouldShowNotification) + notification.setBounds (r.removeFromTop (NotificationArea::height)); + + if (editor != nullptr) + { + const auto newPos = r.getTopLeft().toFloat().transformedBy (editor->getTransform().inverted()); + + if (preventResizingEditor) + editor->setTopLeftPosition (newPos.roundToInt()); + else + editor->setBoundsConstrained (editor->getLocalArea (this, r.toFloat()).withPosition (newPos).toNearestInt()); + } + } + + void handleMovedOrResized() + { + const ScopedValueSetter scope (preventResizingEditor, true); + + if (editor != nullptr) + { + auto rect = getSizeToContainEditor(); + + setSize (rect.getWidth(), + rect.getHeight() + (shouldShowNotification ? NotificationArea::height : 0)); + } + } + + void componentMovedOrResized (Component&, bool, bool) override { - if (wasResized && editor != nullptr) - setSize (editor->getWidth() + leftInset + rightInset, - editor->getHeight() + topInset + bottomInset); + handleMovedOrResized(); + } + + Rectangle getSizeToContainEditor() const + { + if (editor != nullptr) + return getLocalArea (editor.get(), editor->getLocalBounds()); + + return {}; } //============================================================================== StandaloneFilterWindow& owner; NotificationArea notification; std::unique_ptr editor; + Value inputMutedValue; bool shouldShowNotification = false; + bool preventResizingEditor = false; - int topInset = 0; - int bottomInset = 0; - int leftInset = 0; - int rightInset = 0; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; + /* This custom constrainer checks with the AudioProcessorEditor (which might itself be + constrained) to ensure that any size we choose for the standalone window will be suitable + for the editor too. + + Without this constrainer, attempting to resize the standalone window may set bounds on the + peer that are unsupported by the inner editor. In this scenario, the peer will be set to a + 'bad' size, then the inner editor will be resized. The editor will check the new bounds with + its own constrainer, and may set itself to a more suitable size. After that, the resizable + window will see that its content component has changed size, and set the bounds of the peer + accordingly. The end result is that the peer is resized twice in a row to different sizes, + which can appear glitchy/flickery to the user. + */ + class DecoratorConstrainer : public BorderedComponentBoundsConstrainer + { + public: + ComponentBoundsConstrainer* getWrappedConstrainer() const override + { + return contentComponent != nullptr ? contentComponent->getEditorConstrainer() : nullptr; + } + + BorderSize getAdditionalBorder() const override + { + return contentComponent != nullptr ? contentComponent->computeBorder() : BorderSize{}; + } + + void setMainContentComponent (MainContentComponent* in) { contentComponent = in; } + + private: + MainContentComponent* contentComponent = nullptr; + }; + //============================================================================== TextButton optionsButton; + DecoratorConstrainer decoratorConstrainer; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandaloneFilterWindow) }; -inline StandalonePluginHolder* StandalonePluginHolder::getInstance() -{ - #if JucePlugin_Enable_IAA || JucePlugin_Build_Standalone - if (PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_Standalone) - { - auto& desktop = Desktop::getInstance(); - const int numTopLevelWindows = desktop.getNumComponents(); - - for (int i = 0; i < numTopLevelWindows; ++i) - if (auto window = dynamic_cast (desktop.getComponent (i))) - return window->getPluginHolder(); - } - #endif - - return nullptr; -} - -} // namespace juce +} // namespace juce \ No newline at end of file diff --git a/Source/GenericItemChooser.cpp b/Source/GenericItemChooser.cpp index 7d454d2f..11cd44c7 100644 --- a/Source/GenericItemChooser.cpp +++ b/Source/GenericItemChooser.cpp @@ -98,7 +98,7 @@ GenericItemChooser::GenericItemChooser(const Array & ite table.getViewport()->setScrollBarsShown(true, false); table.getViewport()->setScrollOnDragEnabled(true); table.setRowSelectedOnMouseDown(true); - table.setRowClickedOnMouseDown(false); + //table.setRowClickedOnMouseDown(false); table.setMultipleSelectionEnabled (false); table.setRowHeight(rowHeight); diff --git a/Source/PS_Source/Input/AInputS.h b/Source/PS_Source/Input/AInputS.h index e56e5e95..fd5bd5a0 100644 --- a/Source/PS_Source/Input/AInputS.h +++ b/Source/PS_Source/Input/AInputS.h @@ -154,7 +154,7 @@ class AInputS final : public InputS ++m_silenceoutputted; return 0.0f; }; - float** smps = abuf.getArrayOfWritePointers(); + float* const* smps = abuf.getArrayOfWritePointers(); int readinc = 1; if (m_reverseplay) readinc = -1; diff --git a/Source/PS_Source/StretchSource.cpp b/Source/PS_Source/StretchSource.cpp index 33403f75..24aede44 100644 --- a/Source/PS_Source/StretchSource.cpp +++ b/Source/PS_Source/StretchSource.cpp @@ -316,7 +316,7 @@ void StretchAudioSource::getNextAudioBlock(const AudioSourceChannelInfo & buffer if (m_vol_smoother.getTargetValue() != maingain) m_vol_smoother.setTargetValue(maingain); FloatVectorOperations::disableDenormalisedNumberSupport(); - float** outarrays = bufferToFill.buffer->getArrayOfWritePointers(); + float* const* outarrays = bufferToFill.buffer->getArrayOfWritePointers(); int outbufchans = jmin(m_num_outchans, bufferToFill.buffer->getNumChannels()); int offset = bufferToFill.startSample; if (m_stretchers.size() == 0) diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index a741b4c7..c4ef4a3e 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -573,7 +573,7 @@ void PaulstretchpluginAudioProcessorEditor::showRenderDialog() int prefh = jmin(contentraw->getPreferredHeight(), getHeight() - 10); contentraw->setSize(prefw, prefh); std::unique_ptr content(contentraw); - auto & cb = CallOutBox::launchAsynchronously(std::move(content), m_render_button.getBounds(), this, false); + auto & cb = CallOutBox::launchAsynchronously(std::move(content), m_render_button.getBounds(), this); cb.setDismissalMouseClicksAreAlwaysConsumed(true); } @@ -635,7 +635,7 @@ void PaulstretchpluginAudioProcessorEditor::showSettings(bool flag) Rectangle bounds = dw->getLocalArea(nullptr, m_settings_button.getScreenBounds().reduced(10)); DBG("callout bounds: " << bounds.toString()); - settingsCalloutBox = & CallOutBox::launchAsynchronously (std::move(wrap), bounds , dw, false); + settingsCalloutBox = & CallOutBox::launchAsynchronously (std::move(wrap), bounds , dw); if (CallOutBox * box = dynamic_cast(settingsCalloutBox.get())) { box->setDismissalMouseClicksAreAlwaysConsumed(true); } diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index 667c606f..3a0b9965 100644 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -177,7 +177,8 @@ class MyThumbCache : public AudioThumbnailCache MyThumbCache() : AudioThumbnailCache(200) { // The default priority of 2 is a bit too low in some cases, it seems... - getTimeSliceThread().setPriority(3); + //TODO: It's unclear if the thread inside the ThumbCache can have its priority manipulated in JUCE8... + //getTimeSliceThread().setPriority(Thread::Priority::high); } ~MyThumbCache() {} }; diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp index db0e58b8..c16cec5a 100644 --- a/Source/PluginProcessor.cpp +++ b/Source/PluginProcessor.cpp @@ -49,7 +49,7 @@ int optimizebufsize(int n) { inline AudioParameterFloat* make_floatpar(String id, String name, float minv, float maxv, float defv, float step, float skew) { - return new AudioParameterFloat(id, name, NormalisableRange(minv, maxv, step, skew), defv); + return new AudioParameterFloat(juce::ParameterID(id, 1), name, NormalisableRange(minv, maxv, step, skew), defv); } #if JUCE_IOS @@ -143,15 +143,15 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_ DBG("making bool pars"); - m_sm_enab_pars[0] = new AudioParameterBool("enab_specmodule0", "Enable harmonics", false); - m_sm_enab_pars[1] = new AudioParameterBool("enab_specmodule1", "Enable tonal vs noise", false); - m_sm_enab_pars[2] = new AudioParameterBool("enab_specmodule2", "Enable frequency shift", true); - m_sm_enab_pars[3] = new AudioParameterBool("enab_specmodule3", "Enable pitch shift", true); - m_sm_enab_pars[4] = new AudioParameterBool("enab_specmodule4", "Enable ratios", false); - m_sm_enab_pars[5] = new AudioParameterBool("enab_specmodule5", "Enable spread", false); - m_sm_enab_pars[6] = new AudioParameterBool("enab_specmodule6", "Enable filter", false); - m_sm_enab_pars[7] = new AudioParameterBool("enab_specmodule7", "Enable free filter", false); - m_sm_enab_pars[8] = new AudioParameterBool("enab_specmodule8", "Enable compressor", false); + m_sm_enab_pars[0] = new AudioParameterBool(ParameterID("enab_specmodule0", 1), "Enable harmonics", false); + m_sm_enab_pars[1] = new AudioParameterBool(ParameterID("enab_specmodule1", 1), "Enable tonal vs noise", false); + m_sm_enab_pars[2] = new AudioParameterBool(ParameterID("enab_specmodule2", 1), "Enable frequency shift", true); + m_sm_enab_pars[3] = new AudioParameterBool(ParameterID("enab_specmodule3", 1), "Enable pitch shift", true); + m_sm_enab_pars[4] = new AudioParameterBool(ParameterID("enab_specmodule4", 1), "Enable ratios", false); + m_sm_enab_pars[5] = new AudioParameterBool(ParameterID("enab_specmodule5", 1), "Enable spread", false); + m_sm_enab_pars[6] = new AudioParameterBool(ParameterID("enab_specmodule6", 1), "Enable filter", false); + m_sm_enab_pars[7] = new AudioParameterBool(ParameterID("enab_specmodule7", 1), "Enable free filter", false); + m_sm_enab_pars[8] = new AudioParameterBool(ParameterID("enab_specmodule8", 1), "Enable compressor", false); DBG("making stretch source"); @@ -171,14 +171,14 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_ addParameter(make_floatpar("freqshift0", "Frequency shift", -1000.0f, 1000.0f, 0.0f, 1.0, 1.0)); // 4 addParameter(make_floatpar("playrange_start0", "Sound start", 0.0f, 1.0f, 0.0f, 0.0001,1.0)); // 5 addParameter(make_floatpar("playrange_end0", "Sound end", 0.0f, 1.0f, 1.0f, 0.0001,1.0)); // 6 - addParameter(new AudioParameterBool("freeze0", "Freeze", false)); // 7 + addParameter(new AudioParameterBool(ParameterID("freeze0", 1), "Freeze", false)); // 7 addParameter(make_floatpar("spread0", "Frequency spread", 0.0f, 1.0f, 0.0f, 0.001,1.0)); // 8 addParameter(make_floatpar("compress0", "Compress", 0.0f, 1.0f, 0.0f, 0.001,1.0)); // 9 addParameter(make_floatpar("loopxfadelen0", "Loop xfade length", 0.0f, 1.0f, 0.01f, 0.001, 1.0)); // 10 - addParameter(new AudioParameterInt("numharmonics0", "Num harmonics", 1, 100, 10)); // 11 + addParameter(new AudioParameterInt(ParameterID("numharmonics0", 1), "Num harmonics", 1, 100, 10)); // 11 addParameter(make_floatpar("harmonicsfreq0", "Harmonics base freq", 1.0, 5000.0, 128.0, 0.1, 0.5)); addParameter(make_floatpar("harmonicsbw0", "Harmonics bandwidth", 0.1f, 200.0f, 25.0f, 0.01, 1.0)); // 13 - addParameter(new AudioParameterBool("harmonicsgauss0", "Gaussian harmonics", false)); // 14 + addParameter(new AudioParameterBool(ParameterID("harmonicsgauss0", 1), "Gaussian harmonics", false)); // 14 addParameter(make_floatpar("octavemixm2_0", "2 octaves down level", 0.0f, 1.0f, 0.0f, 0.001, 1.0)); // 15 addParameter(make_floatpar("octavemixm1_0", "Octave down level", 0.0f, 1.0f, 0.0f, 0.001, 1.0)); // 16 addParameter(make_floatpar("octavemix0_0", "Normal pitch level", 0.0f, 1.0f, 1.0f, 0.001, 1.0)); // 17 @@ -199,30 +199,30 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_ return jmap(value, 20.0f, 1000.0f, 0.0f, 0.5f); return jmap(value, 1000.0f, 20000.0f, 0.5f, 1.0f); }; - addParameter(new AudioParameterFloat("filter_low_0", "Filter low", + addParameter(new AudioParameterFloat(ParameterID("filter_low_0", 1), "Filter low", NormalisableRange(20.0f, 20000.0f, filt_convertFrom0To1Func, filt_convertTo0To1Func), 20.0f)); // 23 - addParameter(new AudioParameterFloat("filter_high_0", "Filter high", + addParameter(new AudioParameterFloat(ParameterID("filter_high_0", 1), "Filter high", NormalisableRange(20.0f, 20000.0f, filt_convertFrom0To1Func,filt_convertTo0To1Func), 20000.0f));; // 24 addParameter(make_floatpar("onsetdetect_0", "Onset detection", 0.0f, 1.0f, 0.0f, 0.01, 1.0)); // 25 - addParameter(new AudioParameterBool("capture_enabled0", "Capture", false)); // 26 - m_outchansparam = new AudioParameterInt("numoutchans0", "Num outs", 1, 32, 2); // 27 + addParameter(new AudioParameterBool(ParameterID("capture_enabled0", 1), "Capture", false)); // 26 + m_outchansparam = new AudioParameterInt(ParameterID("numoutchans0", 1), "Num outs", 1, 32, 2); // 27 addParameter(m_outchansparam); // 27 - addParameter(new AudioParameterBool("pause_enabled0", "Pause", true)); // 28 - addParameter(new AudioParameterFloat("maxcapturelen_0", "Max capture length", 1.0f, 120.0f, 10.0f)); // 29 - addParameter(new AudioParameterBool("passthrough0", "Pass input through", false)); // 30 - addParameter(new AudioParameterBool("markdirty0", "Internal (don't use)", false)); // 31 - m_inchansparam = new AudioParameterInt("numinchans0", "Num ins", 1, 32, 2); // 32 + addParameter(new AudioParameterBool(ParameterID("pause_enabled0", 1), "Pause", true)); // 28 + addParameter(new AudioParameterFloat(ParameterID("maxcapturelen_0", 1), "Max capture length", 1.0f, 120.0f, 10.0f)); // 29 + addParameter(new AudioParameterBool(ParameterID("passthrough0", 1), "Pass input through", false)); // 30 + addParameter(new AudioParameterBool(ParameterID("markdirty0", 1), "Internal (don't use)", false)); // 31 + m_inchansparam = new AudioParameterInt(ParameterID("numinchans0", 1), "Num ins", 1, 32, 2); // 32 addParameter(m_inchansparam); // 32 - addParameter(new AudioParameterBool("bypass_stretch0", "Bypass stretch", false)); // 33 - addParameter(new AudioParameterFloat("freefilter_shiftx_0", "Free filter shift X", -1.0f, 1.0f, 0.0f)); // 34 - addParameter(new AudioParameterFloat("freefilter_shifty_0", "Free filter shift Y", -1.0f, 1.0f, 0.0f)); // 35 - addParameter(new AudioParameterFloat("freefilter_scaley_0", "Free filter scale Y", -1.0f, 1.0f, 1.0f)); // 36 - addParameter(new AudioParameterFloat("freefilter_tilty_0", "Free filter tilt Y", -1.0f, 1.0f, 0.0f)); // 37 - addParameter(new AudioParameterInt("freefilter_randomybands0", "Random bands", 2, 128, 16)); // 38 - addParameter(new AudioParameterInt("freefilter_randomyrate0", "Random rate", 1, 32, 2)); // 39 - addParameter(new AudioParameterFloat("freefilter_randomyamount0", "Random amount", 0.0, 1.0, 0.0)); // 40 + addParameter(new AudioParameterBool(ParameterID("bypass_stretch0", 1), "Bypass stretch", false)); // 33 + addParameter(new AudioParameterFloat(ParameterID("freefilter_shiftx_0", 1), "Free filter shift X", -1.0f, 1.0f, 0.0f)); // 34 + addParameter(new AudioParameterFloat(ParameterID("freefilter_shifty_0", 1), "Free filter shift Y", -1.0f, 1.0f, 0.0f)); // 35 + addParameter(new AudioParameterFloat(ParameterID("freefilter_scaley_0", 1), "Free filter scale Y", -1.0f, 1.0f, 1.0f)); // 36 + addParameter(new AudioParameterFloat(ParameterID("freefilter_tilty_0", 1), "Free filter tilt Y", -1.0f, 1.0f, 0.0f)); // 37 + addParameter(new AudioParameterInt(ParameterID("freefilter_randomybands0", 1), "Random bands", 2, 128, 16)); // 38 + addParameter(new AudioParameterInt(ParameterID("freefilter_randomyrate0", 1), "Random rate", 1, 32, 2)); // 39 + addParameter(new AudioParameterFloat(ParameterID("freefilter_randomyamount0", 1), "Random amount", 0.0, 1.0, 0.0)); // 40 for (int i = 0; i < 9; ++i) // 41-49 { addParameter(m_sm_enab_pars[i]); @@ -242,11 +242,11 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_ 1.0)); } - addParameter(new AudioParameterBool("loop_enabled0", "Loop", true)); // 60 + addParameter(new AudioParameterBool(ParameterID("loop_enabled0", 1), "Loop", true)); // 60 //addParameter(new AudioParameterBool("rewind0", "Rewind", false)); // 61 // have to add it this way to specify rewind as a Meta parameter, so that Apple auval will pass it - addParameter(new AudioProcessorValueTreeState::Parameter ("rewind0", + addParameter(new AudioProcessorValueTreeState::Parameter (ParameterID("rewind0", 1), "Rewind", "", NormalisableRange(0.0f, 1.0f), @@ -271,16 +271,16 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_ return jmap(value, 0.1f, 1.0f, 0.0f, 0.5f); return jmap(value, 1.0f, 8.0f, 0.5f, 1.0f); }; - addParameter(new AudioParameterFloat("dryplayrate0", "Dry playrate", + addParameter(new AudioParameterFloat(ParameterID("dryplayrate0", 1), "Dry playrate", NormalisableRange(0.1f, 8.0f, dprate_convertFrom0To1Func, dprate_convertTo0To1Func), 1.0f)); // 62 - addParameter(new AudioParameterBool("binauralbeats", "BinauralBeats Enable", false)); // 63 - addParameter(new AudioParameterFloat("binauralbeatsmono", "Binaural Beats Power", 0.0, 1.0, 0.5)); // 64 - //addParameter(new AudioParameterFloat("binauralbeatsfreq", "BinauralBeats Freq", 0.0, 1.0, 0.5)); // 65 - addParameter(new AudioParameterFloat("binauralbeatsfreq", "Binaural Beats Freq", + addParameter(new AudioParameterBool(ParameterID("binauralbeats", 1), "BinauralBeats Enable", false)); // 63 + addParameter(new AudioParameterFloat(ParameterID("binauralbeatsmono", 1), "Binaural Beats Power", 0.0, 1.0, 0.5)); // 64 + //addParameter(new AudioParameterFloat(ParameterID("binauralbeatsfreq", 1), "BinauralBeats Freq", 0.0, 1.0, 0.5)); // 65 + addParameter(new AudioParameterFloat(ParameterID("binauralbeatsfreq", 1), "Binaural Beats Freq", NormalisableRange(0.05f, 50.0f, 0.0f, 0.25f), 4.0f)); // 65 - addParameter(new AudioParameterChoice ("binauralbeatsmode", "BinauralBeats Mode", { "Left-Right", "Right-Left", "Symmetric" }, 0)); // 66 + addParameter(new AudioParameterChoice (ParameterID("binauralbeatsmode", 1), "BinauralBeats Mode", { "Left-Right", "Right-Left", "Symmetric" }, 0)); // 66 m_bbpar.free_edit.extreme_y.set_min(0.05f); m_bbpar.free_edit.extreme_y.set_max(50.0f); @@ -616,8 +616,8 @@ void PaulstretchpluginAudioProcessor::startplay(Range playrange, int num m_recreate_buffering_source = false; } if (m_bufferingthread.isThreadRunning() == false) { - m_bufferingthread.setPriority(8); - m_bufferingthread.startThread(); + //m_bufferingthread.setPriority(Thread::Priority::highest); + m_bufferingthread.startThread(Thread::Priority::highest); } m_stretch_source->setNumOutChannels(numoutchans); m_stretch_source->setFFTSize(m_fft_size_to_use, true); diff --git a/deps/juce b/deps/juce new file mode 160000 index 00000000..db125549 --- /dev/null +++ b/deps/juce @@ -0,0 +1 @@ +Subproject commit db125549f9976915460708b43df2de7fe975d4ad diff --git a/deps/juce/.gitattributes b/deps/juce/.gitattributes deleted file mode 100644 index 01901d46..00000000 --- a/deps/juce/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -[core] -autocrlf=false diff --git a/deps/juce/.github/ISSUE_TEMPLATE.txt b/deps/juce/.github/ISSUE_TEMPLATE.txt deleted file mode 100644 index 2404c331..00000000 --- a/deps/juce/.github/ISSUE_TEMPLATE.txt +++ /dev/null @@ -1,17 +0,0 @@ -Please include: - - 1) detailed steps on how to reproduce the bug, preferably with already - existing JUCE code such as the demo plugin or the demo code - 2) the expected behaviour - 3) the operating system - 4) the architecture (32-bit or 64-bit) - 5) a stack trace - if the bug causes a crash - 6) the plugin format (VST2, VST3, AU, AAX, RTAS) - if applicable - 7) which DAW you observed the bug in - if applicable - -Make sure you have pulled the latest commits from the `develop` branch of the -JUCE repo and have re-compiled the Projucer before you submit your bug. Often -we have already fixed the issue but it hasn't yet been released on the `master` -branch. If it's a major bug, which must be hot-fixed immediately, then we will -also accept bug reports for tagged release versions. - diff --git a/deps/juce/.gitignore b/deps/juce/.gitignore deleted file mode 100644 index 8857107d..00000000 --- a/deps/juce/.gitignore +++ /dev/null @@ -1,67 +0,0 @@ -._* -*.mode1v3 -*.pbxuser -*.perspectivev3 -*.user -*.ncb -*.suo -*.ilk -*.pch -*.pdb -*.dep -*.idb -*.manifest -*.manifest.res -*.o -*.d -*.sdf -*.opensdf -*.VC.db -*.VC.opendb -xcuserdata -*.xccheckout -*.xcscmblueprint -*.xcscheme -contents.xcworkspacedata -.DS_Store -.svn -.deps -.dirstamp -profile -**/MacOSX/build -**/iOS/build -**/IDEWorkspaceChecks.plist -**/Linux/build -**/LinuxMakefile/build -**/VisualStudio[0-9]*/Win32 -**/VisualStudio[0-9]*/x64 -**/Builds/x64 -**/.vs -**/CodeBlocks/bin -**/CodeBlocks/obj -**/CodeBlocks/*.depend -**/CodeBlocks/*.layout -**/Builds/Android/.gradle -**/Builds/Android/.idea -**/Builds/Android/build -**/Builds/Android/**/*.iml -**/Builds/Android/local.properties -**/Builds/Android/app/build -**/Builds/Android/app/.externalNativeBuild -**/Builds/Android/app/.cxx -**/Builds/Android/lib/build -**/Builds/Android/lib/.externalNativeBuild -**/Builds/CLion/cmake-build-* -**/Builds/CLion/.idea -**/Builds/MacOSX/**/Index -**/Builds/MacOSX/**/Intermediates.noindex -**/doxygen/doc -**/doxygen/build -**/.idea -extras/Projucer/JUCECompileEngine.dylib - -.idea -**/cmake-build* - -.vscode -/build diff --git a/deps/juce/.gitlab-ci.yml b/deps/juce/.gitlab-ci.yml deleted file mode 100644 index e91a6b17..00000000 --- a/deps/juce/.gitlab-ci.yml +++ /dev/null @@ -1,4 +0,0 @@ -include: - - project: 'juce-repos/JUCE-utils' - file: '/CI/gitlab-ci.yml' - diff --git a/deps/juce/.gitrepo b/deps/juce/.gitrepo deleted file mode 100644 index f21be29f..00000000 --- a/deps/juce/.gitrepo +++ /dev/null @@ -1,12 +0,0 @@ -; DO NOT EDIT (unless you know what you are doing) -; -; This subdirectory is a git "subrepo", and this file is maintained by the -; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme -; -[subrepo] - remote = https://github.com/essej/JUCE.git - branch = sono6good - commit = b13f9084e10cb3fa660d4cdf07ca68fb97a66caf - parent = 63e175fee674f67ded08d444e00e0f6df48f0120 - method = merge - cmdver = 0.4.3 diff --git a/deps/juce/BREAKING-CHANGES.txt b/deps/juce/BREAKING-CHANGES.txt deleted file mode 100644 index 97cdf712..00000000 --- a/deps/juce/BREAKING-CHANGES.txt +++ /dev/null @@ -1,1981 +0,0 @@ -JUCE breaking changes -===================== - -develop -======= - -Change ------- -Functions on AudioPluginInstance that can add parameters have been made -private. - -Possible Issues ---------------- -Code implementing custom plugin formats may stop building if it calls these -functions. - -Workaround ----------- -When implementing custom plugin formats, ensure that the plugin parameters -derive from AudioPluginInstance::HostedParameter and then use -addHostedParameter, addHostedParameterGroup or setHostedParameterTree to add -the parameters to the plugin instance. - -Rationale ---------- -In a plugin host, it is very important to be able to uniquely identify -parameters across different versions of the same plugin. To make this possible, -we needed to introduce a way of retrieving a unique ID for each parameter, -which is now possible using the HostedParameter class. However, we also needed -to enforce that all AudioPluginInstances can only have parameters which are of -the type HostedParameter, which required hiding the old functions. - - -Version 6.1.0 -============= - -Change ------- -juce::gl::loadFunctions() no longer loads extension functions. - -Possible Issues ---------------- -Code that depended on extension functions being loaded automatically may cease -to function correctly. - -Workaround ----------- -Extension functions can now be loaded using juce::gl::loadExtensions(). - -Rationale ---------- -There are a great number of extension functions, and on some systems these can -be slow to load (i.e. a second or so). Projects that do not require these -extension functions should not have to pay for this unnecessary overhead. Now, -only core functions will be loaded by default, and extensions can be loaded -explicitly in projects that require such functionality. - - -Change ------- -Thread::setPriority() will no longer set a realtime scheduling policy for all -threads with non-zero priorities on POSIX systems. - -Possible Issues ---------------- -Threads that implicitly relied on using a realtime policy will no longer -request a realtime policy if their priority is 7 or lower. - -Workaround ----------- -For threads that require a realtime policy on POSIX systems, request a priority -of 8 or higher by calling Thread::setPriority() or -Thread::setCurrentThreadPriority(). - -Rationale ---------- -By default, new Thread instances have a priority of 5. Previously, non-zero -priorities corresponded to realtime scheduling policies, meaning that new -Threads would use the realtime scheduling policy unless they explicitly -requested a priority of 0. However, most threads do not and should not require -realtime scheduling. Setting a realtime policy on all newly-created threads may -degrade performance, as multiple realtime threads will end up fighting for -limited resources. - - -Change ------- -The JUCE_GLSL_VERSION preprocessor definition has been removed. - -Possible Issues ---------------- -Code which used this definition will no longer compile. - -Workaround ----------- -Use OpenGLHelpers::getGLSLVersionString to retrieve a version string which is -consistent with the capabilities of the current OpenGL context. - -Rationale ---------- -A compile-time version string is not very useful, as OpenGL versions and -capabilities can change at runtime. Replacing this macro with a function allows -querying the capabilities of the current context at runtime. - - -Change ------- -The minimum support CMake version is now 3.15. - -Possible Issues ---------------- -It will no longer be possible to configure JUCE projects with CMake versions -between 3.12 and 3.14 inclusive. - -Workaround ----------- -No workaround is available. - -Rationale ---------- -Moving to 3.15 allows us to use target_link_directories and -target_link_options, which were introduced in 3.13, which in turn allows us to -provide support for bundled precompiled libraries in modules. Plugins already -required CMake 3.15, so this change just brings other target types in line with -the requirements for plugins. - - -Change ------- -The default value of JUCE_MODAL_LOOPS_PERMITTED has been changed from 1 to 0. - -Possible Issues ---------------- -With JUCE_MODAL_LOOPS_PERMITTED set to 0 code that previously relied upon modal -loops will need to be rewritten to use asynchronous versions of the modal -functions. There is no non-modal alternative to -AlterWindow::showNativeDialogBox and the previously modal behaviour of the -MultiDocumentPanel destructor has changed. - -Workaround ----------- -Set JUCE_MODAL_LOOPS_PERMITTED back to 1. - -Rationale ---------- -Modal operations are a frequent source of problems, particularly when used in -plug-ins. On Android modal loops are not possible, so people wanting to target -Android often have an unwelcome surprise when then have to rewrite what they -assumed to be platform independent code. Changing the default addresses these -problems. - - -Change ------- -The minimum supported C++ standard is now C++14 and the oldest supported -compilers on macOS and Linux are now Xcode 9.2, GCC 5.0 and Clang 3.4. - -Possible Issues ---------------- -Older compilers will no longer be able to compile JUCE. People using Xcode 8.5 -on OS X 10.11 will need to update the operating system to OS X 10.12 to be able -to use Xcode 9.2. - -Workaround ----------- -No workaround is available. - -Rationale ---------- -This compiler upgrade will allow the use of C++14 within the framework. - - -Change ------- -Platform GL headers are no longer included in juce_opengl.h - -Possible Issues ---------------- -Projects depending on symbols declared in these headers may fail to build. - -Workaround ----------- -The old platform-supplied headers have been replaced with a new juce_gl.h -header which is generated using the XML registry files supplied by Khronos. -This custom header declares GL symbols in the juce::gl namespace. If your code -only needs to be JUCE-compatible, you can explicitly qualify each name with -`juce::gl::`. If you need your code to build with different extension-loader -libraries (GLEW, GL3W etc.) you can make all GL symbols visible without -additional qualification with `using namespace juce::gl`. - -Rationale ---------- -Using our own GL headers allows us to generate platform-independent headers -which include symbols for all specified OpenGL versions and extensions. Note -that although the function signatures exist, they may not resolve to a function -at runtime. If your code uses commands from an extension or recent GL version, -you should check each function pointer against `nullptr` before attempting to -use it. To avoid repeatedly checking, you could query a subset of functions -after calling gl::loadFunctions() and cache the results. Supplying custom GL -headers also allows us to use C++ techniques (namespaces, references), making -the headers safer than the platform-defined headers. Platform headers are -generally written in C, and export a significant portion of their symbols as -preprocessor definitions. - - -Change ------- -The functions `getComponentAsyncLayerBackedViewDisabled` -and `setComponentAsyncLayerBackedViewDisabled` were moved into the juce -namespace. - -Possible Issues ---------------- -Code that declares these functions may fail to link. - -Workaround ----------- -Move declarations of these functions into the juce namespace. - -Rationale ---------- -Although the names of these functions are unlikely to collide with functions -from other libraries, we can make such collisions much more unlikely by keeping -JUCE code in the juce namespace. - - -Change ------- -The `juce_blocks_basics` module was removed. - -Possible Issues ---------------- -Projects depending on `juce_blocks_basics` will not build. - -Workaround ----------- -The BLOCKS API is now located in a separate repository: -https://github.com/WeAreROLI/roli_blocks_basics -Projects which used to depend on `juce_blocks_basics` can use -`roli_blocks_basics` instead. - -Rationale ---------- -ROLI is no longer involved with the development of JUCE. Therefore, development -on the BLOCKS API has been moved out of the JUCE repository, and to a new -repository managed by ROLI. - - -Change ------- -The live build functionality of the Projucer has been removed. - -Possible Issues ---------------- -You will no longer be able to use live build in the Projucer. - -Workaround ----------- -None. - -Rationale ---------- -Keeping the live build compatible with the latest compilers on all our -supported platforms is a very substantial maintenance burden, but very few -people are using this feature of the Projucer. Removing the live build will -simplify the code and our release process. - - -Change ------- -`Component::createFocusTraverser()` has been renamed to -`Component::createKeyboardFocusTraverser()` and now returns a `std::unique_ptr` -instead of a raw pointer. `Component::createFocusTraverser()` is a new method -for controlling basic focus traversal and not keyboard focus traversal. - -Possible Issues ---------------- -Derived Components that override the old method will no longer compile. - -Workaround ----------- -Override the new method. Be careful to override -`createKeyboardFocusTraverser()` and not `createFocusTraverser()` to ensure -that the behaviour is the same. - -Rationale ---------- -The ownership of this method is now clearer as the previous code relied on the -caller deleting the object. The name has changed to accomodate the new -`Component::createFocusTraverser()` method that returns an object for -determining basic focus traversal, of which keyboard focus is generally a -subset. - - -Change ------- -PluginDescription::uid has been deprecated and replaced with a new 'uniqueId' -data member. - -Possible Issues ---------------- -Code using the old data member will need to be updated in order to compile. - -Workaround ----------- -Code that used to use 'uid' to identify plugins should switch to using -'uniqueId', with some caveats - see "Rationale" for details. - -Rationale ---------- -The 'uniqueId' member has the benefit of being consistent for -a given VST3 across Windows, macOS, and Linux. However, the value of the -uniqueId may differ from the value of the old uid on some platforms. The value -of the old 'uid' member can now be found in the 'deprecatedUid' member, which -should allow clients to implement logic such as checking a saved uid against -the new uniqueId, and falling back to the deprecatedUid. This should allow -hosts to gracefully upgrade from the old uid values to the new values. - - -Version 6.0.8 -============= - -Change ------- -Calling AudioProcessorEditor::setResizeLimits() will no longer implicitly add a -ResizableCornerComponent to the editor if it has not already been set as -resizable. - -Possible Issues ---------------- -Code which previously relied on calling this method to set up the corner -resizer will no longer work. - -Workaround ----------- -Explicitly call AudioProcessorEditor::setResizable() with the second argument -set to true to enable the corner resizer. - -Rationale ---------- -The previous behaviour was undocumented and potentially confusing. There is now -a single method to control the behaviour of the editor's corner resizer to -avoid any ambiguity. - - -Change ------- -The implementations of `getValue` and `setValue` in `AUInstanceParameter` now -properly take the ranges of discrete parameters into account. - -Possible Issues ---------------- -This issue affects JUCE Audio Unit hosts. Automation data previously saved for -a discrete parameter with a non-zero minimum value may not set the parameter to -the same values as previous JUCE versions. Note that previously, `getValue` on -a hosted discrete parameter may have returned out-of-range values, and -`setValue` may have only mapped to a portion of the parameter range. As a -result, automation recorded for affected parameters was likely already behaving -unexpectedly. - -Workaround ----------- -There is no workaround. - -Rationale ---------- -The old behaviour was incorrect, and was causing issues in plugin validators -and other hosts. Hosts expect `getValue` to return a normalised parameter -value. If this function returns an out-of-range value (including Inf and NaN) -this is likely to break assumptions made by the host, leading to crashes, -corrupted project data, or other defects. - - -Change ------- -AudioProcessorListener::audioProcessorChanged gained a new parameter describing -the nature of any change. - -Possible Issues ---------------- -Code using the old function signature will not build until updated to use -the new signature. - -Workaround ----------- -Listeners should add the new parameter to any overrides of -audioProcessorChanged. - -Rationale ---------- -The new function signature means that wrappers can be smarter about the -requests that they make to hosts whenever some aspect of the processor changes. -In particular, plugin wrappers can now distinguish between changes to latency, -parameter attributes, and the current program. This means that hosts will no -longer assume parameters have changed when `setLatencySamples` is called. - - -Change ------- -CharacterFunctions::readDoubleValue now returns values consistent with other -C++ number parsing libraries. Parsing values smaller than the minimum number -respresentable in a double will return (+/-)0.0 and parsing values larger than -the maximum number respresentable in a double will return (+/-)inf. - -Possible Issues ---------------- -Code reading very large or very small numbers may receive values of 0.0 and inf -rather than nan. - -Workaround ----------- -Where you may be using std::isnan to check the validity of the result you can -instead use std::isfinite. - -Rationale ---------- -The new behaviour is consistent with other string parsing libraries. - - -Version 6.0.6 -============= - -Change ------- -The name of `OperatingSystemType::MacOSX_11_0` was changed to -`OperatingSystemType::MacOS_11`. - -Possible Issues ---------------- -Code using the old name will not build until it is updated to use the new name. - -Workaround ----------- -Update code using the old name to use the new name instead. - -Rationale ---------- -Newer versions of macOS have dropped the "X" naming. Minor version updates are -also less significant now than they were for the X-series. - - -Change ------- -Xcode projects generated using the Projucer will now use the "New Build System" -instead of the "Legacy Build System" by default. - -Possible Issues ---------------- -Xcode 10.0 - 10.2 has some known issues when using the new build system such as -JUCE modules not rebuilding correctly when modified, issue and file navigation -not working, and breakpoints not being reliably set or hit. - -Workaround ----------- -If you are using an affected version of Xcode then you can enable the "Use -Legacy Build System" setting in the Projucer Xcode exporter to go back to the -previous behaviour. - -Rationale ---------- -The legacy build system has issues building arm64 binaries for Apple silicon -and will eventually be removed altogether. - - -Version 6.0.5 -============= - -Change ------- -New pure virtual methods accepting `PopupMenu::Options` arguments have been -added to `PopupMenu::LookAndFeelMethods`. - -Possible Issues ---------------- -Classes derived from `PopupMenu::LookAndFeelMethods`, such as custom -LookAndFeel classes, will not compile unless these pure virtual methods are -implemented. - -Workaround ----------- -The old LookAndFeel methods still exist, so if the new Options parameter is not -useful in your application, your implementation of -`PopupMenu::LookAndFeelMethods` can simply forward to the old methods. For -example, your implementation of `drawPopupMenuBackgroundWithOptions` can -internally call your existing `drawPopupMenuBackground` implementation. - -Rationale ---------- -Allowing the LookAndFeelMethods to access the popup menu's options allows for -more flexible styling. For example, a theme may wish to query the menu's target -component or parent for colours to use. - - -Change ------- -A typo in the JUCEUtils CMake script that caused the wrong manufacturer code to -be set in the compile definitions for a plugin was fixed. - -Possible Issues ---------------- -The manufacturer code for plugins built under CMake with this version of JUCE -will differ from the manufacturer code that was generated previously. - -Workaround ----------- -If you have released plugins that used the old, incorrect manufacturer code and -wish to continue using this code for backwards compatibility, add the following -to your `juce_add_plugin` call: - - USE_LEGACY_COMPATIBILITY_PLUGIN_CODE TRUE - -In most cases, this should not be necessary, and we recommend using the fixed -behaviour. - -Rationale ---------- -This change ensures that the manufacturer codes used by CMake projects match -the codes that would be generated by the Projucer, improving compatibility -when transitioning from the Projucer to CMake. - - -Version 6.0.2 -============= - -Change ------- -The JUCE_WASAPI_EXCLUSIVE flag has been removed from juce_audio_devices and all -available WASAPI audio device modes (shared, shared low latency and exclusive) -are available by default when JUCE_WASAPI is enabled. The -AudioIODeviceType::createAudioIODeviceType_WASAPI() method which takes a single -boolean argument has also been deprecated in favour of a new method which takes -a WASAPIDeviceMode enum. - -Possible Issues ---------------- -Code that relied on the JUCE_WASAPI_EXCLUSIVE flag to disable WASAPI exclusive -mode will no longer work. - -Workaround ----------- -Override the AudioDeviceManager::createAudioDeviceTypes() method to omit the -WASAPI exclusive mode device if you do not want it to be available. - -Rationale ---------- -JUCE now supports shared low latency WASAPI audio devices via the AudioClient3 -interface and instead of adding an additional compile time config flag to -enable this functionality, which adds complexity to the build process when not -using the Projucer, JUCE makes all WASAPI device modes available by default. - - -Change ------- -The fields representing Mac OS X 10.4 to 10.6 inclusive have been removed from -the `OperatingSystemType` enum. - -Possible Issues ---------------- -Code that uses these fields will fail to build. - -Workaround ----------- -Remove references to these fields from user code. - -Rationale ---------- -JUCE is not supported on Mac OS X versions lower than 10.7, so it is a given -that `getOperatingSystemType` will always return an OS version greater than or -equal to 10.7. Code that changes behaviours depending on the OS version can -assume that this version is at least 10.7. - - -Change ------- -The JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING flag in juce_graphics is no -longer used on iOS. - -Possible Issues ---------------- -Projects with this flag enabled may render differently on iOS. - -Workaround ----------- -There is no workaround. - -Rationale ---------- -When using a cached image to render Components with `setBufferedToImage (true)` -the result now matches the default behaviour on iOS where fonts are not -smoothed. - - -Change ------- -Space, return and escape key events on the native macOS menu bar are no longer -passed to the currently focused JUCE Component. - -Possible Issues ---------------- -Code relying on receiving these keyboard events will no longer work. - -Workaround ----------- -There is no workaround. - -Rationale ---------- -It should be possible for users with a keyboard or assistive device to navigate -the menu, invoking the currently highlighted menu item with the space or return -key and dismissing the menu with the escape key. These key events should not be -passed to the application and doing so interferes with the accessibility of -JUCE apps. Only passing these events to the native macOS menu means that JUCE -apps behave as expected for users. - - -Version 6.0.0 -============= - -Change ------- -The Convolution class interface was changed: -- `loadImpulseResponse` member functions now take `enum class` parameters - instead of `bool`. -- `copyAndLoadImpulseResponseFromBlock` and - `copyAndLoadImpulseResponseFromBuffer` were replaced by a new - `loadImpulseResponse` overload. - -Possible Issues ---------------- -Code using the old interface will no longer compile, and will need to be -updated. - -Workaround ----------- -Code that was previously loading impulse responses from binary data or from -files can substitute old `bool` parameters with the newer `enum class` -equivalents. Code that was previously passing buffers or blocks will need -reworking so that the Convolution instance can take ownership of the buffer -containing the impulse response. - -Rationale ---------- -The newer `enum class` parameters make user code much more readable, e.g. -`loadImpulseResponse (file, Stereo::yes, Trim::yes, 0, Normalise::yes)` rather -than `loadImpulseResponse (file, true, true, 0, true);`. By taking ownership of -the passed buffer, the Convolution can avoid preallocating a large internal -buffer, reducing memory usage when short impulse responses are used. Changing -the ownership semantics of the buffer also makes it easier for users to avoid -copies/allocations on the audio thread, and gives more flexibility to the -implementation to run initialisation tasks on a background thread. - - -Change ------- -All references to ROLI Ltd. (ROLI) have been changed to Raw Material Software -Limited. - -Possible Issues ---------------- -Exising projects, particularly Android, may need to be resaved by the Projucer -and have the old build artifacts deleted before they will build. - -Workaround ----------- -In Android projects any explicit mention of paths with the from "com.roli.*" -should be changed to the form "com.rmsl.*". - -Rationale ---------- -This change reflects the change in ownership from ROLI to RMSL. - - -Change ------- -The Windows DPI handling in the VST wrapper and hosting code has been -refactored to be more stable. - -Possible Issues ---------------- -The new code uses a top-level AffineTransform to scale the JUCE editor window -instead of native methods. Therefore any AudioProcessorEditors which have their -own AffineTransform applied will no longer work correctly. - -Workaround ----------- -If you are using an AffineTransform to scale the entire plug-in window then -consider putting the component you want to transform in a child of -the editor and transform that instead. Alternatively, if you don't need a -separate scale factor for each plug-in instance you can use -Desktop::setGlobalScaleFactor(). - -Rationale ---------- -The old code had some bugs when using OpenGL and when moving between monitors -with different scale factors. The new code should fix these and DPI-aware -plug-ins will scale correctly. - - -Change ------- -Relative Xcode subproject paths specified in the Projucer are now relative to -the build directory rather than the project directory. - -Possible Issues ---------------- -After being re-saved in the Projucer existing Xcode projects will fail to find -any subprojects specified using a relative path. - -Workaround ----------- -Update the subproject path in the Projucer. - -Rationale ---------- -Most other Xcode specific paths are specified reltive to the build directory. -This change brings the Xcode subproject path in line with the rest of the -configuration. - - -Version 5.4.6 -============= - -Change ------- -AudioProcessorValueTreeState::getRawParameterValue now returns a -std::atomic* instead of a float*. - -Possible Issues ---------------- -Existing code which explicitly mentions the type of the returned value, or -interacts with the dereferenced float in ways unsupported by the std::atomic -wrapper, will fail to compile. Certain evaluation-reordering compiler -optimisations may no longer be possible. - -Workaround ----------- -Update your code to deal with a std::atomic* instead of a float*. - -Rationale ---------- -Returning a std::atomic* allows the JUCE framework to have much stronger -guarantees about thread safety. - - -Change ------- -Removed a workaround from the ASIOAudioIODevice::getOutputLatencyInSamples() -and ASIOAudioIODevice::getInputLatencyInSamples() methods which was adding an -arbitrary amount to the reported latencies to compensate for dodgy, old -drivers. - -Possible Issues ---------------- -Code which relied on these altered values may now behave differently. - -Workaround ----------- -Update your code to deal with the new, correct values reported from the drivers -directly. - -Rationale ---------- -JUCE will now return the latency values as reported by the drivers without -adding anything to them. The workaround was for old drivers and the current -drivers should report the correct values without the need for the workaround. - - -Change ------- -The default behaviour of the AU and AUv3 plug-in wrappers is now to call -get/setStateInformation instead of get/setProgramStateInformation. - -Possible Issues ---------------- -AudioProcessor subclasses which have overridden the default implementations of -get/setProgramStateInformation (which simply call through to -get/setStateInformation) may be unable to load previously saved state; state -previously saved via a call to getProgramStateInformation will be presented to -setStateInformation. - -Workaround ----------- -Enable the JUCE_AU_WRAPPERS_SAVE_PROGRAM_STATES configuration option in the -juce_audio_plugin_client module to preserve backwards compatibility if -required. - -Rationale ---------- -When using overridden get/setProgramStateInformation methods the previous -behaviour of the AU and AUv3 wrappers does not correctly save and restore -state. - - -Version 5.4.5 -============= - -Change ------- -The alignment of text rendered on macOS using CoreGraphics may have shifted -slightly, depending on the font you have used. The default macOS font has -shifted downwards. - -Possible Issues ---------------- -Meticulously aligned text components of a GUI may now be misaligned. - -Workaround ----------- -Use a custom LookAndFeel to change the location where text is drawn, or use a -different font that matches the previous alignment of your original font. - -Rationale ---------- -This was an unintentional change resulting from moving away from a deprecated -macOS text API. The new alignment is consistent with other rendering engines -(web browsers and text editors) and the software renderer. - - -Change ------- -The JUCEApplicationBase::backButtonPressed() method now returns a bool to -indicate whether the back event was handled or not. - -Possible Issues ---------------- -Applications which override this method will fail to compile. - -Workaround ----------- -You will need to update your code to return a bool indicating whether the back -event was handled or not. - -Rationale ---------- -The back button behaviour on Android was previously broken as it would not do -anything. The new code will correctly call finish() on the Activity when the -back button is pressed but this method now allows the user to override this to -implement their own custom navigation behaviour by returning true to indicate -that it has been handled. - - -Change ------- -The AudioBlock class has been refactored and some of the method names have -changed. Additionally the `const` behaviour now mirrors that of `std::span`, -with the `const`-ness of the contained data decoupled from the `const`-ness of -the container. - -Possible Issues ---------------- -Code using the old method names or violating `const`-correctness will fail to -compile. - -Workaround ----------- -You will need to update your code to use the new method names and select an -appropriate `const`-ness for the AudioBlock and the data it references. - -Rationale ---------- -The names of some of the methods in the AudioBlock class were ambiguous, -particularly when chaining methods involving references to other blocks. The -interaction between the `const`-ness of the AudioBlock and the `const`-ness of -the referenced data was also ambiguous and has now been standardised to the -same behaviour as other non-owning data views like `std::span`. - - -Version 5.4.4 -============= - -Change ------- -The Visual Studio 2013 exporter has been removed from the Projucer and we will -no longer maintain backwards compatibility with Visual Studio 2013 in JUCE. - -Possible Issues ---------------- -It is no longer possible to create Visual Studio 2013 projects from the -Projucer or compile JUCE-based software using Visual Studio 2013. - -Workaround ----------- -If you are using Visual Studio 2013 to build your projects you will need to -update to a more modern version of Visual Studio. - -Rationale ---------- -Of all the platforms JUCE supports Visual Studio 2013 was holding us back the -most in terms of C++ features we would like to use more broadly across the -codebase. It is still possible to target older versions of Windows with more -modern versions of Visual Studio. Until recently the AAX SDK was distributed as -a Visual Studio 2013 project, but this is now provided as a Visual Studio 2017 -project. - - -Change ------- -JUCE is moving towards using C++11 pointer container types instead of passing -raw pointers as arguments and return values. - -Possible Issues ---------------- -You will need to change your code to pass std::unique_ptr into and out of -various functions across JUCE's API. - -Workaround ----------- -None - -Rationale ---------- -Indicating ownership through the transfer of smart pointer types has been part -of mainstream C++ for a long time and this change enforces memory safety by -default in most situations. - - -Change ------- -SystemTrayIconComponent::setIconImage now takes two arguments, rather than one. -The new argument is a template image for use on macOS where all non-transparent -regions will render in a monochrome colour determined dynamically by the -operating system. - -Possible Issues ---------------- -You will now need to provide two images to display a SystemTrayIconComponent -and the SystemTrayIconComponent will have a different appearance on macOS. - -Workaround ----------- -If you are not targeting macOS then you can provide an empty image, `{}`, for -the second argument. If you are targeting macOS then you will likely need to -design a new monochrome icon. - -Rationale ---------- -The introduction of "Dark Mode" in macOS 10.14 means that menu bar icons must -support several different colours and highlight modes to retain the same -appearance as the native Apple icons. Doing this correctly without delegating -the behaviour to the operating system is extremely cumbersome, and the APIs we -were previously using to interact with menu bar items have been deprecated. - - -Change ------- -The AudioBlock class now differentiates between const and non-const data. - -Possible Issues ---------------- -The return type of the getInputBlock() method of the ProcessContextReplacing -and ProcessContextNonReplacing classes has changed from AudioBlock to -AudioBlock. - -Workaround ----------- -For ProcessContextReplacing you should use getOutputBlock() instead of -getInputBlock(). For ProcessContextNonReplacing attempting to modify the input -block is very likely an error. - -Rationale ---------- -This change makes the intent of the code much clearer and means that we can -remove some const_cast operations. - - -Change ------- -The formatting of floating point numbers written to XML and JSON files has -changed. - -Note that there is no change in precision - the XML and JSON files containing -the new format numbers will parse in exactly the same way, it is only the -string representation that has changed. - -Possible Issues ---------------- -If you rely upon exactly reproducing XML or JSON files then the new files may -be different. - -Workaround ----------- -Update any reference XML or JSON files to use the new format. - -Rationale ---------- -The new format retains full precision, provides a human friendly representation -of values near 1, and uses scientific notation for small and large numbers. -This prevents needless file size bloat from numbers like 0.00000000000000001. - - -Version 5.4.3 -============= - -Change ------- -The global user module path setting in the Projucer can now only contain a -single path. - -Possible Issues ---------------- -Projects that previously relied on using multiple global user module paths -separated by a semicolon will fail to find these modules after re-saving. - -Workaround ----------- -Replace the multiple paths with a single global user module path. - -Rationale ---------- -Using multiple global user module paths did not work when saving a project -which exported to different OSes. Only allowing a single path will prevent this -from silently causing issues. - - -Version 5.4.2 -============= - -Change ------- -The return type of Block::getBlockAreaWithinLayout() has been changed from -Rectangle to a simpler BlockArea struct. - -Possible Issues ---------------- -Classes that derive from Block and implement this pure virtual method will no -longer compile due to a change in the function signature. - -Workaround ----------- -Update the method to return a BlockArea struct and update code that calls -getBlockAreaWithinLayout to handle a BlockArea instead of a Rectangle. - -Rationale ---------- -The juce_blocks_basics is ISC licensed and therefore cannot depend on the -GPL/Commercial licensed juce_graphics module that contains Rectangle. - - -Change ------- -Renaming and deletion of open file handles on Windows is now possible using the -FILE_SHARE_DELETE flag. - -Possible Issues ---------------- -Previous code that relied on open files not being able to be renamed or deleted -on Windows may fail. - -Workaround ----------- -No workaround. - -Rationale ---------- -This unifies the behaviour across OSes as POSIX systems already allow this. - - -Change ------- -Multiple changes to low-level, non-public JNI and Android APIs. - -Possible Issues ---------------- -If you were using any non-public, low-level JNI macros, calling java code or -recieving JNI callbacks, then your code will probably no longer work. See the -forum for further details. - -Workaround ----------- -See the forum for further details. - -Rationale ---------- -See the forum for further details. - - -Change ------- -The minimum Android version for a JUCE app is now Android 4.1 - -Possible Issues ---------------- -Your app may not run on very old versions of Android (less than 0.5% of the -devices). - -Workaround ----------- -There is no workaround. - -Rationale ---------- -Less than 0.5% of all devices in the world run versions of Android older than -Android 4.1. In the interest of keeping JUCE code clean and lean, we must -depricate support for very old Android versions from time to time. - - -Version 5.4.0 -============= - -Change ------- -The use of WinRT MIDI functions has been disabled by default for any version -of Windows 10 before 1809 (October 2018 Update). - -Possible Issues ---------------- -If you were previously using WinRT MIDI functions on older versions of Windows -then the new behaviour is to revert to the old Win32 MIDI API. - -Workaround ----------- -Set the preprocessor macro JUCE_FORCE_WINRT_MIDI=1 (in addition to the -previously selected JUCE_USE_WINRT_MIDI=1) to allow the use of the WinRT API on -older versions of Windows. - -Rationale ---------- -Until now JUCE's support for the Windows 10 WinRT MIDI API was experimental, -due to longstanding issues within the API itself. These issues have been -addressed in the Windows 10 1809 (October 2018 Update) release. - - -Change ------- -The VST2 SDK embedded within JUCE has been removed. - -Possible Issues ---------------- -1. Building or hosting VST2 plug-ins requires header files from the VST2 SDK, - which is no longer part of JUCE. -2. Building a VST2-compatible VST3 plug-in (the previous default behaviour in - JUCE) requires header files from the VST2 SDK, which is no longer part of - JUCE. - -Workaround ----------- -1. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or - older) VST3 SDK or JUCE version 5.3.2. You should put the VST2 SDK in your - header search paths or use the "VST (Legacy) SDK Folder" fields in the - Projucer. -2. For new plug-in projects where you will be releasing both a VST2 and VST3 - version, and you want the VST3 plug-in to replace the VST2 plug-in in - hosts that support it, then you should enable the JUCE_VST3_CAN_REPLACE_VST2 - option. -3. When a new JUCE plug-in project is created the value of - JUCE_VST3_CAN_REPLACE_VST2 will be set to zero. - -Rationale ---------- -Distributing VST2 plug-ins requires a VST2 license from Steinberg. Following -Steinberg's removal of the VST2 SDK from their public SDKs we are also removing -the VST2 SDK from the JUCE codebase. - - -Change ------- -The AudioProcessorValueTreeState::createAndAddParameter function has been -deprecated. - -Possible Issues ---------------- -Deprecation warnings will be seen when compiling code which uses this function -and eventually builds will fail when it is later removed from the API. - -Workaround ----------- -Previous calls to - -createAndAddParameter (paramID, paramName, ...); - -can be directly replaced with - -using Parameter = AudioProcessorValueTreeState::Parameter; -createAndAddParameter (std::make_unique (paramID, paramName, ...)); - -but an even better approach is to use the new AudioProcessorValueTreeState -constructor where you can pass both RangedAudioParameters and -AudioProcessorParameterGroups of RangedAudioParameters to the -AudioProcessorValueTreeState and initialise the ValueTree simultaneously. - -Rationale ---------- -The new createAndAddParameter method is much more flexible and enables any -parameter types derived from RangedAudioParameter to be managed by the -AudioProcessorValueTreeState. - - -Change ------- -The Projucer's per-exporter Android SDK/NDK path options have been removed. - -Possible Issues ---------------- -Projects that previously used these fields may no longer build. - -Workaround ----------- -Use the Projucer's global paths settings to point to these directories, either -by opening the "Projucer/File->Global Paths..." menu item or using the -"--set-global-search-path" command-line option. - -Rationale ---------- -Having multiple places where the paths could be set was confusing and could -cause unexpected mismatches. - - -Change ------- -SystemStats::getDeviceDescription() will now return the device code on iOS e.g. -"iPhone7, 2" for an iPhone 6 instead of just "iPhone". - -Possible Issues ---------------- -Code that previously relied on this method returning either explicitly "iPhone" -or "iPad" may no longer work. - -Workaround ----------- -Modify this code to handle the new device code string e.g. by changing: -SystemStats::getDeviceDescription() == "iPhone"; -to -SystemStats::getDeviceDescription().contains ("iPhone");. - -Rationale ---------- -The exact device model can now be deduced from this information instead of just -the device family. - - -Change ------- -DragAndDropContainer::performExternalDragDropOfFiles() and -::performExternalDragDropOfText() are now asynchronous on Windows. - -Possible Issues ---------------- -Code that previously relied on these operations being synchronous and blocking -until completion will no longer work as the methods will return immediately and -run asynchronously. - -Workaround ----------- -Use the callback argument that has been added to these methods to register a -lambda that will be called when the operation has been completed. - -Rationale ---------- -The behaviour of these methods is now consistent across all platforms and the -method no longer blocks the message thread on Windows. - - -Change ------- -AudioProcessor::getTailLengthSeconds can now return infinity for -VST/VST3/AU/AUv3. - -Possible Issues ---------------- -If you are using the result of getTailLengthSeconds to allocate a buffer in -your host, then your host will now likely crash when loading a plug-in with an -infinite tail time. - -Workaround ----------- -Rewrite your code to not use the result of getTailLengthSeconds directly to -allocate a buffer. - -Rationale ---------- -Before this change there was no way for a JUCE plug-in to report an infinite -tail time. - - -Version 5.3.2 -============= - -Change ------- -The behaviour of an UndoManager used by an AudioProcessorValueTreeState has -been improved. - -Possible Issues ---------------- -If your plug-in contains an UndoManager used by an AudioProcessorValueTreeState -and relies upon the old behaviour of the UndoManager then it is possible that -the new behaviour is no longer appropriate for your use case. - -Workaround ----------- -Use an external UndoManager to reproduce the old behaviour manually. - -Rationale ---------- -This change fixes a few bugs in the behaviour of an UndoManager used by an -AudioProcessorValueTreeState. - - -Change ------- -JUCE no longer supports OS X deployment targets earlier than 10.7. - -Possible Issues ---------------- -If you were previously targeting OS X 10.5 or 10.6 you will no longer be able -to build JUCE-based products compatible with those platforms. - -Workaround ----------- -None. With the appropriate JUCE licence you may be able to backport new JUCE -features, but there will be no official support for this. - -Rationale ---------- -Increasing the minimum supported OS X version allows the JUCE codebase to make -use of the more modern C++ features found in the 10.7 standard library, which -in turn will increase thread and memory safety. - - -Version 5.3.0 -============= - -Change ------- -The JUCE examples have been cleaned up, modernised and converted into PIPs -(Projucer Instant Projects). The JUCE Demo has been removed and replaced by the -DemoRunner application and larger projects such as the Audio Plugin Host and -the Network Graphics Demo have been moved into the extras directory. - -Possible Issues ---------------- -1. Due to the large number of changes that have occurred in the JUCE Git - repository, pulling this version may result in a messy folder structure with - empty directories that have been removed. -2. The JUCE Demo project is no longer in the JUCE repository. -3. The Audio Plugin Host project has moved from the examples directory to the - extras directory. - -Workaround ----------- -1. Run a Git clean command (git clean -xdf) in your JUCE directory to remove - all untracked files, directories and build products. -2. The new DemoRunner application, located in extras/DemoRunner, can be used to - preview all the JUCE examples and see the code side-by-side. -3. Change any file paths that depended on the plugin host project being located - in the examples directory to use the extras directory instead. - -Rationale ---------- -The JUCE examples had inconsistent naming, coding styles and the projects and -build products took up a large amount of space in the repository. Replacing -them with PIPs reduces the file size and allows us to categorise the examples -better, as well as cleaning up the code. - - -Change ------- -When hosting plug-ins all AudioProcessor methods of managing parameters that -take a parameter index as an argument have been deprecated. - -Possible Issues ---------------- -A single assertion will be fired in debug builds on the first use of a -deprecated function. - -Workaround ----------- -When hosting plug-ins you should use the AudioProcessor::getParameters() method -and interact with parameters via the returned array of -AudioProcessorParameters. For a short-term fix you can also continue past the -assertion in your debugger, or temporarily modify the JUCE source code to -remove it. - -Rationale ---------- -Given the structure of JUCE's API it is impossible to deprecate these functions -using only compile-time messages. Therefore a single assertion, which can be -safely ignored, serves to indicate that these functions should no longer be -used. The move away from the AudioProcessor methods both improves the interface -to that class and makes ongoing development work much easier. - - -Change ------- -This InAppPurchases class is now a JUCE Singleton. This means that you need -to get an instance via InAppPurchases::getInstance(), instead of storing a -InAppPurchases object yourself. - -Possible Issues ---------------- -Any code using InAppPurchases needs to be updated to retrieve a singleton -pointer to InAppPurchases. - -Workaround ----------- -Instead of holding a InAppPurchase member yourself, you should get an instance -via InAppPurchases::getInstance(), e.g. - -instead of: - -InAppPurchases iap; -iap.purchaseProduct (...); - -call: - -InAppPurchases::getInstance()->purchaseProduct (...); - -Rationale ---------- -This change was required to fix an issue on Android where on failed transaction -a listener would not get called. - - -Change ------- -JUCE's MPE classes have been updated to reflect the official specification -recently approved by the MIDI Manufacturers Association (MMA). - -Possible Issues ---------------- -The most significant changes have occurred in the MPEZoneLayout classes and -programs using the higher level MPE classes such as MPEInstrument, -MPESynthesiser, MPESynthesiserBase and MPESynthesiserVoice should be -unaffected. - -Previously, any MIDI channel from 1 - 15 could be selected to be the master -channel of an MPE zone, with a specified number of member channels ascending -from the master channel + 1. However, in the new specification this has been -simplified so that a device only has a lower and/or an upper zone, where the -lower zone has master channel 1 and assigns new member channels ascending from -channel 2 and the upper zone has master channel 16 and assigns new member -channels descending from channel 15. - -Workaround ----------- -Use the MPEZoneLayout::setLowerZone() and MPEZoneLayout::setUpperZone() methods -to set zone layouts. - -Any UI that allows users to select and set zones on an MPE instrument should -also be updated to reflect the specification changes. - -Rationale ---------- -The MPE classes in JUCE are out of date and should be updated to reflect the -new, official MPE standard. - - -Version 5.2.1 -============= - -Change ------- -Calling JUCEApplicationBase::quit() on Android will now really quit the app, -rather than just placing it in background. Starting with API level 21 (Android -5.0), the app will not appear in recent apps list after calling quit(). Prior -to API 21, the app will still appear in recent app lists but when a user -chooses the app, a new instance of the app will be started. - -Possible Issues ---------------- -Any code calling JUCEApplicationBase::quit() to place the app in background -will close the app instead. - -Workaround ----------- -Use Process::hide(). - -Rationale ---------- -The old behaviour JUCEApplicationBase::quit() was confusing JUCE code, as a new -instance of JUCE app was attempted to be created, while the older instance was -still running in background. This would result in assertions when starting a -second instance. - - -Change ------- -On Windows, release builds will now link to the dynamic C++ runtime by default - -Possible Issues ---------------- -If you are creating a new .jucer project, then your plug-in will now link to -the dynamic C++ runtime by default, which means that you MUST ensure that the -C++ runtime libraries exist on your customer's computers. - -Workaround ----------- -If you are only targeting Windows 10, then the C++ runtime is now part of the -system core components and will always exist on the computers of your customers -(just like kernel332.dll, for example). If you are targeting Windows versions -between Vista and Windows 10, then you should build your plug-in with the -latest updated version of VS2015 or later, which ensures that it's linked to -the universal runtime. Universal runtime is part of the system's core libraries -on Windows 10 and on Windows versions Vista to 8.1, it will be available on -your customer's computers via Windows Update. Unfortunately, if your customer -has just installed Windows 8.1 to Vista on a fresh computer, then there is a -chance that the update mechanism for the universal runtime hasn't triggered yet -and your plug-in may still fail. Your installer should prompt the user to -install all the Windows updates in this case or you can deploy the universal -runtime as a redistributable with your installer. If you are targeting earlier -versions of Windows then you should always include the runtime as a -redistributable with your plug-in's installer. Alternatively, you can change -the runtime linking to static (however, see 'Rationale' section). - -Rationale ---------- -In a recent update to Windows 10, Microsoft has limited the number of fiber -local storage (FLS) slots per process. Effectively, this limits how many -plug-ins with static runtime linkage can be loaded into a DAW. In the worst -case, this limits the total number of plug-ins to a maximum of 64 plug-ins. -There is no workaround for DAW vendors and the only solution is to push plug-in -vendors to use the dynamic runtime. To help with this, JUCE has decided to make -dynamic runtime linkage the default in JUCE. - - -Change ------- -AudioProcessorGraph interface has changed in a number of ways - Node objects -are now reference counted, there are different accessor methods to iterate -them, and misc other small improvements to the API - -Possible Issues ---------------- -The changes won't cause any silent errors in user code, but will require some -manual refactoring - -Workaround ----------- -Just find equivalent new methods to replace existing code. - -Rationale ---------- -The graph class was extremely old and creaky, and these changes is the start of -an improvement process that should eventually result in it being broken down -into fundamental graph building block classes for use in other contexts. - - -Version 5.2.0 -============= - -Change ------- -Viewport now enables "scroll on drag" mode by default on Android and iOS. - -Possible Issues ---------------- -Any code relying on "scroll on drag" mode being turned off by default, should -disable it manually. - -Workaround ----------- -None. - -Rationale ---------- -It is expected on mobile devices to be able to scroll a list by just a drag, -rather than using a dedicated scrollbar. The scrollbar is still available -though if needed. - - -Change ------- -The previous setting of Android exporter "Custom manifest xml elements" -creating child nodes of element has been replaced by "Custom -manifest XML content" setting that allows to specify the content of the entire -manifest instead. Any previously values of the old setting will be used in the -new setting by default, and they will need changing as mentioned in Workaround. -The custom content will be merged with the content auto-generated by Projucer. -Any custom elements or custom attributes will override the ones set by -Projucer. Projucer will also automatically add any missing and required -elements and attributes. - -Possible Issues ---------------- -If a Projucer project used "Custom manifest xml elements" field, the value will -no longer be compatible with the project generated in the latest Projucer -version. The solution is very simple and quick though, as mentioned in the -Workaround section. - -Workaround ----------- -For any elements previously used, simply embed them explicitly in - elements, for example instead of: - - - - -simply write: - - - - - - - - -Rationale ---------- -To maintain the high level of flexibility of generated Android projects and to -avoid creating fields in Projucer for every possible future parameter, it is -simpler to allow to set up the required parameters manually. This way it is not -only possible to add any custom elements but it is also possible to override -the default attributes assigned by Projucer for the required elements. For -instance, if the default value of element is not -satisfactory because you want a support for x-large screens only, simply set -"Custom manifest XML content" to: - - - - - - -Version 5.1.2 -============= - -Change ------- -The method used to classify AudioUnit, VST3 and AAX plug-in parameters as -either continuous or discrete has changed, and AudioUnit and AudioUnit v3 -parameters are marked as high precision by default. - -Possible Issues ---------------- -Plug-ins: DAW projects with automation data written by an AudioUnit, AudioUnit -v3 VST3 or AAX plug-in built with JUCE version 5.1.1 or earlier may load -incorrectly when opened by an AudioUnit, AudioUnit v3, VST3 or AAX plug-in -built with JUCE version 5.1.2 and later. - -Hosts: The AudioPluginInstance::getParameterNumSteps method now returns correct -values for AU and VST3 plug-ins. - -Workaround ----------- -Plug-ins: Enable JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE in the -juce_audio_plugin_client module config page in the Projucer. - -Hosts: Use AudioPluginInstance::getDefaultNumParameterSteps as the number of -steps for all parameters. - -Rationale ---------- -The old system for presenting plug-in parameters to a host as either continuous -or discrete is inconsistent between plug-in types and lacks sufficient -flexibility. This change harmonises the behaviour and allows individual -parameters to be marked as continuous or discrete. If AudioUnit and AudioUnit -v3 parameters are not marked as high precision then hosts like Logic Pro only -offer a limited number of parameter values, which again produces different -behaviour for different plug-in types. - - -Change ------- -A new FrameRateType fps23976 has been added to AudioPlayHead, - -Possible Issues ---------------- -Previously JUCE would report the FrameRateType fps24 for both 24 and 23.976 -fps. If your code uses switch statements (or similar) to handle all possible -frame rate types, then this change may cause it to fall through. - -Workaround ----------- -Add fps23976 to your switch statement and handle it appropriately. - -Rationale ---------- -JUCE should be able to handle all popular frame rate codes but was missing -support for 23.976. - - -Change ------- -The String (bool) constructor and operator<< (String&, bool) have been -explicitly deleted. - -Possible Issues ---------------- -Previous code which relied on an implicit bool to int type conversion to -produce a String will not compile. - -Workaround ----------- -Cast your bool to an integer to generate a string representation of it. - -Rationale ---------- -Letting things implicitly convert to bool to produce a String opens the door to -all kinds of nasty type conversion edge cases. Furthermore, before this change, -MacOS would automatically convert bools to ints but this wouldn't occur on -different platform. Now the behaviour is consistent across all operating -systems supported by JUCE. - - -Change ------- -The writeAsJSON virtual method of the DynamicObject class requires an -additional parameter, maximumDecimalPlaces, to specify the maximum precision of -floating point numbers. - -Possible Issues ---------------- -Classes which inherit from DynamicObject and override this method will need to -update their method signature. - -Workaround ----------- -Your custom DynamicObject class can choose to ignore the additional parameter -if you don't wish to support this behaviour. - -Rationale ---------- -When serialising the results of calculations to JSON the rounding of floating -point numbers can result in numbers with 17 significant figures where only a -few are required. This change to DynamicObject is required to support -truncating those numbers. - - -Version 5.1.0 -============= - -Change ------- -The JUCE_COMPILER_SUPPORTS_LAMBDAS preprocessor macro has been removed. - -Possible Issues ---------------- -If your project is using JUCE_COMPILER_SUPPORTS_LAMBDAS in your source code -then it will likely evaluate to "false" and you could end up unnecessarily -using code paths which avoid lambda functions. - -Workaround ----------- -Remove the usage of JUCE_COMPILER_SUPPORTS_LAMBDAS from your code. - -Rationale ---------- -Lambda functions are now available on all platforms that JUCE supports. - - -Change ------- -The option to set the C++ language standard is now located in the project -settings instead of the build configuration settings. - -Possible Issues ---------------- -Projects that had a specific version of the C++ language standard set for -exporter build configurations will instead use the default (C++11) when -re-saving with the new Projucer. - -Workaround ----------- -Change the "C++ Language Standard" setting in the main project settings to the -required version - the Projucer will add this value to the exported project as -a compiler flag when saving exporters. - -Rationale ---------- -Having a different C++ language standard option for each build configuration -was unnecessary and was not fully implemented for all exporters. Changing it to -a per-project settings means that the preference will propagate to all -exporters and only needs to be set in one place. - - -Change ------- -PopupMenus now scale according to the AffineTransform and scaling factor of -their target components. - -Possible Issues ---------------- -Developers who have manually scaled their PopupMenus to fit the scaling factor -of the parent UI will now have the scaling applied two times in a row. - -Workaround ----------- -1. Do not apply your own manual scaling to make your popups match the UI - scaling - -or - -2. Override the Look&Feel method - PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and - return false. See - https://github.com/juce-framework/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725 - -Rationale ---------- -Previously, PopupMenus would not scale if the GUI of the target component (or -any of it’s parents) were scaled. The only way to scale PopupMenus was via the -global scaling factor. This had several drawbacks as the global scaling factor -would scale everything. This was especially problematic in plug-in editors. - - -Change ------- -Removed the setSecurityFlags() method from the Windows implementation of -WebInputStream as it disabled HTTPS security features. - -Possible Issues ---------------- -Any code previously relying on connections to insecure webpages succeeding will -no longer work. - -Workaround ----------- -Check network connectivity on Windows and re-write any code that relied on -insecure connections. - -Rationale ---------- -The previous behaviour resulted in network connections on Windows having all -the HTTPS security features disabled, exposing users to network attacks. HTTPS -connections on Windows are now secure and will fail when connecting to an -insecure web address. - - -Change ------- -Pointer arithmetic on a pointer will have the same result regardless if it is -wrapped in JUCE's Atomic class or not. - -Possible Issues ---------------- -Any code using pointer arithmetic on Atomic will now have a different -result leading to undefined behaviour or crashes. - -Workaround ----------- -Re-write your code in a way that it does not depend on your pointer being -wrapped in JUCE's Atomic or not. See rationale. - -Rationale ---------- -Before this change, pointer arithmetic with JUCE's Atomic type would yield -confusing results. For example, the following code would assert before this -change: - -int* a; Atomic b; - -jassert (++a == ++b); - -Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's -Atomic always advances it's underlying pointer by a single byte. The same is -true for operator+=/operator-= and operator--. The difference in behaviour is -confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with -std::atomic. - - -Version 4.3.1 -============= - -Change ------- -JUCE has changed the way native VST3/AudioUnit parameter ids are calculated. - -Possible Issues ---------------- -DAW projects with automation data written by an AudioUnit or VST3 plug-in built -with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit -or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using -JUCE_FORCE_USE_LEGACY_PARAM_IDS are not affected. - -Workaround ----------- -Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the -juce_audio_plugin_client module config page in the Projucer. For new plug-ins, -be sure to use the default value for this property. - -Rationale --------- -JUCE needs to convert between its own JUCE parameter id format (strings) to the -native parameter id formats of the various plug-in backends. For VST3 and -AudioUnits, JUCE uses a hash function to generate a numeric id. However, some -VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any -parameters that have a negative parameter id. Therefore, the hash function for -VST3/AudioUnits needed to be changed to only return positive-valued hashes. - - -Version 4.3.0 -============= - -Change ------- -A revised multi-bus API was released which supersedes the previously flawed -multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive). - -Possible Issues ---------------- -If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive), -then you will need to update your plug-in to the new multi-bus API. Pre JUCE -4.0.0 plug-ins are not affected apart from other breaking changes listed in -this document. - -Woraround ---------- -None. - -Rationale --------- -A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version -4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE -4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API -compatibility. However, the new multi-bus API is not compatible with the flawed -multi-bus API (JUCE version 4.0.0 - 4.2.4). - - -Change ------- -JUCE now generates the AAX plug-in bus layout configuration id independent from -the position as it appears in the Projucer’s legacy "Channel layout -configuration" field. - -Possible Issues ---------------- -ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may -load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0 -versions of JUCE. - -Workaround ----------- -Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually -override which AAX plug-in id is associated to a specific bus layout of your -plug-in. This workaround is only necessary if you have released your plug-in -built with a version previous to JUCE 4.3.0. - -Rationale --------- -The new multi-bus API offers more features, flexibility and accuracy in -specifying bus layouts which cannot be expressed by the Projucer’s legacy -"Channel layout configuration" field. The native plug-in format backends use -the new multi-bus callback APIs to negotiate channel layouts with the host - -including the AAX plug-in ids assigned to specific bus layouts. With the -callback API, there is no notion of an order in which the channel -configurations appear - as was the case with the legacy "Channel layout -configuration" field - and therefore cannot be used to generate the AAX plug-in -id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does -transparently convert the legacy "Channel layout configuration" field to the -new callback based multi-bus API, but this does not take the order into account -in which the channel configurations appear in the legacy "Channel layout -configuration" field. - - -Version 4.2.1 -============= - -Change ------- -JUCE now uses the paramID property used in AudioProcessorParameterWithID to -uniquely identify parameters to the host. - -Possible Issues ---------------- -DAW projects with automation data written by an audio plug-in built with pre -JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with -JUCE 4.2.1 and later. - -Workaround ----------- -Enable JUCE_FORCE_USE_LEGACY_PARAM_IDS in the juce_audio_plugin_client module config -page in the Projucer. For new plug-ins, be sure to disable this property. - -Rationale --------- -Each parameter of the AudioProcessor has an id associated so that the plug-in’s -host can uniquely identify parameters. The id has a different data-type for -different plug-in types (for example VST uses integers, AAX uses string -identifiers). Before 4.2.1, JUCE generated the parameter id by using the index -of the parameter, i.e. the first parameter had id zero, the second parameter -had id one, etc. This caused problems for certain plug-in types where JUCE -needs to add internal parameters to the plug-in (for example VST3 requires the -bypass control to be a parameter - so JUCE automatically creates this parameter -for you in the VST3 backend). This causes subtle problems if a parameter is -added to an update of an already published plug-in. The new parameter’s id -would be identical to the id of the bypass parameter in old versions of your -plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade -their plug-in. - -Most plug-in backends differentiate between a parameter’s id an index, so this -distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s -unique id from the paramID property of AudioProcessorParameterWithID class. diff --git a/deps/juce/CMakeLists.txt b/deps/juce/CMakeLists.txt deleted file mode 100644 index 50637218..00000000 --- a/deps/juce/CMakeLists.txt +++ /dev/null @@ -1,156 +0,0 @@ -# ============================================================================== -# -# This file is part of the JUCE library. -# Copyright (c) 2020 - Raw Material Software Limited -# -# JUCE is an open source library subject to commercial or open-source -# licensing. -# -# By using JUCE, you agree to the terms of both the JUCE 6 End-User License -# Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020). -# -# End User License Agreement: www.juce.com/juce-6-licence -# Privacy Policy: www.juce.com/juce-privacy-policy -# -# Or: You may also use this code under the terms of the GPL v3 (see -# www.gnu.org/licenses). -# -# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER -# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE -# DISCLAIMED. -# -# ============================================================================== - -cmake_minimum_required(VERSION 3.15) - -project(JUCE VERSION 6.1.2 LANGUAGES C CXX) - -include(CMakeDependentOption) - -set_property(GLOBAL PROPERTY USE_FOLDERS YES) - -set(JUCE_MODULES_DIR "${JUCE_SOURCE_DIR}/modules" CACHE INTERNAL - "The path to JUCE modules") - -# This option will disable most of the JUCE helper functions and tools. This option exists to -# facilitate existing CMake builds which handle things like bundle creation, icons, plists, and -# binary data independently of JUCE. This option is not recommended - use at your own risk! - -option(JUCE_MODULES_ONLY "Only configure the JUCE modules" OFF) - -include(extras/Build/CMake/JUCEModuleSupport.cmake) - -# This option controls whether dummy targets are added to the build, where these targets contain all -# of the source files for each JUCE module. If you're planning to use an IDE and want to be able to -# browse all of JUCE's source files, this may be useful. However, it will increase the size of -# generated IDE projects and might slow down configuration a bit. If you enable this, you should -# probably also add `set_property(GLOBAL PROPERTY USE_FOLDERS YES)` to your top level CMakeLists, -# otherwise the module sources will be added directly to the top level of the project, instead of in -# a nice 'Modules' subfolder. - -cmake_dependent_option(JUCE_ENABLE_MODULE_SOURCE_GROUPS - "Show all module sources in IDE projects" OFF - "NOT JUCE_MODULES_ONLY" OFF) - -add_subdirectory(modules) - -if(JUCE_MODULES_ONLY) - return() -endif() - -include(extras/Build/CMake/JUCEUtils.cmake) - -set_directory_properties(PROPERTIES - JUCE_COMPANY_NAME "JUCE" - JUCE_COMPANY_WEBSITE "juce.com" - JUCE_COMPANY_EMAIL "info@juce.com" - JUCE_COMPANY_COPYRIGHT "Copyright (c) 2020 - Raw Material Software Limited") - -option(JUCE_COPY_PLUGIN_AFTER_BUILD - "Whether or not plugins should be installed to the system after building" OFF) -set_property(GLOBAL PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD ${JUCE_COPY_PLUGIN_AFTER_BUILD}) - -set(CMAKE_CXX_EXTENSIONS FALSE) - -juce_disable_default_flags() - -add_subdirectory(extras/Build) - -# If you want to build the JUCE examples with VST2/AAX support, you'll need to make the VST2/AAX -# headers visible to the juce_audio_processors module. You can either set the paths on the command -# line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE examples, or -# you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after importing JUCE. - -if(JUCE_GLOBAL_AAX_SDK_PATH) - juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}") -endif() - -if(JUCE_GLOBAL_VST2_SDK_PATH) - juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}") -endif() - -# We don't build anything other than the juceaide by default, because we want to keep configuration -# speedy and the number of targets low. If you want to add targets for the extra projects and -# example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or -# -DJUCE_BUILD_EXTRAS=ON when initially generating your build tree. - -option(JUCE_BUILD_EXTRAS "Add build targets for the Projucer and other tools" OFF) - -if(JUCE_BUILD_EXTRAS) - add_subdirectory(extras) -endif() - -option(JUCE_BUILD_EXAMPLES "Add build targets for the DemoRunner and PIPs" OFF) - -if(JUCE_BUILD_EXAMPLES) - add_subdirectory(examples) -endif() - -# ================================================================================================== -# Install configuration - -if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.14") - set(extra_version_arg ARCH_INDEPENDENT) -endif() - -include(CMakePackageConfigHelpers) -write_basic_package_version_file("${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" - VERSION ${JUCE_VERSION} - COMPATIBILITY ExactVersion - ${extra_version_arg}) - -set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING - "The location, relative to the install prefix, where the JUCE config file will be installed") - -set(JUCE_MODULE_PATH "include/JUCE-${JUCE_VERSION}/modules") -set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}") -set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}") -configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in" - "${JUCE_BINARY_DIR}/JUCEConfig.cmake" - PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH - INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}") - -set(JUCE_MODULE_PATH "${JUCE_MODULES_DIR}") -set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake") -get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION) -configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in" - "${JUCE_BINARY_DIR}/JUCEExportConfig.cmake" - PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH - INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}" - INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - -install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake" - "${JUCE_BINARY_DIR}/JUCEConfig.cmake" - "${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake" - "${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake" - "${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake" - "${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake" - "${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard" - "${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in" - "${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in" - "${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in" - "${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib" - "${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in" - "${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake" - "${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp" - DESTINATION "${JUCE_INSTALL_DESTINATION}") diff --git a/deps/juce/ChangeList.txt b/deps/juce/ChangeList.txt deleted file mode 100644 index 1c2031b6..00000000 --- a/deps/juce/ChangeList.txt +++ /dev/null @@ -1,532 +0,0 @@ -== Major JUCE features and updates == - -This file just lists the more notable headline features. For more detailed info -about changes and bugfixes please see the git log and BREAKING-CHANGES.txt. - -Version 6.1.2 - - Fixed an OpenGL display refresh rate issue on macOS - - Improved the scaling behaviour of hosted VST3 plug-ins - - Improved accessibility support - -Version 6.1.1 - - Fixed a CMake installation issue - - Improved parameter value loading after plug-in restarts - - Fixed some problems with multi-line text layouts - - Added a fallback for modal native message boxes on Windows - - Fixed an issue setting OpenGL repaint events - - Improved accessibility support - -Version 6.1.0 - - Added accessibility support - - Enabled use of VST3 plug-in extensions - - Improved OpenGL function loading - - Updated to C++14 - - Added support for macOS Monterey and iOS 15 - - Added async versions of all modal functions - - Fixed some VST3 threading issues - - Added cross-platform-compatible VST3 UID hash - - Improved MinGW compatibility - - Fixed some issues with BufferingAudioReader - - Improved TextEditor repainting - - Added support for larger ASIO buffers - - Updated Android Oboe to 1.6.1 - - Improved modal dismissing - - Improved assertion handling on macOS ARM - -Version 6.0.8 - - Fixed a macOS graphics invalidation region issue - - Improved the handling of modal dialog dismissal - - Fixed audio glitching in CoreAudio before microphone permission is granted - - Improved AUv3 resizing and initialisation - - Fixed some string to double conversions - - Improved iOS split view behaviour - - Added Display::safeAreaInserts - - Improved assertion behaviour on macOS ARM - - Multiple resizing and display scaling fixes - - Added more information to audioProcessorChanged callbacks - - Fixed some DSP convolution issues - - Added host detection on macOS ARM - -Version 6.0.7 - - Fixed a macOS drawing issue - - Updated the DemoRunner bundle ID - -Version 6.0.6 - - Moved to the new CoreMIDI API on supported platforms - - Added support for the "New Build System" in Xcode - - Made the audio format readers more robust - - Improved the HiResTimer implementation - - Fixed a VST3 program parameter issue - - Updated to Oboe 1.5 on Android - -Version 6.0.5 - - Added more support for styling PopupMenus - - Fixed some race conditions in the IPC and name named pipe classes - - Implemented multiple FileChooser improvements - - Added compatibility with the latest Android SDK - - Prevented CoreAudio glitches before accepting audio access permissions - - Made reading MIDI and audio files more robust - -Version 6.0.4 - - Improved the Projucer update mechanism - - Fixed an AUv3 parameter normalisation issue - - Fixed WASAPI exclusive mode sample rate selection bug - - Fixed a Linux build issue when omitting ALSA - -Version 6.0.3 - - Fixed version numbers in project files - -Version 6.0.2 - - Added support for macOS 11 and arm64 - - Added Windows IAudioClient3 support for low latency audio drivers - - Added Windows and macOS precompiled header support in the Projucer - - Improved accessibility support in the macOS menu bar - - Fixed VST3 hosting for plug-ins requiring persistent DLL loads - - Updated macOS camera capture API - - Improved resave diffs in Projucer project files - - Fixed some Linux JACK issues - -Version 6.0.1 - - Fixed a bug in the Projucer GUI editor causing existing code to be overwritten - - Updated Android Oboe to 1.4.2 - - Bumped default Android Studio gradle and plugin versions to the latest - - Fixed some Android Oboe and OpenSL issues - - Fixed some Doxygen parsing issues - - Fixed MIDI input/output bus enablement in VST3 plug-ins - - Improved Windows Clang compatibility - - Fixed GCC 4.8 and 5.0 compatibility - - Fixed some VST3 build errors and warnings on Linux - - Fixed dynamically loaded X11 library names on Linux - - Fixed Projucer CLion exporter generated CMakeLists.txt - - Fixed drag and drop for non-DPI aware plug-ins on Windows - -Version 6.0.0 - - Added support for building JUCE projects with CMake - - Revamped the DSP module - - Added VST3 support on Linux - - Added support for the latest webview components on macOS/iOS and Windows - - Removed the sign-in requirement, app reporting and analytics from the Projucer - - Added support for running headlessly on Linux - - Bundled Oboe source in JUCE and made it the default audio device on Android - - Various Oboe stability improvements - - Various Projucer UI improvements - - Added HWNDComponent for embedding native HWNDs on Windows - - Added support for all camera names on macOS - - Added support for building with Clang on Windows - - Modified MidiMessageCollector to preallocate storage - - Modified AudioProcessorGraph to allow extracting nodes - - Refactored the APVTS parameter attachment classes and added a new ParameterAttachment class - - Added IPP FFT implementation - - Added all example plugins as internal nodes in AudioPluginHost project - - Removed JuceHeader requirement from Projucer projects - - Added support for legacy CC output events - - Added MidiBuffer::Iterator class compatible with C++11 range-for - - Added RangedDirectoryIterator class compatible with C++11 range-for - - Provided range-for comaptibility for String class - - Windows and Linux hiDPI scaling improvements - - Various bug-fixes, improvements and documentation updates - -Version 5.4.7 - - Fixed a macOS focus bug causing Components to not receive mouse events - - Fixed a potential NullPointerException in the Android IAP code - - Fixed an entitlements file generation bug in the Projucer - - Send VST2 audioMasterUpdateDisplay opcode on the message thread to fix some hosts not updating - - Fixed some build errors and warnings when using Clang on Windows - - Changed the default architecture specified in Linux Makefiles generated by the Projucer - -Version 5.4.6 - - Fixed compatibility with macOS versions below 10.11 - - Multiple thread safety improvements - - Added dynamic parameter and parameter group names - - Updated to the latest Android In-App Purchases API - - Improvements to the Windows message queue under high load - - Replaced WaitableEvent internals with std::condition_variable - - Fixed some macOS text alignment issues - -Version 5.4.5 - - Improved message queue performance on Linux - - Added missing lifecycle callbacks on Android Q - - Refactored the AudioBlock class - - Fixed APVTS parameter update recursion - - Updated Bela code to support latest release - - Fixed issues drawing italicised text on macOS - - Fixed broken back button behaviour on Android - - Added Bluetooth permissions settings needed for iOS 13.0+ to the Projucer - - Replaced select() calls with poll() - - Various bug-fixes, improvements and documentation updates - -Version 5.4.4 - - Improvements to floating point number printing - - Faster plug-in parameter indexing - - Added support for persisting attachements to MIDI devices - - Refactored Linux event loop handling - - Multiple C++ modernisation improvements to the API - - Added support for macOS 10.15 and iOS 13 - - Added support for Visual Studio 2019 - - Removed support for Visual Studio 2013 - -Version 5.4.3 - - Added a Visual Studio 2019 exporter to the Projucer - - Added options to configure macOS Hardened Runtime in the Projucer - - Fixed a potential memory corruption when drawing on macOS/iOS - - Fixed file drag and drop for Windows 8 - - Multiple DSP module enhancements - - Various bug-fixes, improvements and documentation updates - -Version 5.4.2 - - Restructured the low-level Android native code - - Added an ADSR envelope class - - AudioProcessorValueTreeState performance improvements - - Improved Xcode 10 support - - Improved VST3 hosting - - Windows hiDPI scaling enhancements - -Version 5.4.1 - - Fixed a VST2 compilation error in VS2013 - - Fixed some live-build compilation errors in the Projucer - - Fixed a bug in the Oversampling class - - Made MPESynthesiserVoice::noteOnTime public - - Fixed some bugs in the Unity plug-in wrapper - - Fixed some VS2015 compiler errors - -Version 5.4.0 - - macOS Mojave and iOS 12 support - - Windows hiDPI support - - Unity native plug-in support - - Microsoft BLE MIDI support - - Plug-in parameter groups - - Support for production-ready Android OBOE - - Video playback support on Android and iOS - - AudioProcessorValueTreeState improvements - - Support for Android Studio 3.2 - - Various bug-fixes, improvements and documentation updates - -Version 5.3.2 - - Removed the OSX 10.5 and 10.6 deployment target options from the Projucer and enabled more C++11 features across all platforms - - Replaced all usage of ScopedPointer with std::unique_ptr - - Added camera support for iOS and Android - - Fixed some issues using an UndoManager with an AudioProcessorValueTreeState - - Added MIDI input to IAA plug-ins - - Made multiple calls to MidiInput::openDevice share the same underlying win32 MIDI handle - - Added a config flag to juce_audio_processors for enabling LADSPA plugin hosting and enabled it in the AudioPluginHost - - Added a "plug-in can do" callback to the VSTCallbackHandler interface - - Fixed various undefined behavior in SIMDRegister - - Added the methods AudioBlock::copyTo/AudioBlock::copyFrom which facilitate copying to/from an AudioBuffer - - Added a lambda callback to OpenGLGraphicsContextCustomShader to allow custom set-up when the shader is activated - - Fixed a bug causing an unintentional menu item highlight disco party when using a popup menu in a plug-in's UI - - Marked as deprecated: String::empty, var::null, File::nonexistent, ValueTree::invalid and other problematic statically-initialised null values - -Version 5.3.1 - - Add Android and iOS support to AudioPluginHost - - Added support for Bela in the form of an AudioIODeviceType - - Add bypass support to both hosting and plug-in client code - - Added an isBoolean flag to APVTS parameters - - Re-worked plug-in wrappers to all use new parameter system via LegacyAudioParameter wrapper class - - Fixed an issue where opening the same midi device twice would cause a crash on Windows - - Deprecated MouseInputSource::hasMouseMovedSignificantlySincePressed() and replaced with more descriptive methods - - Added support for relative or special path symbolic links when compressing/uncompressing zip archives and creating/reading files - - Ensured that File::replaceInternal does not fail with ACL errors on Windows - - Merged-in some Ogg-Vorbis security fixes - - Fixed a bug which would prevent a SystemTrayIconComponent from creating a native popup window on macOS - - Various Android and iOS fixes - - Added a "PIP Creator" utility tool to the Projucer - - Added options for setting plugin categories and characteristics with MultiChoicePropertyComponent in the Projucer - - Fixed a Projucer bug where the OSX base SDK version was not being set - - Added a command-line option to use LF as linefeeds rather than CRLF in the Projucer cleanup tools - - Multiple documentation updates - -Version 5.3.0 - - Added support for Android OBOE (developer preview) - - Updated JUCE's MPE classes to comply with the new MMA-adopted specification - - Multiple documentation updates - - Restructured the examples and extras directories and updated all JUCE examples - - Multiple hosted parameter improvements - - Overhauled the GenericAudioProcessorEditor - - Added support for a subset of the Cockos VST extensions - - Added support for loading VST3 preset files - - Added boolean AudioProcessorParameters - - Added thread safe methods for getting and setting the AudioProcessorValueTreeState state - - Added customisable MacOS icons - -Version 5.2.1 - - Added native content sharing support for iOS and Android - - Added iOS and Android native file chooser support - - Implemented WebBrowserComponent on Android - - Added SystemStats::getDeviceManufacturer() - - Ensured that JUCE will always use the high-performance audio path on Android if the device supports it - - Added memory warning callbacks on iOS - - Refactored iOSAudioDevice to support multi-channel audio devices and improve the handling of sample rate changes from other apps - - Added SidePanel and BurgerMenu component classes - - Added PushNotifications support on OSX - - Added support for VST3 SDK 3.6.8 - - Added support for loading VST3 preset files - - Added higher-order ambisonics support - - Added thread safe methods for getting and setting the AudioProcessorValueTreeState state - - Cleanup and refactoring work on the AudioProcessorGraph and the audio plugin host demo - - Changed the default language standard for new projects from C++11 to C++14 and set all JUCE projects to use C++14 - - Made the ScopedPointer interface more compatible with std::unique_ptr - - Changed Windows projects to use dynamic runtime linking by default - - Added lambda callbacks to ListenerList, Slider, Button, Label, ComboBox and TextEditor - - Fixed the live-build engine on Windows - - Multiple DSP module fixes and features - - Multiple threading and undefined behaviour fixes and improvements - - Various graphics optimisations - - Multiple Projucer UI and UX improvements - - Various documentation tweaks and fixes - -Version 5.2.0 - - Added a CMake exporter to the Projucer - - JUCE analytics module - - Added support for push notifications on iOS and Android - - Added in-app purchase support for macOS - - Added a plugin binary copy step to the Visual Studio exporter - - Added an option to set the debug information format in the Visual Studio exporter - - Added a link-time optimisation option to all exporters - - Added support for adding asm files to Android projects - - Improved the reliability of the Projucer's live-build engine - - Added support for AUv2 Midi Effect plug-in hosting - - Added support for Atmos 7.0.2 and 7.1.2 Surround formats - - Added support for the OGG sub-format inside a WAV file - - Added support for querying the audio hardware on how many overruns/underruns occurred - - Implement Process::hide on mobile platforms - - Added support for multi-touch drag and drop - - Improved the performance of 3D rendering when multiple OpenGL contexts are used at the same time - - Tweaked the rate at which EdgeTable grows its internal storage, to improve performance rendering large and complex paths - -Version 5.1.2 - - Fixed multiple plugin-resizing bugs - - Added support for AUv3 MIDI and screen size negotiation - - Added support for Xcode 9 and iOS 11 - - Added an In-App Purchases module - - Added backwards compatible constexpr support - - Standalone plug-in improvements - - Better .jucer file change monitoring in the Projucer - - Increased the speed of AU parameter lookup - - Improved the Android thread management when dealing with web requests - - Better denormal support - - Plug-in parameters can be explicitly marked as continuous or discrete - - Multiple documentation updates - -Version 5.1.1 - - Fixed Windows live build engine on Visual Studio 2017 - - Fixed a compiler error in juce_MathFunctions.h in Visual Studio 2013 - - Fixed a potential crash when using the ProcessorDuplicator - - Fixed a compiler-error in Filter::IIR - - Fixed an issue where the WavFileFormatWriter could not create files with discrete channels - - Fixed an issue where a window which is beneath a hidden window would not receive any clicks on Linux - - Altered the format of BREAKING-CHANGES.txt to display better on GitHub - - Projucer: Fixed an issue in exporter tilde expansion - - Fixed compiler errors when building the DSP module with a static version of FFTW - - Fixed an audio glitch when bypassing the convolution engine - - Fixed an issue where a JUCE VST2 would not correctly report that it supports resizing of it’s plugin editor - - Various documentation tweaks and fixes - -Version 5.1.0 - - Release of the JUCE DSP module - - Multichannel audio readers and writers - - Plugin editor Hi-DPI scaling support - - Major improvements to Projucer module search paths - - Added Projucer support for iOS app groups - - Added support for AVFoundation and deprecated the use of Quicktime - - Added a new real-time audio thread priority for Android - - Various Projucer UI fixes - - Various documentation fixes - - Various minor improvements and bug fixes - -Version 5.0.2 - - Improved project save speed in the Projucer - - Added option to save individual exporters in the Projucer - - Added the ability to create custom colour schemes for the Projucer’s code editor - - Minor fixes to JUCE’s SVG parser - - Various bug fixes in the way JUCE handles Hi-DPI monitors - - Improved code browsing in Visual Studio Exports - - Improved the handling of audio device buffer size changes on iOS - - Fixed bug in the Win32 FileChooser dialog when selecting a nonexistent root drive - - Fixed a Projucer crash when saving projects with no targets - - Fixed a bug where Projucer generated Makefiles would not trigger a recompilation when header files had changed - - The standalone plugin target is now compatible with effect plug-ins - - Fixed an issue where it was not possible to use the live build engine on plugin projects - - Improved the way the Projucer’s live-build engine searches for platform headers on Windows - - Fixed an issue where the Projucer would complain about not having internet even if the user had a license - - Fixed a use-after-free in the AUv3 wrapper - - Fixed an issue where the channel layout would not be reported correctly in the AUv3 wrapper - - Fixed a potential memory overrun issue when hosting VST2 plugins with more than eight channels - - Fixed a problem with the Mac main menu bar showing menus in the wrong position - - Various Projucer UI fixes - - Various documentation fixes - - Various minor improvements and bug fixes - -Version 5.0.1 - - Fixed Windows live build engine on Visual Studio 2017 - - Fixed memory-leak in Projucer live build engine - - Fixed an issue where you could not paste your redeem serial number with Cmd+V on macOS - - Fixed an issue where the Projucer would crash on linux due to missing symbols in WebKit - - Minor Projucer UI improvements - - Various minor improvements and bug fixes - -Version 5.0.0 - - New licensing model - - Projucer UI/UX overhaul - - New look and feel (version 4) - - New standalone plug-in format - - Added support for Visual Studio 2017 - - Added support for VST3 SDK 3.6.7 - - Added support for Apple Inter-App Audio on iOS - - Various Android stability and performance improvements - - Added support for non-experimental gradle plug-in versions >= 2.2 and Android Studio 2.3 - - Added support for closed-source third-party modules - - Added support for Windows 10 Bluetooth LE MIDI devices - - Modernised JUCE codebase to use C++11/14 features - - Added support for Linux embedded platforms - - Added support for WebBrowserComponent on Linux - - Added support for IPv6 - - Various minor improvements and bug fixes - - Various documentation improvements - -Version 4.3.1 - - Added support for iOS download tasks - - Added support for AAX plug-in meters - - Added support for dynamically disabling/enabling sidechains in ProTools - - Re-introduced support for VST3 plug-ins reporting which VST2 plug-in they can replace - - Added withRightX and withBottomY methods to Rectangle - - Added support for windows 10 on screen keyboard - - Added move semantics to AudioBuffer - - Added colour coding scheme to module icons in the Projucer to indicate which type of license a module uses - - Removed all deprecation warnings for macOS Sierra - - Fixed multiple touch, pen and mouse input related bugs on Windows - - Added submenu support to ComboBoxes and simplified the usage of ComboBoxes - - Various minor improvements and bug fixes - - Various documentation improvements - -Version 4.3.0 - - Added API and examples for ROLI Blocks - - Multiple Projucer live-build UI and diagnostics improvements - - JUCE now supports hosting multi-bus plug-ins - - BufferingAudioSource now supports pre-buffering (useful for offline processing) - - Added microphone permissions switch to Projucer for iOS targets - - Standalone wrappers now correctly save and restore midi settings - - Various performance improvements to BigInteger - - Fixed various FlexBox bugs - - Added a workaround for the broken “Open Recent…†menu on os x - - Various minor improvements and bug fixes - - Various documentation improvements - -Version 4.2.4 - - Pre-release of live build engine on Windows - - Added FlexBox layout engine - - Removed dependency on external Steinberg SDK when building and/or hosting VST2 plug-ins - - Added support for MIDI network sessions in the iOS simulator - - Added support for symmetric skew to Slider, NormalisableRange and SliderPropertyComponent - - Projucer now asks the user what to do when it detects that the .jucer file was modified outside of the Projucer - - Improved support for Windows 10 touch devices - - Added begin/end iterator methods for ValueTree, for handy range-based-for loops over its children - - Added support for recent mingw-w64 compilers - - Added useful proportional Rectangle utility methods - - Significantly improved the performance of BigInteger - - Added support for expiring licenses to juce_tracktion_marketplace - - Added support for retina mouse cursors on OS X - - Added a new low-quality mode for the CameraDevice - - Added pkg-config support for Linux - - Projucer will now wrap your AAX plug-in in the bundle format expected Pro Tools on Windows - - Multiple bug-fixes for AudioUnit parameter ids - - Fixed a bug where AlertWindows weren’t always on top - - Multiple fixes for web InputStreams - - Various improvements to the live build engine - - Various minor improvements and bug fixes - - Various documentation improvements - -Version 4.2.3 - - Various VST3 improvements: resizing VST3 windows, plug-in compatibility issues - - Use NSURLSession on newer OS X versions - - Add compatibility for VST 3 SDK update 3.6.6 - - Miscellaneous fixes and improvements - -Version 4.2.1 - - New class CachedValue, for providing easy and efficient access to ValueTree properties - - Reduced audio plug-in binary sizes on OS X and added symbol-stripping option - - Miscellaneous fixes and improvements - -Version 4.2 - - Added support for AudioUnit v3 on OS X and iOS - - Simplified the JUCE module format. Removed the json module definition files, and made - it easier to manually add modules to projects. The format is fully described in the - document juce/modules/JUCE Module Format.txt - - iOS project support: added custom resource folders, custom xcassets, app capabilities, - and screen orientation settings. - - Deleted the Introjucer.. But don't panic! All of its functionality is now supplied by a - more open-source version of the Projucer. By refactoring the closed-source LLVM compilation - code into a DLL, we've been able to unify the Introjucer and Projucer into a single - open-source project. This will allow everyone to compile the Projucer's IDE themselves, and - having just one app instead of two will make things a lot less confusing! - -Version 4.1 - - Added multi-bus support for audio plug-in clients - - Added support for MIDI effect plug-ins (AU and AAX). - - Added new example: Network Graphics Demo - -Version 4.0.3 - - Added MPE (Multidimensional Polyphonic Expression) classes - - Added full support for generating and parsing Midi RPN/NRPN messages - - Made the LinearSmoothedValue class public - - Miscellaneous fixes and minor improvements - -Version 4.0.2 - - Miscellaneous fixes and house-keeping - -Version 4.0.1 - - Initial release of the Projucer! - - Full OSC support! - - Android Studio exporting from the Introjucer - - Android-M pro-audio low-latency i/o support - - Bluetooth MIDI device support on iOS and Android - - AudioSampleBuffer refactored into a templated class AudioBuffer, to allow - 32 or 64 bit float support - - Audio plugin and hosting now supports 64-bit data - - Support for force-touch and pen pressure on iOS and Windows - - Added easy sound-file playing methods to AudioDeviceManager - - Many updates to Introjucer - - Many new tutorials and examples - -Version 3.3.0 - - New functions for Base64 conversion - - New command-line options in the introjucer for trimming whitespace and - replacing tabs in source files - -Version 3.2.0 - - Major OpenGL performance/stability improvements - - Performance improvements to FloatVectorOperations math functions - - New FloatVectorOperations: abs, min, max, addWithMultiply, clip - - Midi channel pressure support - - New example projects ComponentTutorialExample, SimpleFFTExample, - PluckedStringsDemo - - New class ValueTreeSynchroniser, for remote-syncing multiple - ValueTrees - - HTTPS/SSL support on Linux - - Added methods for degrees to radians conversions - - Added Neon instruction set support for Android targets - - JUCE ValueTree performance improvements - - Linux and Android multi-monitor HiDPI support - - Support the “display=none†attribute in SVG files - - Support for text elements in SVG files - - Added Whirlpool hash class to the cryptography module - - Various improvements for parameter automation in VST, VST-3, - AudioUnits and AAX - - Various improvements to JUCE Synthesiser - - Linux Code::Blocks project support - - Multicast support - - Add support to generate project version numbers from project git tags - - Various updates to example projects - - Stability improvements to re-order and resize code of plug-in windows - - Support for external third-party native libraries on Android - - Introjucer’s auto-update now displays release notes - - Various Introjucer usability improvements - - Support for in-memory fonts on Android - - New FFT class - - WASAPI exclusive mode support - - More C++11 feature support macros - - Performance improvements to XML parsing - - Add compatibility for AAX SDK 2.2.0 - - Added parameters to the ValueTree::Listener::valueTreeChildRemoved() - and valueTreeChildOrderChanged() methods to include more info about - exactly what changed - - Over 400 minor changes, bug-fixes, documentation improvements, etc. diff --git a/deps/juce/LICENSE.md b/deps/juce/LICENSE.md deleted file mode 100644 index 75e59b30..00000000 --- a/deps/juce/LICENSE.md +++ /dev/null @@ -1,36 +0,0 @@ -# The JUCE Library - -**BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE -TO THE [JUCE 6 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-6-licence) -AND THE [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy), WHICH -ARE BINDING AGREEMENTS BETWEEN YOU AND RAW MATERIAL SOFTWARE LIMITED. IF YOU DO -NOT AGREE TO THE TERMS, DO NOT USE THE JUCE LIBRARY.** - -JUCE has tier-leveled license terms, with different terms for each available -license: JUCE Personal (for developers or startup businesses with revenue under -the 50K USD Revenue Limit; free), JUCE Indie (for small businesses with under -500K USD Revenue Limit; $40/month), JUCE Pro (no Revenue Limit; $130/month), -and JUCE Educational (no Revenue Limit; free for bona fide educational -institutions). All licenses allow you to commercially release applications as -long as you do not exceed the Revenue Limit and pay the applicable Fees. Once -your business hits the Revenue Limit for your JUCE license tier, to continue -distributing your Applications you will either have to upgrade your JUCE -license, or instead release your Applications under the -[GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html), -which means, amongst other things, that you must make the source code of your -Applications available. - -JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER -EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE, ARE DISCLAIMED. - -The juce_audio_basics, juce_audio_devices, juce_core and juce_events modules -are permissively licensed under the terms of the [ISC -license](http://www.isc.org/downloads/software-support-policy/isc-license). - -For more information, visit the website: -[www.juce.com](https://www.juce.com) - -FULL JUCE TERMS: -- [JUCE 6 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-6-licence) -- [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy) diff --git a/deps/juce/README.md b/deps/juce/README.md deleted file mode 100644 index 89bf552b..00000000 --- a/deps/juce/README.md +++ /dev/null @@ -1,96 +0,0 @@ -![alt text](https://assets.juce.com/juce/JUCE_banner_github.png "JUCE") - -JUCE is an open-source cross-platform C++ application framework for creating high quality -desktop and mobile applications, including VST, VST3, AU, AUv3, RTAS and AAX audio plug-ins. -JUCE can be easily integrated with existing projects via CMake, or can be used as a project -generation tool via the [Projucer](https://juce.com/discover/projucer), which supports -exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio, Code::Blocks -and Linux Makefiles as well as containing a source code editor. - -## Getting Started - -The JUCE repository contains a [master](https://github.com/juce-framework/JUCE/tree/master) -and [develop](https://github.com/juce-framework/JUCE/tree/develop) branch. The develop branch -contains the latest bugfixes and features and is periodically merged into the master -branch in stable [tagged releases](https://github.com/juce-framework/JUCE/releases) -(the latest release containing pre-built binaries can be also downloaded from the -[JUCE website](https://juce.com/get-juce)). - -JUCE projects can be managed with either the Projucer (JUCE's own project-configuration -tool) or with CMake. - -### The Projucer - -The repository doesn't contain a pre-built Projucer so you will need to build it -for your platform - Xcode, Visual Studio and Linux Makefile projects are located in -[extras/Projucer/Builds](/extras/Projucer/Builds) -(the minumum system requirements are listed in the __System Requirements__ section below). -The Projucer can then be used to create new JUCE projects, view tutorials and run examples. -It is also possible to include the JUCE modules source code in an existing project directly, -or build them into a static or dynamic library which can be linked into a project. - -For further help getting started, please refer to the JUCE -[documentation](https://juce.com/learn/documentation) and -[tutorials](https://juce.com/learn/tutorials). - -### CMake - -Version 3.15 or higher is required. To use CMake, you will need to install it, -either from your system package manager or from the [official download -page](https://cmake.org/download/). For comprehensive documentation on JUCE's -CMake API, see the [JUCE CMake documentation](/docs/CMake%20API.md). For -examples which may be useful as starting points for new CMake projects, see the -[CMake examples directory](/examples/CMake). - -#### Building Examples - -To use CMake to build the examples and extras bundled with JUCE, simply clone -JUCE and then run the following commands, replacing "DemoRunner" with the name -of the target you wish to build. - - cd /path/to/JUCE - cmake . -B cmake-build -DJUCE_BUILD_EXAMPLES=ON -DJUCE_BUILD_EXTRAS=ON - cmake --build cmake-build --target DemoRunner - -## Minimum System Requirements - -#### Building JUCE Projects - -- __macOS/iOS__: Xcode 9.2 (macOS 10.12.6) -- __Windows__: Windows 8.1 and Visual Studio 2015 Update 3 64-bit -- __Linux__: g++ 5.0 or Clang 3.4 (for a full list of dependencies, see -[here](/docs/Linux%20Dependencies.md)). -- __Android__: Android Studio on Windows, macOS or Linux - -#### Deployment Targets - -- __macOS__: macOS 10.7 -- __Windows__: Windows Vista -- __Linux__: Mainstream Linux distributions -- __iOS__: iOS 9.0 -- __Android__: Jelly Bean (API 16) - -## Contributing - -For bug reports and features requests, please visit the [JUCE Forum](https://forum.juce.com/) - -the JUCE developers are active there and will read every post and respond accordingly. When -submitting a bug report, please ensure that it follows the -[issue template](/.github/ISSUE_TEMPLATE.txt). -We don't accept third party GitHub pull requests directly due to copyright restrictions -but if you would like to contribute any changes please contact us. - -## License - -The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_core and juce_events) -are permissively licensed under the terms of the -[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/). -Other modules are covered by a -[GPL/Commercial license](https://www.gnu.org/licenses/gpl-3.0.en.html). - -There are multiple commercial licensing tiers for JUCE, with different terms for each: -- JUCE Personal (developers or startup businesses with revenue under 50K USD) - free -- JUCE Indie (small businesses with revenue under 500K USD) - $40/month -- JUCE Pro (no revenue limit) - $130/month -- JUCE Educational (no revenue limit) - free for bona fide educational institutes - -For full terms see [LICENSE.md](LICENSE.md). diff --git a/deps/juce/docs/Accessibility.md b/deps/juce/docs/Accessibility.md deleted file mode 100644 index e15970b4..00000000 --- a/deps/juce/docs/Accessibility.md +++ /dev/null @@ -1,48 +0,0 @@ -# JUCE Accessibility - -## What is supported? - -Currently JUCE supports VoiceOver on macOS and Narrator on Windows. The JUCE -accessibility API exposes the following to these clients: - - - Title, description, and help text for UI elements - - Programmatic access to UI elements and text - - Interaction with UI elements - - Full UI keyboard navigation - - Posting notifications to listening clients - -## Customising Behaviour - -By default any visible and enabled `Component` is accessible to screen reader -clients and exposes some basic information such as title, description, help -text and its position in the hierarchy of UI elements. - -The `setTitle()`, `setDescription()` and `setHelpText()` methods can be used -to customise the text that will be read out by accessibility clients when -interacting with UI elements and the `setExplicitFocusOrder()`, -`setFocusContainerType()` and `createFocusTraverser()` methods can be used to -control the parent/child relationships and the order of navigation between UI -elements. - -## Custom Components - -For further customisation of accessibility behaviours the `AccessibilityHandler` -class provides a unified API to the underlying native accessibility libraries. - -This class wraps a component with a given role specified by the -`AccessibilityRole` enum and takes a list of optional actions and interfaces to -provide programmatic access and control over the UI element. Its state is used -to convey further information to accessibility clients via the -`getCurrentState()` method. - -To implement the desired behaviours for a custom component, subclass -`AccessibilityHandler` and return an instance of this from the -`Component::createAccessibilityHandler()` method. - -## Further Reading - - - [NSAccessibility protocol](https://developer.apple.com/documentation/appkit/nsaccessibility?language=objc) - - [UI Automation for Win32 applications](https://docs.microsoft.com/en-us/windows/win32/winauto/entry-uiauto-win32) - - A talk giving an overview of this feature from ADC 2020 can be found on - YouTube at https://youtu.be/BqrEv4ApH3U - diff --git a/deps/juce/docs/CMake API.md b/deps/juce/docs/CMake API.md deleted file mode 100644 index ca4bbf03..00000000 --- a/deps/juce/docs/CMake API.md +++ /dev/null @@ -1,738 +0,0 @@ -# The JUCE CMake API - -## System Requirements - -- All project types require CMake 3.15 or higher. -- Android targets are not currently supported. -- WebView2 on Windows via JUCE_USE_WIN_WEBVIEW2 flag in juce_gui_extra is not currently supported. - -Most system package managers have packages for CMake, but we recommend using the most recent release -from https://cmake.org/download. You should always use a CMake that's newer than your build -toolchain, so that CMake can identify your build tools and understand how to invoke them. - -In addition to CMake you'll need a build toolchain for your platform, such as Xcode or MSVC. - -## Getting Started - -### Using `add_subdirectory` - -The simplest way to include JUCE in your project is to add JUCE as a -subdirectory of your project, and to include the line `add_subdirectory(JUCE)` -in your project CMakeLists.txt. This will make the JUCE targets and helper -functions available for use by your custom targets. - -### Using `find_package` - -To install JUCE globally on your system, you'll need to tell CMake where to -place the installed files. - - # Go to JUCE directory - cd /path/to/clone/JUCE - # Configure build with library components only - cmake -B cmake-build-install -DCMAKE_INSTALL_PREFIX=/path/to/JUCE/install - # Run the installation - cmake --build cmake-build-install --target install - -In your project which consumes JUCE, make sure the project CMakeLists.txt contains the line -`find_package(JUCE CONFIG REQUIRED)`. This will make the JUCE modules and CMake helper functions -available for use in the rest of your build. Then, run the build like so: - - # Go to project directory - cd /path/to/my/project - # Configure build, passing the JUCE install path you used earlier - cmake -B cmake-build -DCMAKE_PREFIX_PATH=/path/to/JUCE/install - # Build the project - cmake --build cmake-build - -### Example projects - -In the JUCE/examples/CMake directory, you'll find example projects for a GUI app, a console app, -and an audio plugin. You can simply copy one of these subdirectories out of the JUCE repo, add JUCE -as a submodule, and uncomment the call to `add_subdirectory` where indicated in the CMakeLists.txt. -Alternatively, if you've installed JUCE using a package manager or the CMake install target, you can -uncomment the call to `find_package`. - -Once your project is set up, you can generate a build tree for it in the normal way. To get started, -you might invoke CMake like this, from the new directory you created. - - cmake -Bbuild (-GgeneratorName) (-DJUCE_BUILD_EXTRAS=ON) (-DJUCE_BUILD_EXAMPLES=ON) - -This will create a build tree in a directory named 'build', using the CMakeLists in the current -working directory, using the default generator (makefiles on mac/linux, and the most recent Visual -Studio on Windows). You can choose a specific generator to use with the `-G` flag (call `cmake -G` -to see a full list of generators on your platform). If you included JUCE as a subdirectory, you can -enable the Extras and Examples targets by including the last two arguments (they're off by default). -There's quite a lot of example projects, and generating project files might take a bit longer when -these options are on, so you probably won't want to include them most of the time. - -Then, to build the project: - - cmake --build build (--target targetNameFromCMakeLists) (--config Release/Debug/...) - -This tells cmake to build the target named `targetNameFromCMakeLists`, in the specified -configuration, using the appropriate tool. Of course, if you generated makefiles or ninja files, you -could call `make` or `ninja` in the build directory. If you generated an IDE project, like an Xcode -or Visual Studio project, then you could open the generated project in your IDE. - -### Building for iOS - -To build for iOS, you'll need CMake 3.14 or higher. Using the Xcode generator is highly recommended, -as other generators may not automatically find the correct SDK for the iPhone simulator, and may -fail to run certain parts of the build, such as compiling icons and processing the app's plist. By -default, CMake will build for the same system that originally configured the project, so to enable -cross-compilation for iOS, a few extra flags must be passed to the initial CMake invocation: - - cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 - -Here we create a build tree in the directory named 'build-ios', using the Xcode generator. The -`-DCMAKE_SYSTEM_NAME=iOS` option tells CMake to enable cross-compiling for iOS. The -`-DCMAKE_OSX_DEPLOYMENT_TARGET=9.3` option sets the minimum deployment target (it applies to iOS -despite the 'OSX' in the variable name!). - -Once the project has generated, we can open it as normal in Xcode (look for the project file in the -build directory). Alternatively, to build from the command-line, we could run this command: - - cmake --build build-ios --target -- -sdk iphonesimulator - -Here, we're building the target named `` from the build tree in the directory -`build-ios`. All the arguments after `--` are ignored by CMake, and are passed through to the -underlying build tool. In this case, the build tool will be `xcodebuild` because we used the Xcode -generator above. We tell xcodebuild that we're building the app for the iOS simulator, which doesn't -require special code signing. - -If we wanted to build for a real device, we would need to pass some extra signing details to the -initial CMake configuration command: - - cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \ - -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="iPhone Developer" - -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=<10 character id> - -The `CODE_SIGN_IDENTITY` is the kind of certificate you want to use (iPhone Developer is appropriate -for development) and `DEVELOPMENT_TEAM` is the 10-character ID that can be found by opening the -Keychain Access app, finding your development certificate, and checking its 'Organizational Unit' -info field. - -When building the target, you may also need to tell Xcode that it can automatically update -provisioning profiles, which is achieved by passing the `-allowProvisioningUpdates` flag: - - cmake --build build-ios --target -- -allowProvisioningUpdates - -#### Archiving for iOS - -CMake's out-of-the-box archiving behaviour doesn't always work as expected, especially for targets -that depend on custom static libraries. Xcode may generate these libraries into a 'DerivedData' -directory, but then omit this directory from the library search paths later in the build. - -If the "Product -> Archive" action isn't working due to missing staticlibs, try setting the -`ARCHIVE_OUTPUT_DIRECTORY` property explicitly: - - set_target_properties(my_static_lib_target PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "./") - -Note that the static library produced by `juce_add_binary_data` automatically sets this property. - -### Building universal binaries for macOS - -Building universal binaries that will run on both arm64 and x86_64 can be achieved by -configuring the CMake project with `"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64"`. - -### Building with Clang on Windows - -Clang-cl (Clang with MSVC-like command-line) should work by default. If you are generating a Visual -Studio project, and have installed the LLVM package which is distributed with Visual Studio, then -you can configure a Clang-cl build by passing "-T ClangCL" on your configuration commandline. - -If you wish to use Clang with GNU-like command-line instead, you can pass -`-DCMAKE_CXX_COMPILER=clang++` and `-DCMAKE_C_COMPILER=clang` on your configuration commandline. -clang++ and clang must be on your `PATH` for this to work. Only more recent versions of CMake -support Clang's GNU-like command-line on Windows. CMake 3.12 is not supported, CMake 3.15 has -support, CMake 3.20 or higher is recommended. Note that CMake doesn't seem to automatically link a -runtime library when building in this configuration, but this can be remedied by setting the -`MSVC_RUNTIME_LIBRARY` property. See the [official -documentation](https://cmake.org/cmake/help/v3.15/prop_tgt/MSVC_RUNTIME_LIBRARY.html) of this -property for usage recommendations. - -### A note about compile definitions - -Module options and plugin options that would previously have been set in the Projucer can be set on -a target-by-target basis in CMake, via `target_compile_definitions`. To find the options exposed by -a particular module, check its module header for sections with the following structure: - - /** Config: NAME_OF_KEY - Docs go here... - */ - #ifndef NAME_OF_KEY - #define NAME_OF_KEY ... - #endif - -To override the default config option, use the following CMake code, replacing `` as -appropriate: - - target_compile_definitions(my_target PUBLIC NAME_OF_KEY=) - -The `JucePlugin_PreferredChannelConfig` preprocessor definition for plugins is difficult to specify -in a portable way due to its use of curly braces, which may be misinterpreted in Linux/Mac builds -using the Ninja/Makefile generators. It is recommended to avoid this option altogether, and to use -the newer buses API to specify the desired plugin inputs and outputs. - -## API Reference - -### Options - -These flags can be enabled or disabled to change the behaviour of parts of the JUCE build. - -These options would normally be configured by either: -- Supplying an option in the form `-DNAME_OF_OPTION=ON/OFF` to the initial CMake configuration call, - or -- Calling `set(NAME_OF_OPTION ON/OFF)` before including JUCE in your project via `add_subdirectory` - or `find_package`. - -#### `JUCE_BUILD_EXTRAS` - -This controls whether targets are added for the projects in the 'extras' folder, such as the -Projucer and AudioPluginHost. This is off by default, because you probably won't need these targets -if you've included JUCE in your own project. - -#### `JUCE_BUILD_EXAMPLES` - -This controls whether targets are added for the projects in the 'examples' folder, such as the -DemoRunner and PIPs. This is off by default, because you probably won't need these targets if you've -included JUCE in your own project. - -#### `JUCE_ENABLE_MODULE_SOURCE_GROUPS` - -This option will make module source files browsable in IDE projects. It has no effect in non-IDE -projects. This option is off by default, as it will increase the size of generated IDE projects and -might slow down configuration a bit. If you enable this, you should probably also add -`set_property(GLOBAL PROPERTY USE_FOLDERS YES)` to your top level CMakeLists as this is required for -source grouping to work. - -Source groupings are a little sensitive to the project layout. As such, you should always ensure -that the call to `juce_add_module` which adds a specific module happens *before* calling -`juce_add_*` to add any dependent targets. - -The modules will be placed in a group named "JUCE Modules" within the group for each target, -alongside the "Source Files" and "Header Files" groups. - -#### `JUCE_COPY_PLUGIN_AFTER_BUILD` - -Controls whether plugin targets should be installed to the system after building. Note that the -plugin folders may be protected, so the build may require elevated permissions in order for the -installation to work correctly, or you may need to adjust the permissions of the destination -folders. - -### Functions - -#### `juce_add_` - - juce_add_gui_app( [KEY value]...) - juce_add_console_app( [KEY value]...) - juce_add_plugin( [KEY value]...) - -`juce_add_gui_app` and `juce_add_console_app` add an executable target with name ``. -`juce_add_plugin` adds a 'shared code' static library target with name ``, along with extra -targets for each of the specified plugin formats. Each of these functions also takes a number of -optional arguments in the form of a `KEY` followed by one or more `value`s which can be used to set -additional attributes of the target. If these optional arguments aren't specified, their values will -fall back to sensible defaults. - -Each of these arguments adds a property to the resulting target in the form `JUCE_paramName`, where -`paramName` is one of the parameter keys below. For example, after a call to -`juce_add_gui_app(my_target PRODUCT_NAME "Target")`, the target `my_target` will have a property -named `JUCE_PRODUCT_NAME` with the value `"Target"`. After creating a target with one of these -commands, properties beginning with `JUCE_` can be _queried_, but changing their values might not -have any effect (or might even break things in unexpected ways!), so always pass JUCE target -attributes directly to these creation functions, rather than adding them later. - -- `PRODUCT_NAME` - - The name of the output built by this target, similar to CMake's `OUTPUT_NAME` property. If not - specified, this will default to the target name. - -- `VERSION` - - A version number string in the format "major.minor.bugfix". If not specified, the `VERSION` of - the project containing the target will be used instead. On Apple platforms, this is the - user-facing version string. This option corresponds to the `CFBundleShortVersionString` field in - the target's plist. - -- `BUILD_VERSION` - - A version number string in the format "major.minor.bugfix". If not specified, this will match - the `VERSION` of the target. On Apple platforms, this is the private version string used to - distinguish between App Store builds. This option corresponds to the `CFBundleVersion` field in - the target's plist. - -- `BUNDLE_ID` - - An identifier string in the form "com.yourcompany.productname" which should uniquely identify - this target. Mainly used for macOS builds. If not specified, a default will be generated using - the target's `COMPANY_NAME` and `PRODUCT_NAME`. - -- `MICROPHONE_PERMISSION_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an app's Info.plist. - -- `MICROPHONE_PERMISSION_TEXT` - - The text your app will display when it requests microphone permissions. - -- `CAMERA_PERMISSION_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an app's Info.plist. - -- `CAMERA_PERMISSION_TEXT` - - The text your app will display when it requests camera permissions. - -- `BLUETOOTH_PERMISSION_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an app's Info.plist. - -- `BLUETOOTH_PERMISSION_TEXT` - - The text your app will display when it requests bluetooth permissions. - -- `SEND_APPLE_EVENTS_PERMISSION_ENABLED` - - May be either TRUE or FALSE. Enable this to allow your app to send Apple events. - -- `SEND_APPLE_EVENTS_PERMISSION_TEXT` - - The text your app will display when it requests permission to send Apple events. - -- `FILE_SHARING_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. - -- `DOCUMENT_BROWSER_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. - -- `STATUS_BAR_HIDDEN` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. - - - `REQUIRES_FULL_SCREEN` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. - -- `BACKGROUND_AUDIO_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. - -- `BACKGROUND_BLE_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist. - -- `APP_GROUPS_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's entitlements. - -- `APP_GROUP_IDS` - - The app groups to which your iOS app belongs. These will be added to your app's entitlements. - -- `ICLOUD_PERMISSIONS_ENABLED` - - May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's entitlements. - -- `IPHONE_SCREEN_ORIENTATIONS` - - May be one or more of `UIInterfaceOrientationUnknown`, `UIInterfaceOrientationPortrait`, - `UIInterfaceOrientationPortraitUpsideDown`, `UIInterfaceOrientationLandscapeLeft`, or - `UIInterfaceOrientationLandscapeRight`. Adds appropriate entries to an iOS app's plist. - -- `IPAD_SCREEN_ORIENTATIONS` - - May be one or more of `UIInterfaceOrientationUnknown`, `UIInterfaceOrientationPortrait`, - `UIInterfaceOrientationPortraitUpsideDown`, `UIInterfaceOrientationLandscapeLeft`, or - `UIInterfaceOrientationLandscapeRight`. Adds appropriate entries to an iOS app's plist. - -- `LAUNCH_STORYBOARD_FILE` - - A custom launch storyboard file to use on iOS. If not supplied, a default storyboard will be - used. - -- `CUSTOM_XCASSETS_FOLDER` - - A path to an xcassets directory, containing icons and/or launch images for this target. If this - is specified, the ICON_BIG and ICON_SMALL arguments will not have an effect on iOS, and a launch - storyboard will not be used. - -- `TARGETED_DEVICE_FAMILY` - - Specifies the device families on which the product must be capable of running. Allowed values - are "1", "2", and "1,2"; these correspond to "iPhone/iPod touch", "iPad", and "iPhone/iPod and - iPad" respectively. This will default to "1,2", meaning that the target will target iPhone, - iPod, and iPad. - -- `ICON_BIG`, `ICON_SMALL` - - Paths to image files that will be used to generate app icons. If only one of these parameters - is specified, then that image will be used for all icon resolutions. If both arguments are - specified, then the appropriate image will be picked for each icon resolution. - -- `COMPANY_COPYRIGHT` - - Copyright text which will be added to the app/plugin's Info.plist. The value of this argument - will be inherited from the `JUCE_COMPANY_COPYRIGHT` property, so if you want to use the same - `COMPANY_COPYRIGHT` for several targets in a build tree, you can call - `set_directory_properties(PROPERTIES JUCE_COMPANY_COPYRIGHT ...)` after including JUCE but - before adding the targets, and then omit the `COMPANY_COPYRIGHT` argument when creating the - individual targets. - -- `COMPANY_NAME` - - The name of this target's author. Will be added to the app/plugin's Info.plist, and may be used - to generate part of the `BUNDLE_ID` if no ID was given explicitly. The value of this argument - will be inherited from the `JUCE_COMPANY_NAME` property, so if you want to use the same - `COMPANY_NAME` for several targets in a build tree, you can call - `set_directory_properties(PROPERTIES JUCE_COMPANY_NAME ...)` after including JUCE but before - adding the targets, and then omit the `COMPANY_NAME` argument when creating the individual - targets. - -- `COMPANY_WEBSITE` - - The address of a website related to this target in some way. The value of this argument will be - inherited from the `JUCE_COMPANY_WEBSITE` property, so if you want to use the same - `COMPANY_WEBSITE` for several targets in a build tree, you can call - `set_directory_properties(PROPERTIES JUCE_COMPANY_WEBSITE ...)` after including JUCE but before - adding the targets, and then omit the `COMPANY_WEBSITE` argument when creating the individual - targets. - -- `COMPANY_EMAIL` - - An email address for this target's author. The value of this argument will be inherited from the - `JUCE_COMPANY_EMAIL` property, so if you want to use the same `COMPANY_EMAIL` for several - targets in a build tree, you can call `set_directory_properties(PROPERTIES JUCE_COMPANY_EMAIL - ...)` after including JUCE but before adding the targets, and then omit the `COMPANY_EMAIL` - argument when creating the individual targets. - -- `DOCUMENT_EXTENSIONS` - - File extensions that should be associated with this target. For example, the Projucer passes - the string `jucer` because it wants to open `.jucer` files. If your target has several different - document types, you can pass them as multiple arguments, e.g. `DOCUMENT_EXTENSIONS wav mp3 aif`. - -- `NEEDS_CURL` - - On Linux, JUCE may or may not need to link to Curl depending on the compile definitions that are - set on a JUCE target. By default, we don't link Curl because you might not need it, but if you - get linker or include errors that reference Curl, just set this argument to `TRUE`. - -- `NEEDS_WEB_BROWSER` - - On Linux, JUCE may or may not need to link to Webkit depending on the compile definitions that - are set on a JUCE target. By default, we don't link Webkit because you might not need it, but - if you get linker or include errors that reference Webkit, just set this argument to `TRUE`. - -- `NEEDS_STORE_KIT` - - On macOS, JUCE may or may not need to link to StoreKit depending on the compile definitions that - are set on a JUCE target. By default, we don't link StoreKit because you might not need it, but - if you get linker or include errors that reference StoreKit, just set this argument to `TRUE`. - -- `PUSH_NOTIFICATIONS_ENABLED` - - Sets app entitlements to allow push notifications. False by default. - -- `NETWORK_MULTICAST_ENABLED` - - Sets app entitlements to allow IP multicast or broadcast on macOS/iOS. False by default. - -- `HARDENED_RUNTIME_ENABLED` - - Enables macOS' hardened runtime for this target. Required for notarisation. False by default. - -- `HARDENED_RUNTIME_OPTIONS` - - A set of space-separated entitlement keys that will be added to this target's entitlements - plist if `HARDENED_RUNTIME_ENABLED` is `TRUE`. Each key should be in the form - `com.apple.security.*` where `*` is a specific entitlement. - -- `APP_SANDBOX_ENABLED` - - Enables macOS' app sandbox for this target. False by default. - -- `APP_SANDBOX_INHERIT` - - Allows child processes to inherit the static entitlements of their parent process. If this - is set to `TRUE`, no other app sandbox entitlements will be set on this target. - -- `APP_SANDBOX_OPTIONS` - - A set of space-separated entitlement keys that will be added to this target's entitlements - plist if `APP_SANDBOX_ENABLED` is `TRUE`. Each key should be in the form `com.apple.security.*` - where `*` is a specific entitlement. - -- `PLIST_TO_MERGE` - - A string to insert into an app/plugin's Info.plist. - -- `FORMATS` - - For plugin targets, specifies the plugin targets to build. Should be provided as a - space-separated list. Valid values are `Standalone Unity VST3 AU AUv3 AAX VST`. `AU` and `AUv3` - plugins will only be enabled when building on macOS. It is an error to pass `AAX` or `VST` - without first calling `juce_set_aax_sdk_path` or `juce_set_vst2_sdk_path` respectively. - -- `PLUGIN_NAME` - - The name of the plugin. In a DAW environment, this is the name that will be displayed to the - user when they go to load a plugin. This name may differ from the name of the physical plugin - file (to set the name of the plugin file, use the `PRODUCT_NAME` option). If not specified, - the `PLUGIN_NAME` will default to match the `PRODUCT_NAME`. - -- `PLUGIN_MANUFACTURER_CODE` - - A four-character unique ID for your company. For AU compatibility, this must contain at least - one upper-case letter. GarageBand 10.3 requires the first letter to be upper-case, and the - remaining letters to be lower-case. - -- `PLUGIN_CODE` - - A four-character unique ID for your plugin. For AU compatibility, this must contain exactly one - upper-case letter. GarageBand 10.3 requires the first letter to be upper-case, and the remaining - letters to be lower-case. - -- `DESCRIPTION` - - A short description of your plugin. - -- `IS_SYNTH` - - Whether the plugin is a synth. Will be used to set sensible plugin category values if they - are not provided explicitly. - -- `NEEDS_MIDI_INPUT` - - Whether the plugin should provide a midi input. - -- `NEEDS_MIDI_OUTPUT` - - Whether the plugin should provide a midi output. - -- `IS_MIDI_EFFECT` - - Whether the plugin is a MIDI effect (some hosts provide a special channel-strip location for - MIDI effect plugins). - -- `EDITOR_WANTS_KEYBOARD_FOCUS` - - Whether the plugin requires keyboard focus, or should defer all keyboard handling to the host. - -- `DISABLE_AAX_BYPASS` - - Whether the AAX bypass function should be disabled. - -- `DISABLE_AAX_MULTI_MONO` - - Whether the AAX multi mono bus layout should be disabled. - -- `AAX_IDENTIFIER` - - The bundle ID for the AAX plugin target. Matches the `BUNDLE_ID` by default. - -- `VST_NUM_MIDI_INS` - - For VST2 and VST3 plugins that accept midi, this allows you to configure the number of inputs. - -- `VST_NUM_MIDI_OUTS` - - For VST2 and VST3 plugins that produce midi, this allows you to configure the number of outputs. - -- `VST2_CATEGORY` - - Should be one of: `kPlugCategUnknown`, `kPlugCategEffect`, `kPlugCategSynth`, - `kPlugCategAnalysis`, `kPlugCategMatering`, `kPlugCategSpacializer`, `kPlugCategRoomFx`, - `kPlugSurroundFx`, `kPlugCategRestoration`, `kPlugCategOfflineProcess`, `kPlugCategShell`, - `kPlugCategGenerator`. - -- `VST3_CATEGORIES` - - Should be one or more, separated by spaces, of the following: `Fx`, `Instrument`, `Analyzer`, - `Delay`, `Distortion`, `Drum`, `Dynamics`, `EQ`, `External`, `Filter`, `Generator`, `Mastering`, - `Modulation`, `Mono`, `Network`, `NoOfflineProcess`, `OnlyOfflineProcess`, `OnlyRT`, - `Pitch Shift`, `Restoration`, `Reverb`, `Sampler`, `Spatial`, `Stereo`, `Surround`, `Synth`, - `Tools`, `Up-Downmix` - -- `AU_MAIN_TYPE` - - Should be one of: `kAudioUnitType_Effect`, `kAudioUnitType_FormatConverter`, - `kAudioUnitType_Generator`, `kAudioUnitType_MIDIProcessor`, `kAudioUnitType_Mixer`, - `kAudioUnitType_MusicDevice`, `kAudioUnitType_MusicEffect`, `kAudioUnitType_OfflineEffect`, - `kAudioUnitType_Output`, `kAudioUnitType_Panner` - -- `AU_EXPORT_PREFIX` - - A prefix for the names of entry-point functions that your component exposes. Typically this - will be a version of your plugin's name that can be used as part of a C++ token. Defaults - to your plugin's name with the suffix 'AU'. - -- `AU_SANDBOX_SAFE` - - May be either TRUE or FALSE. Adds the appropriate entries to an AU plugin's Info.plist. - -- `SUPPRESS_AU_PLIST_RESOURCE_USAGE` - - May be either TRUE or FALSE. Defaults to FALSE. Set this to TRUE to disable the `resourceUsage` - key in the target's plist. This is useful for AU plugins that must access resources which cannot - be declared in the resourceUsage block, such as UNIX domain sockets. In particular, - PACE-protected AU plugins may require this option to be enabled in order for the plugin to load - in GarageBand. - -- `AAX_CATEGORY` - - Should be one or more of: `AAX_ePlugInCategory_None`, `AAX_ePlugInCategory_EQ`, - `AAX_ePlugInCategory_Dynamics`, `AAX_ePlugInCategory_PitchShift`, `AAX_ePlugInCategory_Reverb`, - `AAX_ePlugInCategory_Delay`, `AAX_ePlugInCategory_Modulation`, `AAX_ePlugInCategory_Harmonic`, - `AAX_ePlugInCategory_NoiseReduction`, `AAX_ePlugInCategory_Dither`, - `AAX_ePlugInCategory_SoundField`, `AAX_ePlugInCategory_HWGenerators`, - `AAX_ePlugInCategory_SWGenerators`, `AAX_ePlugInCategory_WrappedPlugin`, - `AAX_ePlugInCategory_Effect` - -- `PLUGINHOST_AU` - - May be either TRUE or FALSE (defaults to FALSE). If TRUE, will add the preprocessor definition - `JUCE_PLUGINHOST_AU=1` to the new target, and will link the macOS frameworks necessary for - hosting plugins. Using this parameter should be preferred over using - `target_compile_definitions` to manually set the `JUCE_PLUGINHOST_AU` preprocessor definition. - -- `USE_LEGACY_COMPATIBILITY_PLUGIN_CODE` - - May be either TRUE or FALSE (defaults to FALSE). If TRUE, will override the value of the - preprocessor definition "JucePlugin_ManufacturerCode" with the hex equivalent of "proj". This - option exists to maintain compatiblity with a previous, buggy version of JUCE's CMake support - which mishandled the manufacturer code property. Most projects should leave this option set to - its default value. - -- `COPY_PLUGIN_AFTER_BUILD` - - Whether or not to install the plugin to the current system after building. False by default. - If you want all of the plugins in a subdirectory to be installed automatically after building, - you can set the property `JUCE_COPY_PLUGIN_AFTER_BUILD` on the directory before adding the - plugins, rather than setting this argument on each individual target. Note that on Windows, - the default install locations may not be writable by normal user accounts. - -- `VST_COPY_DIR` - - The location to which VST2 (legacy) plugins will be copied after building if - `COPY_PLUGIN_AFTER_BUILD` is set on this target. If you want to install all of the VST2 plugins - in a subdirectory to a non-default location, you can set the `JUCE_VST_COPY_DIR` property on - the directory before adding the plugin targets, rather than setting this argument on each - individual target. - -- `VST3_COPY_DIR` - - The location to which VST3 plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` - is set on this target. If you want to install all of the VST3 plugins in a subdirectory to a - non-default location, you can set the `JUCE_VST3_COPY_DIR` property on the directory before - adding the plugin targets, rather than setting this argument on each individual target. - -- `AAX_COPY_DIR` - - The location to which AAX plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` - is set on this target. If you want to install all of the AAX plugins in a subdirectory to a - non-default location, you can set the `JUCE_AAX_COPY_DIR` property on the directory before - adding the plugin targets, rather than setting this argument on each individual target. - -- `AU_COPY_DIR` - - The location to which AU plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` - is set on this target. If you want to install all of the AU plugins in a subdirectory to a - non-default location, you can set the `JUCE_AU_COPY_DIR` property on the directory before - adding the plugin targets, rather than setting this argument on each individual target. - -- `UNITY_COPY_DIR` - - The location to which Unity plugins will be copied after building if `COPY_PLUGIN_AFTER_BUILD` - is set on this target. If you want to install all of the Unity plugins in a subdirectory to a - non-default location, you can set the `JUCE_UNITY_COPY_DIR` property on the directory before - adding the plugin targets, rather than setting this argument on each individual target. - Unlike the other `COPY_DIR` arguments, this argument does not have a default value so be sure - to set it if you have enabled `COPY_PLUGIN_AFTER_BUILD` and the `Unity` format. - -#### `juce_add_binary_data` - - juce_add_binary_data( - [HEADER_NAME ...] - [NAMESPACE ...] - SOURCES ...) - -Create a static library that embeds the contents of the files passed as arguments to this function. -Adds a library target called `` which can be linked into other targets using -`target_link_libraries`. - -The `HEADER_NAME` argument is optional. If provided, the generated header will be given the -requested name, otherwise the generated header will be named "BinaryData.h". In completely new -projects, you should provide a unique name here, so that projects containing more than one binary -data target are able to include the binary data headers without ambiguity. - -The `NAMESPACE` argument is also optional. If not provided, the generated files will use the default -namespace `BinaryData`. Each of the files located at the paths following `SOURCES` will be encoded -and embedded in the resulting static library. This library can be linked as normal using -`target_link_libraries( PRIVATE )`, and the header can be included using -`#include `. - -#### `juce_add_bundle_resources_directory` - - juce_add_bundle_resources_directory( ) - -Copy the entire directory at the location `` into an Apple bundle's resource directory, i.e. -the `Resources` directory for a macOS bundle, and the top-level directory of an iOS bundle. - -#### `juce_generate_juce_header` - - juce_generate_juce_header() - -Introspects the JUCE modules that have been linked to `` and generates a `JuceHeader.h` -which contains `#include` statements for each of the module headers. This header also contains an -optional `using namespace juce` statement, and an optional `ProjectInfo` block, each of which can be -disabled by setting the compile definitions `DONT_SET_USING_JUCE_NAMESPACE` and -`JUCE_DONT_DECLARE_PROJECTINFO` respectively. The resulting header can be included with `#include -`. In plain CMake projects which don't require Projucer compatibility, the use of -JuceHeader.h is optional. Instead, module headers can be included directly in source files that -require them. - -#### `juce_enable_copy_plugin_step` - - juce_enable_copy_plugin_step() - -As an alternative to the JUCE_COPY_PLUGIN_AFTER_BUILD property, you may call this function to -manually enable post-build copy on a plugin. The argument to this function should be a target -previously created with `juce_add_plugin`. - -JUCE_COPY_PLUGIN_AFTER_BUILD will cause plugins to be installed immediately after building. This is -not always appropriate, if extra build steps (such as signing or modifying the plugin bundle) must -be executed before the install. In such cases, you should leave JUCE_COPY_PLUGIN_AFTER_BUILD -disabled, use `add_custom_command(TARGET POST_BUILD)` to add your own post-build steps, and then -finally call `juce_enable_copy_plugin_step`. - -If your custom build steps need to use the location of the plugin artefact, you can extract this -by querying the property `JUCE_PLUGIN_ARTEFACT_FILE` on a plugin target (*not* the shared code -target!). - -#### `juce_set__sdk_path` - - juce_set_aax_sdk_path() - juce_set_vst2_sdk_path() - juce_set_vst3_sdk_path() - -Call these functions from your CMakeLists to set up your local AAX, VST2, and VST3 SDKs. These -functions should be called *before* adding any targets that may depend on the AAX/VST2/VST3 SDKs -(plugin hosts, AAX/VST2/VST3 plugins etc.). - -#### `juce_add_module` - - juce_add_module() - juce_add_modules(...) - -`juce_add_module` adds a library target for the JUCE module located at the provided path. `` -must be the path to a module directory (e.g. /Users/me/JUCE/modules/juce_core). This will add an -interface library with a name matching the directory name of the module. The resulting library can -be linked to other targets as normal, using `target_link_libraries`. - -Due to the way that `INTERFACE` libraries work in CMake, linking to a module added in this way -*must* be done using `PRIVATE` visibility. Using `PUBLIC` will cause the module sources to be added -both to the target's `SOURCES` and `INTERFACE_SOURCES`, which may result in many copies of the -module being built into a single target, which would cause build failures in the best case and -silent ODR violations in the worst case. Scary stuff! - -This command has a few optional arguments: `INSTALL_PATH` is a path, relative to the install prefix, -to which the module sources will be copied during installation of the module. ALIAS_NAMESPACE will -add an alias for the module target(s) with the provided namespace. For example, the following -invocation will add a module target named `my_module`, along with an alias named -`company::my_module`. ``` juce_add_module(my_module ALIAS_NAMESPACE company)` ``` - -`juce_add_modules` is a convenience function that can be used to add multiple JUCE modules at once. -This version accepts many module paths, rather than just one. For an example of usage, see the -CMakeLists in the `modules` directory. - -#### `juce_add_pip` - - juce_add_pip(
) - -This function parses the PIP metadata block in the provided header, and adds appropriate build -targets for a console app, GUI app, or audio plugin. For audio plugin targets, it builds as many -plugin formats as possible. To build AAX or VST2 targets, call `juce_set_aax_sdk_path` and/or -`juce_set_vst2_sdk_path` *before* calling `juce_add_pip`. - -This is mainly provided to build the built-in example projects in the JUCE repo, and for building -quick proof-of-concept demo apps with minimal set-up. For any use-case more complex than a -proof-of-concept, you should prefer the `juce_add_gui_app`, `juce_add_plugin`, or -`juce_add_console_app` functions, which provide more fine-grained control over the properties of -your target. - -#### `juce_disable_default_flags` - - juce_disable_default_flags() - -This function sets the `CMAKE__FLAGS_` to empty in the current directory and below, -allowing alternative optimisation/debug flags to be supplied without conflicting with the -CMake-supplied defaults. - -### Targets - -#### `juce::juce_recommended_warning_flags` - - target_link_libraries(myTarget PUBLIC juce::juce_recommended_warning_flags) - -This is a target which can be linked to other targets using `target_link_libraries`, in order to -enable the recommended JUCE warnings when building them. - -This target just sets compiler and linker flags, and doesn't have any associated libraries or -include directories. When building plugins, it's probably desirable to link this to the shared code -target with `PUBLIC` visibility, so that all the plugin wrappers inherit the same compile/link -flags. - -#### `juce::juce_recommended_config_flags` - - target_link_libraries(myTarget PUBLIC juce::juce_recommended_config_flags) - -This is a target which can be linked to other targets using `target_link_libraries`, in order to -enable the recommended JUCE optimisation and debug flags. - -This target just sets compiler and linker flags, and doesn't have any associated libraries or -include directories. When building plugins, it's probably desirable to link this to the shared code -target with `PUBLIC` visibility, so that all the plugin wrappers inherit the same compile/link -flags. - -#### `juce::juce_recommended_lto_flags` - - target_link_libraries(myTarget PUBLIC juce::juce_recommended_lto_flags) - -This is a target which can be linked to other targets using `target_link_libraries`, in order to -enable the recommended JUCE link time optimisation settings. - -This target just sets compiler and linker flags, and doesn't have any associated libraries or -include directories. When building plugins, it's probably desirable to link this to the shared code -target with `PUBLIC` visibility, so that all the plugin wrappers inherit the same compile/link -flags. - diff --git a/deps/juce/docs/JUCE Module Format.md b/deps/juce/docs/JUCE Module Format.md deleted file mode 100644 index c342b61d..00000000 --- a/deps/juce/docs/JUCE Module Format.md +++ /dev/null @@ -1,237 +0,0 @@ -# The JUCE Module Format - -A JUCE module is a collection of header and source files which can be added to a project -to provide a set of classes and libraries or related functionality. - -Their structure is designed to make it as simple as possible for modules to be added to -user projects on many platforms, either via automated tools, or by manual inclusion. - -Each module may have dependencies on other modules, but should be otherwise self-contained. - -## File structure - -Each module lives inside a folder whose name is the same as the name of the module. The -JUCE convention for naming modules is lower-case with underscores, e.g. - - juce_core - juce_events - juce_graphics - -But any name that is a valid C++ identifer is OK. - -Inside the root of this folder, there must be a set of public header and source files which -the user's' project will include. The module may have as many other internal source files as -it needs, but these must all be inside sub-folders! - - -### Master header file - -In this root folder there must be ONE master header file, which includes all the necessary -header files for the module. This header must have the same name as the module, with -a .h/.hpp/.hxx suffix. E.g. - - juce_core/juce_core.h - -IMPORTANT! All code within a module that includes other files from within its own subfolders -must do so using RELATIVE paths! -A module must be entirely relocatable on disk, and it must not rely on the user's project -having any kind of include path set up correctly for it to work. Even if the user has no -include paths whatsoever and includes the module's master header via an absolute path, -it must still correctly find all of its internally included sub-files. - -This master header file must also contain a comment with a BEGIN_JUCE_MODULE_DECLARATION -block which defines the module's requirements - the syntax for this is described later on.. - - -### Module CPP files - -A module consists of a single header file and zero or more .cpp files. Fewer is better! - -Ideally, a module could be header-only module, so that a project can use it by simply -including the master header file. - -For various reasons it's usually necessary or preferable to have a simpler header and -some .cpp files that the user's project should compile as stand-alone compile units. -In this case you should ideally provide just a single cpp file in the module's root -folder, and this should internally include all your other cpps from their sub-folders, -so that only a single cpp needs to be added to the user's project in order to completely -compile the module. - -In some cases (e.g. if your module internally relies on 3rd-party code which can't be -easily combined into a single compile-unit) then you may have more than one source file -here, but avoid this if possible, as it will add a burden for users who are manually -adding these files to their projects. - -The names of these source files must begin with the name of the module, but they can have -a number or other suffix if there is more than one. - -In order to specify that a source file should only be compiled on a specific platform, -then the filename can be suffixed with one of the following strings: - - _OSX - _Windows - _Linux - _Android - _iOS - -e.g. - - juce_mymodule/juce_mymodule_1.cpp <- compiled on all platforms - juce_mymodule/juce_mymodule_2.cpp <- compiled on all platforms - juce_mymodule/juce_mymodule_OSX.cpp <- compiled only on OSX - juce_mymodule/juce_mymodule_Windows.cpp <- compiled only on Windows - -Often this isn't necessary, as in most cases you can easily add checks inside the files -to do different things depending on the platform, but this may be handy just to avoid -clutter in user projects where files aren't needed. - -To simplify the use of obj-C++ there's also a special-case rule: If the folder contains -both a .mm and a .cpp file whose names are otherwise identical, then on OSX/iOS the .mm -will be used and the cpp ignored. (And vice-versa for other platforms, of course). - - -### Precompiled libraries - -Precompiled libraries can be included in a module by placing them in a libs/ subdirectory. -The following directories are automatically added to the library search paths, and libraries -placed in these directories can be linked with projects via the OSXLibs, iOSLibs, -windowsLibs, linuxLibs and mingwLibs keywords in the module declaration (see the following -section). - -- OS X - - libs/MacOSX - to support multiple architectures, you may place libraries built as universal - binaries at this location. For backwards compatibility, the Projucer will also include the - directories libs/MacOSX/{arch}, where {arch} is the architecture you are targeting in Xcode - ("x86_64" or "i386", for example). When building with CMake, only libraries built as universal - binaries are supported and the arch subfolders are ignored. - -- Visual Studio - - libs/VisualStudio{year}/{arch}/{run-time}, where {year} is the four digit year of the Visual Studio - release, arch is the target architecture in Visual Studio ("x64" or "Win32", for example), and - {runtime} is the type of the run-time library indicated by the corresponding compiler flag - ("MD", "MDd", "MT", "MTd"). - -- Linux - - libs/Linux/{arch}, where {arch} is the architecture you are targeting with the compiler. Some - common examples of {arch} are "x86_64", "i386" and "armv6". - -- MinGW - - libs/MinGW/{arch}, where {arch} can take the same values as Linux. - -- iOS - - libs/iOS - to support multiple architectures, you may place libraries built as universal - binaries at this location. For backwards compatibility, the Projucer will also include the - directories libs/iOS/{arch}, where {arch} is the architecture you are targeting in Xcode - ("arm64" or "x86_64", for example). When building with CMake, only libraries built as universal - binaries are supported and the arch subfolders are ignored. - -- Android - - libs/Android/{arch}, where {arch} is the architecture provided by the Android Studio variable - "${ANDROID_ABI}" ("x86", "armeabi-v7a", "mips", for example). - -## The BEGIN_JUCE_MODULE_DECLARATION block - -This block of text needs to go inside the module's main header file. It should be commented-out -and perhaps inside an `#if 0` block too, but the Introjucer will just scan the whole file for the -string BEGIN_JUCE_MODULE_DECLARATION, and doesn't care about its context in terms of C++ syntax. - -The block needs a corresponding END_JUCE_MODULE_DECLARATION to finish the block. -These should both be on a line of their own. - -Inside the block, the parser will expect to find a list of value definitions, one-per-line, with -the very simple syntax - - value_name: value - -The value_name must be one of the items listed below, and is case-sensitive. Whitespace on the -line is ignored. Some values are compulsory and must be supplied, but others are optional. -The order in which they're declared doesn't matter. - -Possible values: - -- ID - - (Compulsory) This ID must match the name of the file and folder, e.g. juce_core. - The main reason for also including it here is as a sanity-check - -- vendor - - (Compulsory) A unique ID for the vendor, e.g. "juce". This should be short - and shouldn't contain any spaces - -- version - - (Compulsory) A version number for the module - -- name - - (Compulsory) A short description of the module - -- description - - (Compulsory) A longer description (but still only one line of text, please!) - -- dependencies - - (Optional) A list (space or comma-separated) of other modules that are required by - this one. The Introjucer can use this to auto-resolve dependencies. - -- website - - (Optional) A URL linking to useful info about the module] - -- license - - (Optional) A description of the type of software license that applies - -- minimumCppStandard - - (Optional) A number indicating the minimum C++ language standard that is required for this module. - This must be just the standard number with no prefix e.g. 14 for C++14 - -- searchpaths - - (Optional) A space-separated list of internal include paths, relative to the module's - parent folder, which need to be added to a project's header search path - -- OSXFrameworks - - (Optional) A list (space or comma-separated) of OSX frameworks that are needed - by this module - -- iOSFrameworks - - (Optional) Like OSXFrameworks, but for iOS targets - -- linuxPackages - - (Optional) A list (space or comma-separated) pkg-config packages that should be used to pass - compiler (CFLAGS) and linker (LDFLAGS) flags - -- linuxLibs - - (Optional) A list (space or comma-separated) of static or dynamic libs that should be linked in a - linux build (these are passed to the linker via the -l flag) - -- mingwLibs - - (Optional) A list (space or comma-separated) of static libs that should be linked in a - win32 mingw build (these are passed to the linker via the -l flag) - -- OSXLibs - - (Optional) A list (space or comma-separated) of static or dynamic libs that should be linked in an - OS X build (these are passed to the linker via the -l flag) - -- iOSLibs - - (Optional) A list (space or comma-separated) of static or dynamic libs that should be linked in an - iOS build (these are passed to the linker via the -l flag) - -- windowsLibs - - (Optional) A list (space or comma-separated) of static or dynamic libs that should be linked in a - Visual Studio build (without the .lib suffixes) - -Here's an example block: - - BEGIN_JUCE_MODULE_DECLARATION - - ID: juce_audio_devices - vendor: juce - version: 4.1.0 - name: JUCE audio and MIDI I/O device classes - description: Classes to play and record from audio and MIDI I/O devices - website: http://www.juce.com/juce - license: GPL/Commercial - - dependencies: juce_audio_basics, juce_audio_formats, juce_events - OSXFrameworks: CoreAudio CoreMIDI DiscRecording - iOSFrameworks: CoreAudio CoreMIDI AudioToolbox AVFoundation - linuxLibs: asound - mingwLibs: winmm - - END_JUCE_MODULE_DECLARATION - diff --git a/deps/juce/docs/Linux Dependencies.md b/deps/juce/docs/Linux Dependencies.md deleted file mode 100644 index 13528b2f..00000000 --- a/deps/juce/docs/Linux Dependencies.md +++ /dev/null @@ -1,62 +0,0 @@ -# JUCE Dependencies on Linux - -Below is a list of the current dependencies required to build JUCE projects on -Ubuntu, separated by module. Where the dependency is optional, the preprocessor -flag used to disable it is noted. - -This has been tested on Ubuntu 16.04 LTS (Xenial Xerus), 18.04 LTS (Bionic -Beaver), and 20.04 LTS (Focal Fossa). Packages may differ in name or not be -available on other distrubutions. - -## Compiler -A C++ compiler is required. JUCE has been tested thoroughly with Clang and GCC: - - sudo apt update - sudo apt install clang - -or - - sudo apt update - sudo apt install g++ - -## Packages - -#### juce_audio_devices -- libasound2-dev -- libjack-jackd2-dev (unless `JUCE_JACK=0`) - -#### juce_audio_processors -- ladspa-sdk (unless `JUCE_PLUGINHOST_LADSPA=0`) - -#### juce_core -- libcurl4-openssl-dev (unless `JUCE_USE_CURL=0`) - -#### juce_graphics -- libfreetype6-dev (unless `JUCE_USE_FREETYPE=0`) - -#### juce_gui_basics -- libx11-dev -- libxcomposite-dev -- libxcursor-dev (unless `JUCE_USE_XCURSOR=0`) -- libxext-dev -- libxinerama-dev (unless `JUCE_USE_XINERAMA=0`) -- libxrandr-dev (unless `JUCE_USE_XRANDR=0`) -- libxrender-dev (unless `JUCE_USE_XRENDER=0`) - -#### juce_gui_extra -- libwebkit2gtk-4.0-dev (unless `JUCE_WEB_BROWSER=0`) - -#### juce_opengl -- libglu1-mesa-dev -- mesa-common-dev - -The full command is as follows: - - sudo apt update - sudo apt install libasound2-dev libjack-jackd2-dev \ - ladspa-sdk \ - libcurl4-openssl-dev \ - libfreetype6-dev \ - libx11-dev libxcomposite-dev libxcursor-dev libxcursor-dev libxext-dev libxinerama-dev libxrandr-dev libxrender-dev \ - libwebkit2gtk-4.0-dev \ - libglu1-mesa-dev mesa-common-dev diff --git a/deps/juce/docs/README.md b/deps/juce/docs/README.md deleted file mode 100644 index 79b073a4..00000000 --- a/deps/juce/docs/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# JUCE Documentation - -This directory contains files documenting the JUCE Module Format, and the JUCE -CMake API. - -The JUCE modules themselves can be found in the `modules` subdirectory of the -JUCE repository. - -CMake example projects are located in the `examples/CMake` directory. - -The JUCE API itself is documented inline, but HTML docs can be generated from -the source code using the `doxygen` tool. These HTML docs can be [found -online](https://juce.com/learn/documentation), or you can generate a local copy -which can be used without an internet connection. For instructions on generating -offline docs, see below. - -# Generating Offline HTML Documentation - -## Dependencies - -- doxygen -- python -- make -- graphviz (to generate inheritance diagrams) - -Make sure that all the dependencies can be found on your PATH. - -## Building - -- cd into the `doxygen` directory on the command line -- run `make` - -Doxygen will create a new subdirectory "doc". Open doc/index.html in your browser -to access the generated HTML documentation. diff --git a/deps/juce/docs/doxygen/Doxyfile b/deps/juce/docs/doxygen/Doxyfile deleted file mode 100644 index c7d11a83..00000000 --- a/deps/juce/docs/doxygen/Doxyfile +++ /dev/null @@ -1,2455 +0,0 @@ -# Doxyfile 1.8.12 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = JUCE - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = NO - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = YES - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = "tags{1}=" \ - "topictag{1}=\1" \ - "box{1}=
\1
" \ - "endbox=
" \ - "c_void=@s_code{void}" \ - "c_bool=@s_code{bool}" \ - "c_char=@s_code{char}" \ - "c_float=@s_code{float}" \ - "c_double=@s_code{double}" \ - "c_int=@s_code{int}" \ - "c_nullptr=@s_code{nullptr}" \ - "c_for=@s_code{for()}" \ - "c_if=@s_code{if()}" \ - "c_ifelse=@s_code{if..else}" \ - "c_while=@s_code{while()}" \ - "c_true=@s_code{true}" \ - "c_false=@s_code{false}" \ - "c_enum=@s_code{enum}" \ - "c_switch=@s_code{switch..case}" \ - "c_static=@s_code{static}" \ - "c_new=@s_code{new}" \ - "c_typedef=@s_code{typedef}" - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = txt=md - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up -# to that level are automatically included in the table of contents, even if -# they do not have an id attribute. -# Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -TOC_INCLUDE_HEADINGS = 0 - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = YES - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = YES - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = NO - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = YES - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = YES - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = YES - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = NO - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = NO - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = NO - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = YES - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = NO - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = NO - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = NO - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 32 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = NO - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = build \ - "../JUCE Module Format.md" \ - "../CMake API.md" - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. - -FILE_PATTERNS = juce_*.h \ - juce_*.dox - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = build/juce_graphics/image_formats \ - build/juce_core/zip/zlib \ - build/juce_audio_formats/codecs/flac \ - build/juce_audio_formats/codecs/oggvorbis \ - build/juce_audio_devices/native \ - build/juce_audio_plugin_client/AU/CoreAudioUtilityClasses \ - build/juce_browser_plugin_client/juce_browser_plugin.h \ - build/juce_core/native \ - build/juce_events/native \ - build/juce_graphics/native \ - build/juce_gui_basics/native \ - build/juce_gui_extra/native \ - build/juce_opengl/native \ - build/juce_video/native \ - build/juce_dsp/native - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = YES - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = juce_GIFLoader* \ - juce_JPEGLoader* \ - juce_PNGLoader* \ - juce_FlacHeader.h - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = YES - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = YES - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = YES - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 3 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = doc - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 32 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 320 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://www.mathjax.org/mathjax - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /