JUCE 5.1.2 announcement

JUCE 5.1.2

Release Notes

JUCE 5.1.2 launches with In-App Purchase and full Visual Studio IntelliSense Support

System requirement changes
In-App purchases on Android requires a Google Play developer account

Features

In-App Purchases
JUCE now supports in-app purchases on both iOS and Android. JUCE’s in-app purchase includes full support for single purchases, consumable purchases, and recurring purchases such as subscriptions. On iOS, it also supports in-app purchase downloads.

Visual Studio IntelliSense Support

JUCE has been restructured in a way to be compatible with Visual Studio’s IntelliSense. With JUCE 5.1.2, IntelliSense will parse the code on-the-fly and show any compiler errors, along with useful diagnostic messages. In addition, Visual Studio will now offer more reliable auto-completion with JUCE code.

Xcode 9, iOS 11 and preliminary macOS High Sierra support (10.13)

JUCE 5.1.2 was updated to be compatible with the latest Xcode 9 beta, iOS 11 beta, and the macOS high sierra 10.12 SDK.

W84VWkWZoad25LKttLck1Aj32iRVM29Kuo0_8fuWJ9GhEjxF89MesgrbVRwueRJxgPmN5ulyXtA2BzBO3PLs2VCL4wE7IwQaLyBpKwJLqqu1KWu3U0gTGlOgzBYZE_oMfx4HZNNE

Breaking Changes

  • The method used to classify AudioUnit, VST3, and AAX plug-in parameters as either continuous or discrete has changed. 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, AudioUnitv3, 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 AudioUnitv3 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.

  • 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.

  • 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.

  • 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.

Improvements

  • Added an option to declare plug-in parameters as either continuous or discrete, irrespective of their number of steps
  • Added a method var::hasProperty()
  • Improved the confusing nomenclature of some of the SIMDRegister typedefs
  • Android: Ensure that jni headers are included if JUCE_CORE_INCLUDE_JNI_HELPERS is set but JUCE_CORE_INCLUDE_NATIVE_HEADERS isn’t
  • Ensured that the “textWhenNothingSelected” takes the label font of label’s lookandfeel into account
  • Display current progress in LookAndFeel_V4 linear ProgressBar
  • VST3: respect the editor’s constrainer when resizing
  • Windows: Remove deprecated direct show macro from JUCE demo
  • DSP: snapToZero is now a public method of the IIR and StateVariable filters so that they can be called manually after sample by sample processing
  • Added a ScopedNoDenormal class to temporarily disable denormals
  • Fixed a bug where PopupMenus were being dismissed when opening a submenu using touch input
  • VST2: Fixed live-resize issue in Bitwig
  • iOS: Fixed an ambiguous reference to AudioBuffer when compiling the AudioUnitPluginFormat host code for iOS
  • Increased the size of the standalone filter settings window
  • Fixed a bug in the demo plug-in slider class
  • BLOCKS: Removed some unimplemented functions
  • Fixed Digital Performer host detection on MacOS
  • AU: Fixed an error when targeting 32-bit architectures
  • Made the demo host compatible with OS X 10.6
  • Fixed a double inclusion of the Carbon headers
  • Removed a duplicate module configuration parameter
  • AU: Replaced std::unordered_map with HashMap for parameter lookup
  • VST3: checkBusFormatsAreNotDiscrete should return true when buses are disabled
  • Added the microphone permission to the iOS demo plug-in
  • AU: Implemented GetParameterValueStrings for discrete parameters
  • Android: fix a crash in painting when size of the array to allocate is 0.
  • BLOCKS: Added support for tri-state button controls in littlefoot
  • AU: Disable CoreAnimation resizing transitions for AU plug-in windows
  • Added some missing HTML colours
  • VST3: Fix plug-in resize issue in Bitwig studio
  • DSP: Added missing snapToZero in the StateVariableFilter
  • Android: Fixed an issue where the AlertWindow’s callback would never be called if AlertWindows were dismissed by clicking outside the alert’s window on Android
  • VST3: Fixed the calculation of timeInSeconds AudioPlayHead information
  • Avoided a compiler error when using xcode with very old standard libraries
  • iOS AUv3: Removed too strict API limitations to open URLs in AUv3s as iOS seems to allow this
  • DSP: Made trimming of the convolution impulse response optional
  • Fix for an AudioBuffer move operator bug
  • Removed the need for the window to be focused for the slider’s hover popup to work
  • Added a std::hash function for juce::String to make it more compatible with std containers
  • Made TooltipWindow::getTipFor() a public virtual method
  • InAppPurchases: fix linker error on iOS when product unlocking module is included but IAP capability is turned off.
  • BLOCKS: Added some extra LittleFoot definitions and a new local config for gamma correction
  • Added new FrameRateType fps23976 to AudioPlayHead
  • Added the ability to use non-automatable parameters with the AudioProcessorValueTreeState class
  • Fixed a bug in plug-ins on Mac where mouse exit events weren’t being sent when the mouse cursor left the plug-in window
  • Fixed a crash when animators delete top-level components during a screen rotate animation
  • Android: fix web input stream reporting always total length of -1.
  • Fixed an issue where sliders would draw incorrectly in LookAndFeel4 if the slider’s value text box was placed left to or above the slider
  • Added a minimum velocity property to the ContinuousWithMomentum animated position behaviour and increased the minimum velocity of the viewport to avoid some jitter when the viewport animation is close to stand still
  • Added plug-in host type detection for Cubase 8.5 and 9
  • Fixed an issue where ComboBox popup menus would flicker if a second combobox menu was opened
  • Linux ALSA: Fixed a crash when playing/recording audio on a device that only supports interleaved audio
  • Fixed an assertion when quitting the standalone plug-in target when the audio settings window is open
  • Added a function to the InterprocessConnectionServer class to get the bound port number
  • Added support for more F-keys
  • Android: ensure that temp directory exists before returning a path to it.
  • Fixed a potential use-after-free in AudioBuffer’s move semantics
  • Android: Fixed a potential deadlock in Sockets
  • Linux: Increased maximum number of reported ALSA channels
  • Android: Fixed File::getSpecialLocation (userDocumentsDirectory) to return correct directory on newer Android versions
  • Added a uint8 operator<< to the String class
  • Fixed compiler errors when compiling with GNU libstdc++
  • IAP: Ensured that IAP can compile even on platforms that don’t support IAP
  • Fixed an issue when building the in-app purchases app on case-sensitive filesystems
  • Removed the unordered_map header from juce_StandardHeader.h
  • FFTSimpleExample: avoid an assertion when the input audio is a block of samples all of which are exactly zero
  • Wav format reader: fixed an issue where JUCE would assert when reading wave files with a large number of channels
  • Added an optional usePost parameter to URL::downloadToFile
  • Added an option to ignore the case when getting an entry inside a zip file with ZipFile::getEntry
  • Android: ensure that web calls are done off the main thread and fix multiple web call data races.
  • Android: Fixed a race condition when switching the buffer size on the Android OpenSL audio device
  • Added a fast parameter ID lookup to the AudioUnit wrapper
  • Tweak to the updating of the popup display value in Slider
  • VST: made sure the VstSpeakerConfiguration is never created with a size smaller than the original structure definition
  • Updated projucer makefile generator to build projects with -fvisibility=hidden
  • Added Oversampling processor to DSP module
  • DSP: Added template specialisations of the Matrix class
  • Allow select all key command for read-only TextEditors
  • Fixed a crash when performing layout on an empty Grid using auto flow and added a few Margin convenience constructors
  • Added method ThreadPool::moveJobToFront()
  • Added a virtual getTabButtonFont() method to TabbedButtonBar::LookAndFeelMethods
  • Projucer: Removed OpenDocumentManager::DocumentCloseListener from JucerDocument
  • Projucer: Fixed a bug where some files would remain open after selecting the ‘Window->Close All Documents’ menu item
  • Deleted the String (bool) constructor to prevent nasty type conversion edge cases
  • Fixed a bug where PopupMenus with a border size of 0 were being immediately dismissed
  • DSP: Added hint flag to tell juce’s FFT to only calculate positive frequencies when performing real to complex transforms
  • Fixed a bug where floating point numbers were parsed using the system’s locale
  • Projucer: Changed some keypresses for ‘View’ menu items to avoid clashes
  • BLOCKS: Fixed issue preventing update of blocks version numbers after updating over API/DNA/Topology.
  • Projucer: Remember the directory of a previously created project
  • Projucer: asynchronously show the ‘.jucer file has been modified…’ alert window to avoid crash
  • Tidied up the DefaultHashFunctions methods, to avoid some edge-case values and avoid using abs()
  • iOS/Android PlugIn Standalone: Fixed an issue where midi callbacks would be added twice
  • Added AudioProcessor::updateTrackProperties callback to inform plug-ins about track colour and name changes
  • Projucer: Added a missing space in the Makefile exporter
  • Android: Replaced jni type in JUCE header with generic void* to avoid compilation errors if the user does not include jni.h
  • Projucer: Added code to handle JucePlugin_IsMidiEffect in the new audio plug-in template
  • macOS: Fixed an issue where the menuIndex was shifted by one when using the native macOS menu bar
  • Android: Fixed a bug where getCurrentRawMousePosition() would incorrectly return the mouse position local to the peer that had the last touch event
  • AU/Auv3: Added workaround for compiler issue when initialising CoreAudio’s AudioChannelLayout structure using braces
  • Projucer: Set the OSX deployment target of the aggregate target for use in pre-/post-build scripts
  • Added colour ids to modify the colours of the TableHeaderComponent
  • Reduced the minimum height of PopupMenu ItemComponent from 2 to 1
  • Plugin Host: Fixed a potential crash when creating a new document
  • Added a virtual getPopupMenuBorderSize() to PopupMenu::LookAndFeelMethods
  • Projucer: Update window title when project name changes
  • Added a parameter to Slider::setPopupDisplayEnabled() to allow the popup to optionally appear on a mouse-over as well as a drag
  • Fixed File::getCreationTime() to return the correct creation time on macOS/iOS
  • Added macros JUCE_CONSTEXPR and JUCE_HAS_CONSTEXPR to support constexpr
  • Fixed a potential nullptr dereference in Image::clear()
  • AudioProcessorGraph: Fixed a crash when the processor graph is called with block sizes larger than reported by prepareToPlay
  • Added some missing move constructors to SortedSet
  • Added a method SynthesiserVoice::setKeyDown
  • Workaround for an edge-case involving sustain + sostenuto pedal parsing in the Synthesiser class. Also gave that class a quick spring-clean internally
  • SVG parser: if font-size is unspecified for text, a non-zero default size is used
  • Added In-App Purchase sample code app
  • Projucer: sign the apk with user provided credentials in both debug and release mode
  • Android IAP: Ensure that IAP requests will still succeed even if the IAP service did not yet bind to our app
  • SoundPlayer: Added support for automatic sample rate conversion when playing audio from AudioFormatReaders
  • Tweaked the order in which properties are set when TreeViewItems are added, and did some internal modernisation of the TreeView classes
  • IAP Android: Delay IAP responses if IAP android service did not bind to our app yet
  • Added in-app purchase feature to JUCE
  • Tweaked a LookAndFeel_V2 method to avoid a subtle rectangle rendering glitch
  • Projucer: Fixed a couple of potential race conditions when saving a project
  • WASAPI: Fixed an issue where the AudioIODevice would not be stopped if the system goes to sleep
  • VST2: Fixed an issue with resizing plug-ins in Ableton Live
  • Fixed an assertion when using an IncDec slider with the AudioProcessorValueTree
  • Avoided some assertions drawing very small ToggleButtons
  • Added a method DrawableButton::getEdgeIndent()
  • Android: Moved more Java code into C++
  • Defined some Windows touch API flags that were not defined when compiling using MinGW
  • Projucer: Don’t delete the entire src/main/java folder when re-saving Android projects
  • Projucer: Fixed a bug in the iOS exporter where app group entitlements weren’t being added correctly
  • Projucer: Added a workaround for some errors when using the live-build engine with the XCode 9 beta
  • Projucer: Improved method for saving and restoring previously selected GUI component tabs
  • Fixed a several issues with the SVG parser
  • Numerous documentation fixes
10 Likes

It took many years of complaining, but thank you for finally restructuring to support Intellisense’s flawed understanding of namespaced #includes. :slight_smile:

4 Likes

macOS Sierra is version 10.12, while macOS High Sierra is version 10.13, so I am a bit confused…

1 Like

Congrats on the release.

10.13! :slight_smile:

Just for the sake of completeness, note that they are 2 other minor breaking changes :

  • one non-optional parameter added to Slider::setPopupDisplayEnabled()
  • one non-optional parameter added to the lnf method drawTableHeaderColumn() of TableHeaderComponent in that commit :
1 Like

Fixed the typo: 10.12 -> 10.13

Hey guys,

Just wanna say “Thanks!” for a tiny little feature in-there - non-automatable parameters in the AudioProcessorValueTreeState. I removed a lot of custom implementation once I saw this is added.

Cheers!

2 Likes

Thanks so much for adding this!

@t0m Is it possible to add similar for normalizeImpulseResponse()? I sometimes load a set of IRs that are calibrated against each other and normalising them destroys this. Thanks!

1 Like

I’m working on this right now, I’ll provide a new version of the Convolution class which solves a bug a user encountered, and the optional normalization :wink:

1 Like

That sounds great. I’m looking forward to it :slight_smile:
I submitted a bug report of the JUCE GitHub yesterday: the trimming flag is broken and still trims. Thankfully the patch is very simple.

I must praise the JUCE team for going the right way.
JUCE had few bad releases (in terms of QA/bugs) but I must say having develop branch and providing a proper release notes makes latest releases very appealing while providing reasonable stepping between versions.

kudos!

4 Likes

A normalization flag would be highly appreciated! Just did it the hard way and commented the function out :zipper_mouth_face:

The change with the optional normalization, and the optional trim fix is on the develop branch :wink: