JUCE 5.2

Push Notifications and CLion Exporter

JUCE 5.2

JUCE 5.2 Release Notes

Introducing JUCE 5.2

Push Notifications
CLion Exporter
Analytics Module

System requirement changes



Push Notifications

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.



CLion Exporter

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.



Analytics Module

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.

juce 5 2 analytics-a9b0fd7687818e269c5bc196487aa7589b2201c288adccb81c1ed5590e751b06

Detailed list of new Features


  • 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

Audio/MIDI and Plug-Ins

  • 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


  • MacOS: In App Purchase feature is now available on Mac OS too

GUI, Graphics & OpenGL

  • 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()

Breaking Changes

  • 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"/>

    simply write:

    <meta-data android:name="paramId1" android:value="paramValue1"/>
    <meta-data android:name="paramId2" android:value="paramValue2"/>
    • 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:
    <supports-screens android:xlargeScreens="true"/>

Various Other Improvements & Bug Fixes

  • Added an assertion that will be triggered at the moment you attempt to delete a LookAndFeel object that's still in use somewhere
  • Improved scheduling when multiple threads are fighting for the MessageManagerLock
  • Added 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 warnings
  • Added disableDenormalisedNumberSupport to query if denormals are disabled and improved documentation
  • Added some better use of the Range class in NormalisableRange and Slider
  • Numerous improvements to code readability
  • Bit of tidying in BlowFish
  • Fixed an issue with stuck touches when a component peer was closed on a mouse down event
  • Added set and getJustificationType() methods to HyperlinkButton
  • Android: move android.content.Intent class definition into JNIHelpers.
  • Added a workaround in ZipFile for reading files which contain the wrong offset for their central directory
  • Updated 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 completed
  • Restored compatibility with older versions of OS X by removing some std namespace maths functions
  • Fixed the Projucer icon path
  • Tweaked 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 apps
  • Added some heuristics to EdgeTable to try to improve the table size prediction
  • Noticed that we still had some template whitespace workarounds for older compilers, so tidied them up
  • Widnows: Fixed deprecated use of File::separator
  • Android: Fixed a compiler error when building with older ndk versions
  • Fixed a compiler warning involving deprecated static variables when compiling with GCC
  • Added a template to allow the HeapBlock class to be given signed ints or other types that are not size_t for its size parameters
  • When 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 CodeEditorDemo
  • Deprecated 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 problems
  • Added some more JUCE_CONSTEXPR flags to Point
  • Cleaned up some missing std:: namespaces for maths functions, and updated some old documentation for AudioProcessor
  • Converted some old uses of non-C++ maths functions to their std equivalents
  • Corrected a small bug in TextEditor when clicking to the right of the last line to place the cursor.
  • Removed a defunct unit test
  • Added some prototype function definitions to avoid compiler warnings for people who enable the "missing prototype" flag
  • Added 'final' keyword to a lot of classes from which you really shouldn't be inheriting!
  • Improved the colour scheme of the code editor demo
  • Projucer: Fixed a typo in the AppConfig comments
  • Removed a stray log file
  • Re-added "override" to the C++ tokeniser keywords
  • Fixed a path parsing issue in the Code::Blocks Linux exporter
  • Add some missing semicolons
  • Added some more keywords to the C++ tokeniser
  • Added "override" to the C++ tokeniser keywords
  • Renamed XCode to Xcode in multiple places
  • Fixed a bug when selecting AudioParameterChoice values in native DAW parameter views
  • Projucer: Fixed a potential crash when the live-build component list is changed
  • Fixed a typo in the StringRef documentation
  • Fixed an assertion when enabling the popup display with a two-value slider and disabled the popup display when using an IncDec slider
  • Fix to the VST2/3 compatibility code to handle a Studio One issue
  • Fixed an issue where ScopedNoDenormals would do nothing on all platforms and added arm implementation
  • Normalised 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 copyable
  • Added some missing copy and move constructors in the ReferenceCountedObject classes
  • Made the dsp::Filter copy constructor reset the state. Also added a couple of missing move constructors to that class
  • macOS: Fixed an issue where the CustomCallback of a menu item would not be called if the menu item belongs to a native macOS menu
  • macOS: Fixed a memory leak of native mac menu items
  • Fixed an edge-case error in the LaGrange and Catmull-Rom interpolators when the ratio changes to exactly 1.0
  • Removed an unused variable from LookAndFeel_V4::positionDocumentWindowButtons()
  • Fixed a bug where DocumentWindow buttons were being drawn too large
  • Projucer: Re-factored source code groups and general code clean-up
  • Some internal modernisation in windowing classes
  • Android: 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 selector
  • Added JUCE_DECLARE_WEAK_REFERENCEABLE macro to make it easier to creat weak-referenceable classes
  • Minor 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 int
  • Android: fix getMemorySizeInMegabytes() returning negative values.
  • Avoided triggering an assertion when focus is returned by a popup menu to a hidden component
  • Tweaked TextLayout::createLayoutWithBalancedLineLengths() to improve line length balancing
  • Tweaked URL::addEscapeChars() to make its character substitutions more compliant with RFC3986
  • Android: Fixed a rare race-condition in android OpenGL startup which could occur if the OpenGL context is destroyed before it is fully initialised
  • InAppPurchases: when trying to buy an already purchased item in Play Store, call success callback with “Item already owned” status.
  • UnitTestRunner: Improved logging on Windows
  • Fixed a performance regression parsing doubles
  • Fixed constexpr compiler support detection in gcc
  • Android: Fixed a runtime-error introduced by a recent commit when building for Android <24
  • Bit of modernisation in OpenGLContext
  • Projucer: Removed some unnecessary time-consuming function calls to speed up the painting of the modules panel
  • Projucer: Fixed a Visual Studio exporter library linking bug
  • Added an option for Viewport subclasses to create custom scrollbars. Also modified Viewport::getVerticalScrollBar() and ListBox::getVerticalScrollBar() to return references instead of pointers
  • Added method TextEditor::setJustification()
  • Projucer: Removed a duplicate compile flag from the Makefile exporter
  • Projucer: Removed a duplicated compiler option from the Linux exporter
  • AAX: Added JucePlugin_AAX_Chunk_Identifier preprocessor define to override the AAX chunk identifier that is used by JUCE
  • Fixed a bug where a Slider popup display set to show on mouse hover wouldn't show when dragging the mouse over the Slider and releasing
  • Avoided forcing TextEditor to be always opaque
  • Fixed some errors and warnings when building with JUCE_DLL_BUILD=1
  • Projucer: Changed the method for setting the Windows Target Platform option in the VS exporters to a text box
  • Fixed a problem in a static assert in Atomic.
  • MinGW: Fixed some 32 bit build errors
  • Added a minimum number of columns option to the PopupMenu, and did a bit of internal modernising on the class's internals
  • WinRT MIDI: Increased the maximum size of outgoing messages
  • MacOS: Fixed a bug detecting changes to the number of hardware output channels
  • Standalone Plug-In: Fixed an issue where the editor would not resize correctly on mobile when the feedback warning was dismissed
  • VST3: Fixed an issue with the VST3 implementation of isInputChannelStereoPair/isOutputChannelStereoPair
  • Added a copy constructor for MidiBuffer::Iterator
  • Littlefoot: Add pitch correction functions
  • Modernised some String internals
  • Added a couple of assertions in IIR::Coefficients
  • Added a missing juce namespace to juce_mac_AudioCDBurner.mm
  • Fixed a bug in NormalisableRange
  • Windows: Fixed an issue where WASAPI audio would not correctly restart when changing buffer sizes
  • Fixed numerous VS2013 compiler errors
  • Projucer: 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.cpp
  • Fixed 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.8
  • InAppPurchases: check price locale’s language code in backwards compatible way
  • Fixed a problem in GlyphArrangement which could cause multiple lines to all be given ellipsis
  • Fixed KeyPress::createFromDescription when using this for function keys > F12
  • Android: fixed an issue which would stop the virtual keyboard from showing up
  • ARM: Don't change rounding mode when disabling denormals
  • Android: Fixed an issue where the JNI could be flooded with JNI GlobalRefs when many messages are in flight
  • Fix to TextEditor caret positioning
Previous Release Notes:

JUCE 5.1


JUCE 4.3

JUCE 4.2

JUCE 4.1


Further Information

© Raw Material Software Limited