Introducing JUCE 5.2
System requirement changes
JUCE now supports notifications on iOS and Android. It is possible to send and receive local notifications from a JUCE app as well as to receive remote notifications from Apple Push Notification service or Google Firebase. A user can interact with the JUCE app directly from a notification, by pressing buttons embedded in the notification or by entering textual response if needed. Supported platforms include iOS 10 or earlier, as well as Android O or earlier (down to Android 4.0.3 Ice Cream Sandwich). The included demo application showcases the available settings for local notifications on each platform as well as receiving remote notifications.
The Projucer now includes a CLion exporter, enabling JUCE users to edit and compile their projects in JetBrains’ most advanced C++ IDE. The CLion exporter produces a CMakeLists.txt which can be opened on MacOS, Windows and Linux.
JUCE 5.2 includes a new module containing classes that make collecting analytics from your app much easier. The new example application, AnalyticsCollection, illustrates how to use this new module to transmit app usage information to Google Analytics. Simultaneously logging to other analytics collection endpoints like Firebase is also supported.
Detailed list of new FeaturesProjucer
Audio/MIDI and Plug-Ins
- Support for CMake exporter
- Support for JUCE apps sending analytics with various analytics backends
- Added a company copyright field to the project settings
- The Projucer will now automatically copy your plug-in files to the correct folders on Windows
- Added an option to set the debug information format for each build configuration to the VS exporter
- Added support for adding asm files to Android projects
- Added a link-time optimisation option to all exporters
- Added more thorough checking of pkg-config dependencies
- Added a device family option to the iOS exporter
- Added a "Header search paths" field to the project settings page that will be used for all exporters
- Live-build reliability and usability improvements
- 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
- Enabled non-message thread creation of AudioProcessorValueTreeState
- Added a method MidiMessage::withTimeStamp, and some MidiMessageSequence unit-tests
- Added unique id property when creating virtual midi ports on macOS and iOS
- Added missing save state when the standalone app is closed
- Change MPEInstrument::voicesLock member from private to protected so that sub-classes can lock the voicedLock
- VST2: Added warnings if the plug-in version number cannot be displayed by Cubase's version encoding
- VST3: First add Midi controller changes and then add other midi events to ensure that all-notes off events occur before any note-on event with the same sampleOffset
- VST2: Ensured that the VST2 version number is encoded correctly for display in Cubase and when hosting VST2 plug-ins in JUCE
- Support for push notifications
- Enable “scroll on drag” mode by default on Android and iOS
- Make sure nav bars get hidden when asking for full screen mode on Android
- Added support to specify a different interface orientation on iPad vs. iPhone
- Implement Process::hide on mobile platforms
- Added support for multi-touch drag and drop
- Added support for all marketing icons to the iOS exporter
GUI, Graphics & OpenGL
- MacOS: In App Purchase feature is now available on Mac OS too
- 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
- Increased the contrast for selected text when using LookAndFeel_V4
- Added a parameter to Slider::setPopupDisplayEnabled() to set the timeout for displaying the popup display on mouse hover
- When calling repaint() without a MessageManagerLock, it now always asserts
- Added method Viewport::recreateScrollbars()
- 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: Explicitly disable “scroll on drag” on mobile platforms if necessary via the Viewport::setScrollOnDragEnabled method.
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.
- Android: “Custom manifest xml elements” field has been removed from the Android exporter in the Projucer
The previous setting of Android exporter "Custom manifest xml elements" creating child nodes of <application> 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 br 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 <manifest><application> elements,for example instead of:
<meta-data android:name="paramId1" android:value="paramValue1"/>
<meta-data android:name="paramId2" android:value="paramValue2"/>
<application><meta-data android:name="paramId1" android:value="paramValue1"/>
<meta-data android:name="paramId2" android:value="paramValue2"/></application>
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:
Various Other Improvements & Bug FixesAdded an assertion that will be triggered at the moment you attempt to delete a LookAndFeel object that's still in use somewhereImproved scheduling when multiple threads are fighting for the MessageManagerLockAdded a method WeakReference::Master::getNumActiveWeakReferences()Changed Component to hold a WeakReference to its LookAndFeel object, so that if you accidentally delete a LookAndFeel that's being used, it won't be a dangling pointer (but you may see some unexpected drawing behaviour!)Fixed various GCC compiler warningsAdded disableDenormalisedNumberSupport to query if denormals are disabled and improved documentationAdded some better use of the Range class in NormalisableRange and SliderNumerous improvements to code readabilityBit of tidying in BlowFishFixed an issue with stuck touches when a component peer was closed on a mouse down eventAdded set and getJustificationType() methods to HyperlinkButtonAndroid: move android.content.Intent class definition into JNIHelpers.Added a workaround in ZipFile for reading files which contain the wrong offset for their central directoryUpdated the implementation of File::moveToTrash() on OSX so that it uses the newer API calls on 10.8 and above, and added a bodge for older versions that makes it blocks until the operation has completedRestored compatibility with older versions of OS X by removing some std namespace maths functionsFixed the Projucer icon pathTweaked the macOS drag-and-drop flags to use just NSDragOperationGeneric rather than also specifying NSDragOperationCopy and NSDragOperationMove, as this seemed to cause problems with some other appsAdded some heuristics to EdgeTable to try to improve the table size predictionNoticed that we still had some template whitespace workarounds for older compilers, so tidied them upWidnows: Fixed deprecated use of File::separatorAndroid: Fixed a compiler error when building with older ndk versionsFixed a compiler warning involving deprecated static variables when compiling with GCCAdded a template to allow the HeapBlock class to be given signed ints or other types that are not size_t for its size parametersWhen opening an X display, made it attempt a retry if the first attempt fails.Fixed some false positives generated by the StringPairArray comparison operator, and made it faster for common cases.Use juce namespace for some uint32s in the CodeEditorDemoDeprecated File::separator and File::separatorString, replacing them by static getter functions, so that File methods can be safely used in static constructors without order-of-initialisation problemsAdded some more JUCE_CONSTEXPR flags to PointCleaned up some missing std:: namespaces for maths functions, and updated some old documentation for AudioProcessorConverted some old uses of non-C++ maths functions to their std equivalentsRemoved unused JUCE_COMPILER_SUPPORTS_THREAD_LOCAL flagCorrected a small bug in TextEditor when clicking to the right of the last line to place the cursor.Removed a defunct unit testAdded some prototype function definitions to avoid compiler warnings for people who enable the "missing prototype" flagAdded 'final' keyword to a lot of classes from which you really shouldn't be inheriting!Improved the colour scheme of the code editor demoProjucer: Fixed a typo in the AppConfig commentsRemoved a stray log fileRe-added "override" to the C++ tokeniser keywordsFixed a path parsing issue in the Code::Blocks Linux exporterAdd some missing semicolonsAdded some more keywords to the C++ tokeniserAdded "override" to the C++ tokeniser keywordsRenamed XCode to Xcode in multiple placesFixed a bug when selecting AudioParameterChoice values in native DAW parameter viewsProjucer: Fixed a potential crash when the live-build component list is changedFixed a typo in the StringRef documentationFixed an assertion when enabling the popup display with a two-value slider and disabled the popup display when using an IncDec sliderFix to the VST2/3 compatibility code to handle a Studio One issueFixed an issue where ScopedNoDenormals would do nothing on all platforms and added arm implementationNormalised all the copy/move/assignment constructors for the dsp module IIR and FIR filter classes. These now do NOT reset the filter when they get copied, and they expect that the user-supplied process state class is copyableAdded some missing copy and move constructors in the ReferenceCountedObject classesMade the dsp::Filter copy constructor reset the state. Also added a couple of missing move constructors to that classmacOS: Fixed an issue where the CustomCallback of a menu item would not be called if the menu item belongs to a native macOS menumacOS: Fixed a memory leak of native mac menu itemsFixed an edge-case error in the LaGrange and Catmull-Rom interpolators when the ratio changes to exactly 1.0Removed an unused variable from LookAndFeel_V4::positionDocumentWindowButtons()Fixed a bug where DocumentWindow buttons were being drawn too largeProjucer: Re-factored source code groups and general code clean-upSome internal modernisation in windowing classesAndroid: bailout in ComponentPeerView’s callbacks if underlying host is deleted.Got rid of a long-defunct alias "BitArray". If your code still uses this name, you can just replace or alias it to BigInteger, which is what the class was renamed to.Added optional parameter to specify the size and position of the MIDI bluetooth selectorAdded JUCE_DECLARE_WEAK_REFERENCEABLE macro to make it easier to creat weak-referenceable classesMinor breaking change: removed the legacy swapVariables function. Just use std::swap instead and it'll do a better job!Changed the way isPositiveAndBelow is written to avoid needing to cast the second parameter to an intAndroid: fix getMemorySizeInMegabytes() returning negative values.Avoided triggering an assertion when focus is returned by a popup menu to a hidden componentTweaked TextLayout::createLayoutWithBalancedLineLengths() to improve line length balancingTweaked URL::addEscapeChars() to make its character substitutions more compliant with RFC3986Android: Fixed a rare race-condition in android OpenGL startup which could occur if the OpenGL context is destroyed before it is fully initialisedInAppPurchases: when trying to buy an already purchased item in Play Store, call success callback with “Item already owned” status.UnitTestRunner: Improved logging on WindowsFixed a performance regression parsing doublesFixed constexpr compiler support detection in gccAndroid: Fixed a runtime-error introduced by a recent commit when building for Android <24Bit of modernisation in OpenGLContextProjucer: Removed some unnecessary time-consuming function calls to speed up the painting of the modules panelProjucer: Fixed a Visual Studio exporter library linking bugAdded an option for Viewport subclasses to create custom scrollbars. Also modified Viewport::getVerticalScrollBar() and ListBox::getVerticalScrollBar() to return references instead of pointersAdded method TextEditor::setJustification()Projucer: Removed a duplicate compile flag from the Makefile exporterProjucer: Removed a duplicated compiler option from the Linux exporterAAX: Added JucePlugin_AAX_Chunk_Identifier preprocessor define to override the AAX chunk identifier that is used by JUCEFixed a bug where a Slider popup display set to show on mouse hover wouldn't show when dragging the mouse over the Slider and releasingAvoided forcing TextEditor to be always opaqueFixed some errors and warnings when building with JUCE_DLL_BUILD=1Projucer: Changed the method for setting the Windows Target Platform option in the VS exporters to a text boxFixed a problem in a static assert in Atomic.MinGW: Fixed some 32 bit build errorsAdded a minimum number of columns option to the PopupMenu, and did a bit of internal modernising on the class's internalsWinRT MIDI: Increased the maximum size of outgoing messagesMacOS: Fixed a bug detecting changes to the number of hardware output channelsStandalone Plug-In: Fixed an issue where the editor would not resize correctly on mobile when the feedback warning was dismissedVST3: Fixed an issue with the VST3 implementation of isInputChannelStereoPair/isOutputChannelStereoPairAdded a copy constructor for MidiBuffer::IteratorLittlefoot: Add pitch correction functionsModernised some String internalsAdded a couple of assertions in IIR::CoefficientsAdded a missing juce namespace to juce_mac_AudioCDBurner.mmFixed a bug in NormalisableRangeWindows: Fixed an issue where WASAPI audio would not correctly restart when changing buffer sizesFixed numerous VS2013 compiler errorsProjucer: Fixed a deadlock that would occur when saving projects from the command line after adding the MessageManagerLock to Project::Item::loadAsImageFile()Removed a spurious #undef in juce_IIRFilter.cppFixed a mistake in InputStream::readNextLine()Android: add bits missing from “bailout in ComponentPeerView’s callbacks if underlying host is deleted.macOS: Fixed a compiler error in NormalisableRange when compiling for macOS <10.8InAppPurchases: check price locale’s language code in backwards compatible wayFixed a problem in GlyphArrangement which could cause multiple lines to all be given ellipsisFixed KeyPress::createFromDescription when using this for function keys > F12Android: fixed an issue which would stop the virtual keyboard from showing upARM: Don't change rounding mode when disabling denormalsAndroid: Fixed an issue where the JNI could be flooded with JNI GlobalRefs when many messages are in flightFix to TextEditor caret positioning
Previous release notes:JUCE 5.1JUCE 5.0JUCE 4.3JUCE 4.2JUCE 4.1JUCE 4