The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1666 lines
53KB

  1. JUCE breaking changes
  2. =====================
  3. Version 6.0.8
  4. =============
  5. Change
  6. ------
  7. Calling AudioProcessorEditor::setResizeLimits() will no longer implicitly add a
  8. ResizableCornerComponent to the editor if it has not already been set as
  9. resizable.
  10. Possible Issues
  11. ---------------
  12. Code which previously relied on calling this method to set up the corner
  13. resizer will no longer work.
  14. Workaround
  15. ----------
  16. Explicitly call AudioProcessorEditor::setResizable() with the second argument
  17. set to true to enable the corner resizer.
  18. Rationale
  19. ---------
  20. The previous behaviour was undocumented and potentially confusing. There is now
  21. a single method to control the behaviour of the editor's corner resizer to
  22. avoid any ambiguity.
  23. Change
  24. ------
  25. The implementations of `getValue` and `setValue` in `AUInstanceParameter` now
  26. properly take the ranges of discrete parameters into account.
  27. Possible Issues
  28. ---------------
  29. This issue affects JUCE Audio Unit hosts. Automation data previously saved for
  30. a discrete parameter with a non-zero minimum value may not set the parameter to
  31. the same values as previous JUCE versions. Note that previously, `getValue` on
  32. a hosted discrete parameter may have returned out-of-range values, and
  33. `setValue` may have only mapped to a portion of the parameter range. As a
  34. result, automation recorded for affected parameters was likely already behaving
  35. unexpectedly.
  36. Workaround
  37. ----------
  38. There is no workaround.
  39. Rationale
  40. ---------
  41. The old behaviour was incorrect, and was causing issues in plugin validators
  42. and other hosts. Hosts expect `getValue` to return a normalised parameter
  43. value. If this function returns an out-of-range value (including Inf and NaN)
  44. this is likely to break assumptions made by the host, leading to crashes,
  45. corrupted project data, or other defects.
  46. Change
  47. ------
  48. AudioProcessorListener::audioProcessorChanged gained a new parameter describing
  49. the nature of any change.
  50. Possible Issues
  51. ---------------
  52. Code using the old function signature will not build until updated to use
  53. the new signature.
  54. Workaround
  55. ----------
  56. Listeners should add the new parameter to any overrides of
  57. audioProcessorChanged.
  58. Rationale
  59. ---------
  60. The new function signature means that wrappers can be smarter about the
  61. requests that they make to hosts whenever some aspect of the processor changes.
  62. In particular, plugin wrappers can now distinguish between changes to latency,
  63. parameter attributes, and the current program. This means that hosts will no
  64. longer assume parameters have changed when `setLatencySamples` is called.
  65. Change
  66. ------
  67. CharacterFunctions::readDoubleValue now returns values consistent with other
  68. C++ number parsing libraries. Parsing values smaller than the minimum number
  69. respresentable in a double will return (+/-)0.0 and parsing values larger than
  70. the maximum number respresentable in a double will return (+/-)inf.
  71. Possible Issues
  72. ---------------
  73. Code reading very large or very small numbers may receive values of 0.0 and inf
  74. rather than nan.
  75. Workaround
  76. ----------
  77. Where you may be using std::isnan to check the validity of the result you can
  78. instead use std::isfinite.
  79. Rationale
  80. ---------
  81. The new behaviour is consistent with other string parsing libraries.
  82. Version 6.0.6
  83. =============
  84. Change
  85. ------
  86. The name of `OperatingSystemType::MacOSX_11_0` was changed to
  87. `OperatingSystemType::MacOS_11`.
  88. Possible Issues
  89. ---------------
  90. Code using the old name will not build until it is updated to use the new name.
  91. Workaround
  92. ----------
  93. Update code using the old name to use the new name instead.
  94. Rationale
  95. ---------
  96. Newer versions of macOS have dropped the "X" naming. Minor version updates are
  97. also less significant now than they were for the X-series.
  98. Change
  99. ------
  100. Xcode projects generated using the Projucer will now use the "New Build System"
  101. instead of the "Legacy Build System" by default.
  102. Possible Issues
  103. ---------------
  104. Xcode 10.0 - 10.2 has some known issues when using the new build system such as
  105. JUCE modules not rebuilding correctly when modified, issue and file navigation
  106. not working, and breakpoints not being reliably set or hit.
  107. Workaround
  108. ----------
  109. If you are using an affected version of Xcode then you can enable the "Use
  110. Legacy Build System" setting in the Projucer Xcode exporter to go back to the
  111. previous behaviour.
  112. Rationale
  113. ---------
  114. The legacy build system has issues building arm64 binaries for Apple silicon
  115. and will eventually be removed altogether.
  116. Version 6.0.5
  117. =============
  118. Change
  119. ------
  120. New pure virtual methods accepting `PopupMenu::Options` arguments have been
  121. added to `PopupMenu::LookAndFeelMethods`.
  122. Possible Issues
  123. ---------------
  124. Classes derived from `PopupMenu::LookAndFeelMethods`, such as custom
  125. LookAndFeel classes, will not compile unless these pure virtual methods are
  126. implemented.
  127. Workaround
  128. ----------
  129. The old LookAndFeel methods still exist, so if the new Options parameter is not
  130. useful in your application, your implementation of
  131. `PopupMenu::LookAndFeelMethods` can simply forward to the old methods. For
  132. example, your implementation of `drawPopupMenuBackgroundWithOptions` can
  133. internally call your existing `drawPopupMenuBackground` implementation.
  134. Rationale
  135. ---------
  136. Allowing the LookAndFeelMethods to access the popup menu's options allows for
  137. more flexible styling. For example, a theme may wish to query the menu's target
  138. component or parent for colours to use.
  139. Change
  140. ------
  141. A typo in the JUCEUtils CMake script that caused the wrong manufacturer code to
  142. be set in the compile definitions for a plugin was fixed.
  143. Possible Issues
  144. ---------------
  145. The manufacturer code for plugins built under CMake with this version of JUCE
  146. will differ from the manufacturer code that was generated previously.
  147. Workaround
  148. ----------
  149. If you have released plugins that used the old, incorrect manufacturer code and
  150. wish to continue using this code for backwards compatibility, add the following
  151. to your `juce_add_plugin` call:
  152. USE_LEGACY_COMPATIBILITY_PLUGIN_CODE TRUE
  153. In most cases, this should not be necessary, and we recommend using the fixed
  154. behaviour.
  155. Rationale
  156. ---------
  157. This change ensures that the manufacturer codes used by CMake projects match
  158. the codes that would be generated by the Projucer, improving compatibility
  159. when transitioning from the Projucer to CMake.
  160. Version 6.0.2
  161. =============
  162. Change
  163. ------
  164. The JUCE_WASAPI_EXCLUSIVE flag has been removed from juce_audio_devices and all
  165. available WASAPI audio device modes (shared, shared low latency and exclusive)
  166. are available by default when JUCE_WASAPI is enabled. The
  167. AudioIODeviceType::createAudioIODeviceType_WASAPI() method which takes a single
  168. boolean argument has also been deprecated in favour of a new method which takes
  169. a WASAPIDeviceMode enum.
  170. Possible Issues
  171. ---------------
  172. Code that relied on the JUCE_WASAPI_EXCLUSIVE flag to disable WASAPI exclusive
  173. mode will no longer work.
  174. Workaround
  175. ----------
  176. Override the AudioDeviceManager::createAudioDeviceTypes() method to omit the
  177. WASAPI exclusive mode device if you do not want it to be available.
  178. Rationale
  179. ---------
  180. JUCE now supports shared low latency WASAPI audio devices via the AudioClient3
  181. interface and instead of adding an additional compile time config flag to
  182. enable this functionality, which adds complexity to the build process when not
  183. using the Projucer, JUCE makes all WASAPI device modes available by default.
  184. Change
  185. ------
  186. The fields representing Mac OS X 10.4 to 10.6 inclusive have been removed from
  187. the `OperatingSystemType` enum.
  188. Possible Issues
  189. ---------------
  190. Code that uses these fields will fail to build.
  191. Workaround
  192. ----------
  193. Remove references to these fields from user code.
  194. Rationale
  195. ---------
  196. JUCE is not supported on Mac OS X versions lower than 10.7, so it is a given
  197. that `getOperatingSystemType` will always return an OS version greater than or
  198. equal to 10.7. Code that changes behaviours depending on the OS version can
  199. assume that this version is at least 10.7.
  200. Change
  201. ------
  202. The JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING flag in juce_graphics is no
  203. longer used on iOS.
  204. Possible Issues
  205. ---------------
  206. Projects with this flag enabled may render differently on iOS.
  207. Workaround
  208. ----------
  209. There is no workaround.
  210. Rationale
  211. ---------
  212. When using a cached image to render Components with `setBufferedToImage (true)`
  213. the result now matches the default behaviour on iOS where fonts are not
  214. smoothed.
  215. Change
  216. ------
  217. Space, return and escape key events on the native macOS menu bar are no longer
  218. passed to the currently focused JUCE Component.
  219. Possible Issues
  220. ---------------
  221. Code relying on receiving these keyboard events will no longer work.
  222. Workaround
  223. ----------
  224. There is no workaround.
  225. Rationale
  226. ---------
  227. It should be possible for users with a keyboard or assistive device to navigate
  228. the menu, invoking the currently highlighted menu item with the space or return
  229. key and dismissing the menu with the escape key. These key events should not be
  230. passed to the application and doing so interferes with the accessibility of
  231. JUCE apps. Only passing these events to the native macOS menu means that JUCE
  232. apps behave as expected for users.
  233. Version 6.0.0
  234. =============
  235. Change
  236. ------
  237. The Convolution class interface was changed:
  238. - `loadImpulseResponse` member functions now take `enum class` parameters
  239. instead of `bool`.
  240. - `copyAndLoadImpulseResponseFromBlock` and
  241. `copyAndLoadImpulseResponseFromBuffer` were replaced by a new
  242. `loadImpulseResponse` overload.
  243. Possible Issues
  244. ---------------
  245. Code using the old interface will no longer compile, and will need to be
  246. updated.
  247. Workaround
  248. ----------
  249. Code that was previously loading impulse responses from binary data or from
  250. files can substitute old `bool` parameters with the newer `enum class`
  251. equivalents. Code that was previously passing buffers or blocks will need
  252. reworking so that the Convolution instance can take ownership of the buffer
  253. containing the impulse response.
  254. Rationale
  255. ---------
  256. The newer `enum class` parameters make user code much more readable, e.g.
  257. `loadImpulseResponse (file, Stereo::yes, Trim::yes, 0, Normalise::yes)` rather
  258. than `loadImpulseResponse (file, true, true, 0, true);`. By taking ownership of
  259. the passed buffer, the Convolution can avoid preallocating a large internal
  260. buffer, reducing memory usage when short impulse responses are used. Changing
  261. the ownership semantics of the buffer also makes it easier for users to avoid
  262. copies/allocations on the audio thread, and gives more flexibility to the
  263. implementation to run initialisation tasks on a background thread.
  264. Change
  265. ------
  266. All references to ROLI Ltd. (ROLI) have been changed to Raw Material Software
  267. Limited.
  268. Possible Issues
  269. ---------------
  270. Exising projects, particularly Android, may need to be resaved by the Projucer
  271. and have the old build artifacts deleted before they will build.
  272. Workaround
  273. ----------
  274. In Android projects any explicit mention of paths with the from "com.roli.*"
  275. should be changed to the form "com.rmsl.*".
  276. Rationale
  277. ---------
  278. This change reflects the change in ownership from ROLI to RMSL.
  279. Change
  280. ------
  281. The Windows DPI handling in the VST wrapper and hosting code has been
  282. refactored to be more stable.
  283. Possible Issues
  284. ---------------
  285. The new code uses a top-level AffineTransform to scale the JUCE editor window
  286. instead of native methods. Therefore any AudioProcessorEditors which have their
  287. own AffineTransform applied will no longer work correctly.
  288. Workaround
  289. ----------
  290. If you are using an AffineTransform to scale the entire plug-in window then
  291. consider putting the component you want to transform in a child of
  292. the editor and transform that instead. Alternatively, if you don't need a
  293. separate scale factor for each plug-in instance you can use
  294. Desktop::setGlobalScaleFactor().
  295. Rationale
  296. ---------
  297. The old code had some bugs when using OpenGL and when moving between monitors
  298. with different scale factors. The new code should fix these and DPI-aware
  299. plug-ins will scale correctly.
  300. Change
  301. ------
  302. Relative Xcode subproject paths specified in the Projucer are now relative to
  303. the build directory rather than the project directory.
  304. Possible Issues
  305. ---------------
  306. After being re-saved in the Projucer existing Xcode projects will fail to find
  307. any subprojects specified using a relative path.
  308. Workaround
  309. ----------
  310. Update the subproject path in the Projucer.
  311. Rationale
  312. ---------
  313. Most other Xcode specific paths are specified reltive to the build directory.
  314. This change brings the Xcode subproject path in line with the rest of the
  315. configuration.
  316. Version 5.4.6
  317. =============
  318. Change
  319. ------
  320. AudioProcessorValueTreeState::getRawParameterValue now returns a
  321. std::atomic<float>* instead of a float*.
  322. Possible Issues
  323. ---------------
  324. Existing code which explicitly mentions the type of the returned value, or
  325. interacts with the dereferenced float in ways unsupported by the std::atomic
  326. wrapper, will fail to compile. Certain evaluation-reordering compiler
  327. optimisations may no longer be possible.
  328. Workaround
  329. ----------
  330. Update your code to deal with a std::atomic<float>* instead of a float*.
  331. Rationale
  332. ---------
  333. Returning a std::atomic<float>* allows the JUCE framework to have much stronger
  334. guarantees about thread safety.
  335. Change
  336. ------
  337. Removed a workaround from the ASIOAudioIODevice::getOutputLatencyInSamples()
  338. and ASIOAudioIODevice::getInputLatencyInSamples() methods which was adding an
  339. arbitrary amount to the reported latencies to compensate for dodgy, old
  340. drivers.
  341. Possible Issues
  342. ---------------
  343. Code which relied on these altered values may now behave differently.
  344. Workaround
  345. ----------
  346. Update your code to deal with the new, correct values reported from the drivers
  347. directly.
  348. Rationale
  349. ---------
  350. JUCE will now return the latency values as reported by the drivers without
  351. adding anything to them. The workaround was for old drivers and the current
  352. drivers should report the correct values without the need for the workaround.
  353. Change
  354. ------
  355. The default behaviour of the AU and AUv3 plug-in wrappers is now to call
  356. get/setStateInformation instead of get/setProgramStateInformation.
  357. Possible Issues
  358. ---------------
  359. AudioProcessor subclasses which have overridden the default implementations of
  360. get/setProgramStateInformation (which simply call through to
  361. get/setStateInformation) may be unable to load previously saved state; state
  362. previously saved via a call to getProgramStateInformation will be presented to
  363. setStateInformation.
  364. Workaround
  365. ----------
  366. Enable the JUCE_AU_WRAPPERS_SAVE_PROGRAM_STATES configuration option in the
  367. juce_audio_plugin_client module to preserve backwards compatibility if
  368. required.
  369. Rationale
  370. ---------
  371. When using overridden get/setProgramStateInformation methods the previous
  372. behaviour of the AU and AUv3 wrappers does not correctly save and restore
  373. state.
  374. Version 5.4.5
  375. =============
  376. Change
  377. ------
  378. The alignment of text rendered on macOS using CoreGraphics may have shifted
  379. slightly, depending on the font you have used. The default macOS font has
  380. shifted downwards.
  381. Possible Issues
  382. ---------------
  383. Meticulously aligned text components of a GUI may now be misaligned.
  384. Workaround
  385. ----------
  386. Use a custom LookAndFeel to change the location where text is drawn, or use a
  387. different font that matches the previous alignment of your original font.
  388. Rationale
  389. ---------
  390. This was an unintentional change resulting from moving away from a deprecated
  391. macOS text API. The new alignment is consistent with other rendering engines
  392. (web browsers and text editors) and the software renderer.
  393. Change
  394. ------
  395. The JUCEApplicationBase::backButtonPressed() method now returns a bool to
  396. indicate whether the back event was handled or not.
  397. Possible Issues
  398. ---------------
  399. Applications which override this method will fail to compile.
  400. Workaround
  401. ----------
  402. You will need to update your code to return a bool indicating whether the back
  403. event was handled or not.
  404. Rationale
  405. ---------
  406. The back button behaviour on Android was previously broken as it would not do
  407. anything. The new code will correctly call finish() on the Activity when the
  408. back button is pressed but this method now allows the user to override this to
  409. implement their own custom navigation behaviour by returning true to indicate
  410. that it has been handled.
  411. Change
  412. ------
  413. The AudioBlock class has been refactored and some of the method names have
  414. changed. Additionally the `const` behaviour now mirrors that of `std::span`,
  415. with the `const`-ness of the contained data decoupled from the `const`-ness of
  416. the container.
  417. Possible Issues
  418. ---------------
  419. Code using the old method names or violating `const`-correctness will fail to
  420. compile.
  421. Workaround
  422. ----------
  423. You will need to update your code to use the new method names and select an
  424. appropriate `const`-ness for the AudioBlock and the data it references.
  425. Rationale
  426. ---------
  427. The names of some of the methods in the AudioBlock class were ambiguous,
  428. particularly when chaining methods involving references to other blocks. The
  429. interaction between the `const`-ness of the AudioBlock and the `const`-ness of
  430. the referenced data was also ambiguous and has now been standardised to the
  431. same behaviour as other non-owning data views like `std::span`.
  432. Version 5.4.4
  433. =============
  434. Change
  435. ------
  436. The Visual Studio 2013 exporter has been removed from the Projucer and we will
  437. no longer maintain backwards compatibility with Visual Studio 2013 in JUCE.
  438. Possible Issues
  439. ---------------
  440. It is no longer possible to create Visual Studio 2013 projects from the
  441. Projucer or compile JUCE-based software using Visual Studio 2013.
  442. Workaround
  443. ----------
  444. If you are using Visual Studio 2013 to build your projects you will need to
  445. update to a more modern version of Visual Studio.
  446. Rationale
  447. ---------
  448. Of all the platforms JUCE supports Visual Studio 2013 was holding us back the
  449. most in terms of C++ features we would like to use more broadly across the
  450. codebase. It is still possible to target older versions of Windows with more
  451. modern versions of Visual Studio. Until recently the AAX SDK was distributed as
  452. a Visual Studio 2013 project, but this is now provided as a Visual Studio 2017
  453. project.
  454. Change
  455. ------
  456. JUCE is moving towards using C++11 pointer container types instead of passing
  457. raw pointers as arguments and return values.
  458. Possible Issues
  459. ---------------
  460. You will need to change your code to pass std::unique_ptr into and out of
  461. various functions across JUCE's API.
  462. Workaround
  463. ----------
  464. None
  465. Rationale
  466. ---------
  467. Indicating ownership through the transfer of smart pointer types has been part
  468. of mainstream C++ for a long time and this change enforces memory safety by
  469. default in most situations.
  470. Change
  471. ------
  472. SystemTrayIconComponent::setIconImage now takes two arguments, rather than one.
  473. The new argument is a template image for use on macOS where all non-transparent
  474. regions will render in a monochrome colour determined dynamically by the
  475. operating system.
  476. Possible Issues
  477. ---------------
  478. You will now need to provide two images to display a SystemTrayIconComponent
  479. and the SystemTrayIconComponent will have a different appearance on macOS.
  480. Workaround
  481. ----------
  482. If you are not targeting macOS then you can provide an empty image, `{}`, for
  483. the second argument. If you are targeting macOS then you will likely need to
  484. design a new monochrome icon.
  485. Rationale
  486. ---------
  487. The introduction of "Dark Mode" in macOS 10.14 means that menu bar icons must
  488. support several different colours and highlight modes to retain the same
  489. appearance as the native Apple icons. Doing this correctly without delegating
  490. the behaviour to the operating system is extremely cumbersome, and the APIs we
  491. were previously using to interact with menu bar items have been deprecated.
  492. Change
  493. ------
  494. The AudioBlock class now differentiates between const and non-const data.
  495. Possible Issues
  496. ---------------
  497. The return type of the getInputBlock() method of the ProcessContextReplacing
  498. and ProcessContextNonReplacing classes has changed from AudioBlock<X> to
  499. AudioBlock<const X>.
  500. Workaround
  501. ----------
  502. For ProcessContextReplacing you should use getOutputBlock() instead of
  503. getInputBlock(). For ProcessContextNonReplacing attempting to modify the input
  504. block is very likely an error.
  505. Rationale
  506. ---------
  507. This change makes the intent of the code much clearer and means that we can
  508. remove some const_cast operations.
  509. Change
  510. ------
  511. The formatting of floating point numbers written to XML and JSON files has
  512. changed.
  513. Note that there is no change in precision - the XML and JSON files containing
  514. the new format numbers will parse in exactly the same way, it is only the
  515. string representation that has changed.
  516. Possible Issues
  517. ---------------
  518. If you rely upon exactly reproducing XML or JSON files then the new files may
  519. be different.
  520. Workaround
  521. ----------
  522. Update any reference XML or JSON files to use the new format.
  523. Rationale
  524. ---------
  525. The new format retains full precision, provides a human friendly representation
  526. of values near 1, and uses scientific notation for small and large numbers.
  527. This prevents needless file size bloat from numbers like 0.00000000000000001.
  528. Version 5.4.3
  529. =============
  530. Change
  531. ------
  532. The global user module path setting in the Projucer can now only contain a
  533. single path.
  534. Possible Issues
  535. ---------------
  536. Projects that previously relied on using multiple global user module paths
  537. separated by a semicolon will fail to find these modules after re-saving.
  538. Workaround
  539. ----------
  540. Replace the multiple paths with a single global user module path.
  541. Rationale
  542. ---------
  543. Using multiple global user module paths did not work when saving a project
  544. which exported to different OSes. Only allowing a single path will prevent this
  545. from silently causing issues.
  546. Version 5.4.2
  547. =============
  548. Change
  549. ------
  550. The return type of Block::getBlockAreaWithinLayout() has been changed from
  551. Rectangle to a simpler BlockArea struct.
  552. Possible Issues
  553. ---------------
  554. Classes that derive from Block and implement this pure virtual method will no
  555. longer compile due to a change in the function signature.
  556. Workaround
  557. ----------
  558. Update the method to return a BlockArea struct and update code that calls
  559. getBlockAreaWithinLayout to handle a BlockArea instead of a Rectangle.
  560. Rationale
  561. ---------
  562. The juce_blocks_basics is ISC licensed and therefore cannot depend on the
  563. GPL/Commercial licensed juce_graphics module that contains Rectangle.
  564. Change
  565. ------
  566. Renaming and deletion of open file handles on Windows is now possible using the
  567. FILE_SHARE_DELETE flag.
  568. Possible Issues
  569. ---------------
  570. Previous code that relied on open files not being able to be renamed or deleted
  571. on Windows may fail.
  572. Workaround
  573. ----------
  574. No workaround.
  575. Rationale
  576. ---------
  577. This unifies the behaviour across OSes as POSIX systems already allow this.
  578. Change
  579. ------
  580. Multiple changes to low-level, non-public JNI and Android APIs.
  581. Possible Issues
  582. ---------------
  583. If you were using any non-public, low-level JNI macros, calling java code or
  584. recieving JNI callbacks, then your code will probably no longer work. See the
  585. forum for further details.
  586. Workaround
  587. ----------
  588. See the forum for further details.
  589. Rationale
  590. ---------
  591. See the forum for further details.
  592. Change
  593. ------
  594. The minimum Android version for a JUCE app is now Android 4.1
  595. Possible Issues
  596. ---------------
  597. Your app may not run on very old versions of Android (less than 0.5% of the
  598. devices).
  599. Workaround
  600. ----------
  601. There is no workaround.
  602. Rationale
  603. ---------
  604. Less than 0.5% of all devices in the world run versions of Android older than
  605. Android 4.1. In the interest of keeping JUCE code clean and lean, we must
  606. depricate support for very old Android versions from time to time.
  607. Version 5.4.0
  608. =============
  609. Change
  610. ------
  611. The use of WinRT MIDI functions has been disabled by default for any version
  612. of Windows 10 before 1809 (October 2018 Update).
  613. Possible Issues
  614. ---------------
  615. If you were previously using WinRT MIDI functions on older versions of Windows
  616. then the new behaviour is to revert to the old Win32 MIDI API.
  617. Workaround
  618. ----------
  619. Set the preprocessor macro JUCE_FORCE_WINRT_MIDI=1 (in addition to the
  620. previously selected JUCE_USE_WINRT_MIDI=1) to allow the use of the WinRT API on
  621. older versions of Windows.
  622. Rationale
  623. ---------
  624. Until now JUCE's support for the Windows 10 WinRT MIDI API was experimental,
  625. due to longstanding issues within the API itself. These issues have been
  626. addressed in the Windows 10 1809 (October 2018 Update) release.
  627. Change
  628. ------
  629. The VST2 SDK embedded within JUCE has been removed.
  630. Possible Issues
  631. ---------------
  632. 1. Building or hosting VST2 plug-ins requires header files from the VST2 SDK,
  633. which is no longer part of JUCE.
  634. 2. Building a VST2-compatible VST3 plug-in (the previous default behaviour in
  635. JUCE) requires header files from the VST2 SDK, which is no longer part of
  636. JUCE.
  637. Workaround
  638. ----------
  639. 1. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or
  640. older) VST3 SDK or JUCE version 5.3.2. You should put the VST2 SDK in your
  641. header search paths or use the "VST (Legacy) SDK Folder" fields in the
  642. Projucer.
  643. 2. For new plug-in projects where you will be releasing both a VST2 and VST3
  644. version, and you want the VST3 plug-in to replace the VST2 plug-in in
  645. hosts that support it, then you should enable the JUCE_VST3_CAN_REPLACE_VST2
  646. option.
  647. 3. When a new JUCE plug-in project is created the value of
  648. JUCE_VST3_CAN_REPLACE_VST2 will be set to zero.
  649. Rationale
  650. ---------
  651. Distributing VST2 plug-ins requires a VST2 license from Steinberg. Following
  652. Steinberg's removal of the VST2 SDK from their public SDKs we are also removing
  653. the VST2 SDK from the JUCE codebase.
  654. Change
  655. ------
  656. The AudioProcessorValueTreeState::createAndAddParameter function has been
  657. deprecated.
  658. Possible Issues
  659. ---------------
  660. Deprecation warnings will be seen when compiling code which uses this function
  661. and eventually builds will fail when it is later removed from the API.
  662. Workaround
  663. ----------
  664. Previous calls to
  665. createAndAddParameter (paramID, paramName, ...);
  666. can be directly replaced with
  667. using Parameter = AudioProcessorValueTreeState::Parameter;
  668. createAndAddParameter (std::make_unique<Parameter> (paramID, paramName, ...));
  669. but an even better approach is to use the new AudioProcessorValueTreeState
  670. constructor where you can pass both RangedAudioParameters and
  671. AudioProcessorParameterGroups of RangedAudioParameters to the
  672. AudioProcessorValueTreeState and initialise the ValueTree simultaneously.
  673. Rationale
  674. ---------
  675. The new createAndAddParameter method is much more flexible and enables any
  676. parameter types derived from RangedAudioParameter to be managed by the
  677. AudioProcessorValueTreeState.
  678. Change
  679. ------
  680. The Projucer's per-exporter Android SDK/NDK path options have been removed.
  681. Possible Issues
  682. ---------------
  683. Projects that previously used these fields may no longer build.
  684. Workaround
  685. ----------
  686. Use the Projucer's global paths settings to point to these directories, either
  687. by opening the "Projucer/File->Global Paths..." menu item or using the
  688. "--set-global-search-path" command-line option.
  689. Rationale
  690. ---------
  691. Having multiple places where the paths could be set was confusing and could
  692. cause unexpected mismatches.
  693. Change
  694. ------
  695. SystemStats::getDeviceDescription() will now return the device code on iOS e.g.
  696. "iPhone7, 2" for an iPhone 6 instead of just "iPhone".
  697. Possible Issues
  698. ---------------
  699. Code that previously relied on this method returning either explicitly "iPhone"
  700. or "iPad" may no longer work.
  701. Workaround
  702. ----------
  703. Modify this code to handle the new device code string e.g. by changing:
  704. SystemStats::getDeviceDescription() == "iPhone";
  705. to
  706. SystemStats::getDeviceDescription().contains ("iPhone");.
  707. Rationale
  708. ---------
  709. The exact device model can now be deduced from this information instead of just
  710. the device family.
  711. Change
  712. ------
  713. DragAndDropContainer::performExternalDragDropOfFiles() and
  714. ::performExternalDragDropOfText() are now asynchronous on Windows.
  715. Possible Issues
  716. ---------------
  717. Code that previously relied on these operations being synchronous and blocking
  718. until completion will no longer work as the methods will return immediately and
  719. run asynchronously.
  720. Workaround
  721. ----------
  722. Use the callback argument that has been added to these methods to register a
  723. lambda that will be called when the operation has been completed.
  724. Rationale
  725. ---------
  726. The behaviour of these methods is now consistent across all platforms and the
  727. method no longer blocks the message thread on Windows.
  728. Change
  729. ------
  730. AudioProcessor::getTailLengthSeconds can now return infinity for
  731. VST/VST3/AU/AUv3.
  732. Possible Issues
  733. ---------------
  734. If you are using the result of getTailLengthSeconds to allocate a buffer in
  735. your host, then your host will now likely crash when loading a plug-in with an
  736. infinite tail time.
  737. Workaround
  738. ----------
  739. Rewrite your code to not use the result of getTailLengthSeconds directly to
  740. allocate a buffer.
  741. Rationale
  742. ---------
  743. Before this change there was no way for a JUCE plug-in to report an infinite
  744. tail time.
  745. Version 5.3.2
  746. =============
  747. Change
  748. ------
  749. The behaviour of an UndoManager used by an AudioProcessorValueTreeState has
  750. been improved.
  751. Possible Issues
  752. ---------------
  753. If your plug-in contains an UndoManager used by an AudioProcessorValueTreeState
  754. and relies upon the old behaviour of the UndoManager then it is possible that
  755. the new behaviour is no longer appropriate for your use case.
  756. Workaround
  757. ----------
  758. Use an external UndoManager to reproduce the old behaviour manually.
  759. Rationale
  760. ---------
  761. This change fixes a few bugs in the behaviour of an UndoManager used by an
  762. AudioProcessorValueTreeState.
  763. Change
  764. ------
  765. JUCE no longer supports OS X deployment targets earlier than 10.7.
  766. Possible Issues
  767. ---------------
  768. If you were previously targeting OS X 10.5 or 10.6 you will no longer be able
  769. to build JUCE-based products compatible with those platforms.
  770. Workaround
  771. ----------
  772. None. With the appropriate JUCE licence you may be able to backport new JUCE
  773. features, but there will be no official support for this.
  774. Rationale
  775. ---------
  776. Increasing the minimum supported OS X version allows the JUCE codebase to make
  777. use of the more modern C++ features found in the 10.7 standard library, which
  778. in turn will increase thread and memory safety.
  779. Version 5.3.0
  780. =============
  781. Change
  782. ------
  783. The JUCE examples have been cleaned up, modernised and converted into PIPs
  784. (Projucer Instant Projects). The JUCE Demo has been removed and replaced by the
  785. DemoRunner application and larger projects such as the Audio Plugin Host and
  786. the Network Graphics Demo have been moved into the extras directory.
  787. Possible Issues
  788. ---------------
  789. 1. Due to the large number of changes that have occurred in the JUCE Git
  790. repository, pulling this version may result in a messy folder structure with
  791. empty directories that have been removed.
  792. 2. The JUCE Demo project is no longer in the JUCE repository.
  793. 3. The Audio Plugin Host project has moved from the examples directory to the
  794. extras directory.
  795. Workaround
  796. ----------
  797. 1. Run a Git clean command (git clean -xdf) in your JUCE directory to remove
  798. all untracked files, directories and build products.
  799. 2. The new DemoRunner application, located in extras/DemoRunner, can be used to
  800. preview all the JUCE examples and see the code side-by-side.
  801. 3. Change any file paths that depended on the plugin host project being located
  802. in the examples directory to use the extras directory instead.
  803. Rationale
  804. ---------
  805. The JUCE examples had inconsistent naming, coding styles and the projects and
  806. build products took up a large amount of space in the repository. Replacing
  807. them with PIPs reduces the file size and allows us to categorise the examples
  808. better, as well as cleaning up the code.
  809. Change
  810. ------
  811. When hosting plug-ins all AudioProcessor methods of managing parameters that
  812. take a parameter index as an argument have been deprecated.
  813. Possible Issues
  814. ---------------
  815. A single assertion will be fired in debug builds on the first use of a
  816. deprecated function.
  817. Workaround
  818. ----------
  819. When hosting plug-ins you should use the AudioProcessor::getParameters() method
  820. and interact with parameters via the returned array of
  821. AudioProcessorParameters. For a short-term fix you can also continue past the
  822. assertion in your debugger, or temporarily modify the JUCE source code to
  823. remove it.
  824. Rationale
  825. ---------
  826. Given the structure of JUCE's API it is impossible to deprecate these functions
  827. using only compile-time messages. Therefore a single assertion, which can be
  828. safely ignored, serves to indicate that these functions should no longer be
  829. used. The move away from the AudioProcessor methods both improves the interface
  830. to that class and makes ongoing development work much easier.
  831. Change
  832. ------
  833. This InAppPurchases class is now a JUCE Singleton. This means that you need
  834. to get an instance via InAppPurchases::getInstance(), instead of storing a
  835. InAppPurchases object yourself.
  836. Possible Issues
  837. ---------------
  838. Any code using InAppPurchases needs to be updated to retrieve a singleton
  839. pointer to InAppPurchases.
  840. Workaround
  841. ----------
  842. Instead of holding a InAppPurchase member yourself, you should get an instance
  843. via InAppPurchases::getInstance(), e.g.
  844. instead of:
  845. InAppPurchases iap;
  846. iap.purchaseProduct (...);
  847. call:
  848. InAppPurchases::getInstance()->purchaseProduct (...);
  849. Rationale
  850. ---------
  851. This change was required to fix an issue on Android where on failed transaction
  852. a listener would not get called.
  853. Change
  854. ------
  855. JUCE's MPE classes have been updated to reflect the official specification
  856. recently approved by the MIDI Manufacturers Association (MMA).
  857. Possible Issues
  858. ---------------
  859. The most significant changes have occurred in the MPEZoneLayout classes and
  860. programs using the higher level MPE classes such as MPEInstrument,
  861. MPESynthesiser, MPESynthesiserBase and MPESynthesiserVoice should be
  862. unaffected.
  863. Previously, any MIDI channel from 1 - 15 could be selected to be the master
  864. channel of an MPE zone, with a specified number of member channels ascending
  865. from the master channel + 1. However, in the new specification this has been
  866. simplified so that a device only has a lower and/or an upper zone, where the
  867. lower zone has master channel 1 and assigns new member channels ascending from
  868. channel 2 and the upper zone has master channel 16 and assigns new member
  869. channels descending from channel 15.
  870. Workaround
  871. ----------
  872. Use the MPEZoneLayout::setLowerZone() and MPEZoneLayout::setUpperZone() methods
  873. to set zone layouts.
  874. Any UI that allows users to select and set zones on an MPE instrument should
  875. also be updated to reflect the specification changes.
  876. Rationale
  877. ---------
  878. The MPE classes in JUCE are out of date and should be updated to reflect the
  879. new, official MPE standard.
  880. Version 5.2.1
  881. =============
  882. Change
  883. ------
  884. Calling JUCEApplicationBase::quit() on Android will now really quit the app,
  885. rather than just placing it in background. Starting with API level 21 (Android
  886. 5.0), the app will not appear in recent apps list after calling quit(). Prior
  887. to API 21, the app will still appear in recent app lists but when a user
  888. chooses the app, a new instance of the app will be started.
  889. Possible Issues
  890. ---------------
  891. Any code calling JUCEApplicationBase::quit() to place the app in background
  892. will close the app instead.
  893. Workaround
  894. ----------
  895. Use Process::hide().
  896. Rationale
  897. ---------
  898. The old behaviour JUCEApplicationBase::quit() was confusing JUCE code, as a new
  899. instance of JUCE app was attempted to be created, while the older instance was
  900. still running in background. This would result in assertions when starting a
  901. second instance.
  902. Change
  903. ------
  904. On Windows, release builds will now link to the dynamic C++ runtime by default
  905. Possible Issues
  906. ---------------
  907. If you are creating a new .jucer project, then your plug-in will now link to
  908. the dynamic C++ runtime by default, which means that you MUST ensure that the
  909. C++ runtime libraries exist on your customer's computers.
  910. Workaround
  911. ----------
  912. If you are only targeting Windows 10, then the C++ runtime is now part of the
  913. system core components and will always exist on the computers of your customers
  914. (just like kernel332.dll, for example). If you are targeting Windows versions
  915. between Vista and Windows 10, then you should build your plug-in with the
  916. latest updated version of VS2015 or later, which ensures that it's linked to
  917. the universal runtime. Universal runtime is part of the system's core libraries
  918. on Windows 10 and on Windows versions Vista to 8.1, it will be available on
  919. your customer's computers via Windows Update. Unfortunately, if your customer
  920. has just installed Windows 8.1 to Vista on a fresh computer, then there is a
  921. chance that the update mechanism for the universal runtime hasn't triggered yet
  922. and your plug-in may still fail. Your installer should prompt the user to
  923. install all the Windows updates in this case or you can deploy the universal
  924. runtime as a redistributable with your installer. If you are targeting earlier
  925. versions of Windows then you should always include the runtime as a
  926. redistributable with your plug-in's installer. Alternatively, you can change
  927. the runtime linking to static (however, see 'Rationale' section).
  928. Rationale
  929. ---------
  930. In a recent update to Windows 10, Microsoft has limited the number of fiber
  931. local storage (FLS) slots per process. Effectively, this limits how many
  932. plug-ins with static runtime linkage can be loaded into a DAW. In the worst
  933. case, this limits the total number of plug-ins to a maximum of 64 plug-ins.
  934. There is no workaround for DAW vendors and the only solution is to push plug-in
  935. vendors to use the dynamic runtime. To help with this, JUCE has decided to make
  936. dynamic runtime linkage the default in JUCE.
  937. Change
  938. ------
  939. AudioProcessorGraph interface has changed in a number of ways - Node objects
  940. are now reference counted, there are different accessor methods to iterate
  941. them, and misc other small improvements to the API
  942. Possible Issues
  943. ---------------
  944. The changes won't cause any silent errors in user code, but will require some
  945. manual refactoring
  946. Workaround
  947. ----------
  948. Just find equivalent new methods to replace existing code.
  949. Rationale
  950. ---------
  951. The graph class was extremely old and creaky, and these changes is the start of
  952. an improvement process that should eventually result in it being broken down
  953. into fundamental graph building block classes for use in other contexts.
  954. Version 5.2.0
  955. =============
  956. Change
  957. ------
  958. Viewport now enables "scroll on drag" mode by default on Android and iOS.
  959. Possible Issues
  960. ---------------
  961. Any code relying on "scroll on drag" mode being turned off by default, should
  962. disable it manually.
  963. Workaround
  964. ----------
  965. None.
  966. Rationale
  967. ---------
  968. It is expected on mobile devices to be able to scroll a list by just a drag,
  969. rather than using a dedicated scrollbar. The scrollbar is still available
  970. though if needed.
  971. Change
  972. ------
  973. The previous setting of Android exporter "Custom manifest xml elements"
  974. creating child nodes of <application> element has been replaced by "Custom
  975. manifest XML content" setting that allows to specify the content of the entire
  976. manifest instead. Any previously values of the old setting will be used in the
  977. new setting by default, and they will need changing as mentioned in Workaround.
  978. The custom content will be merged with the content auto-generated by Projucer.
  979. Any custom elements or custom attributes will override the ones set by
  980. Projucer. Projucer will also automatically add any missing and required
  981. elements and attributes.
  982. Possible Issues
  983. ---------------
  984. If a Projucer project used "Custom manifest xml elements" field, the value will
  985. no longer be compatible with the project generated in the latest Projucer
  986. version. The solution is very simple and quick though, as mentioned in the
  987. Workaround section.
  988. Workaround
  989. ----------
  990. For any elements previously used, simply embed them explicitly in
  991. <manifest><application> elements, for example instead of:
  992. <meta-data android:name="paramId1" android:value="paramValue1"/>
  993. <meta-data android:name="paramId2" android:value="paramValue2"/>
  994. simply write:
  995. <manifest>
  996. <application>
  997. <meta-data android:name="paramId1" android:value="paramValue1"/>
  998. <meta-data android:name="paramId2" android:value="paramValue2"/>
  999. </application>
  1000. </manifest>
  1001. Rationale
  1002. ---------
  1003. To maintain the high level of flexibility of generated Android projects and to
  1004. avoid creating fields in Projucer for every possible future parameter, it is
  1005. simpler to allow to set up the required parameters manually. This way it is not
  1006. only possible to add any custom elements but it is also possible to override
  1007. the default attributes assigned by Projucer for the required elements. For
  1008. instance, if the default value of <supports-screens> element is not
  1009. satisfactory because you want a support for x-large screens only, simply set
  1010. "Custom manifest XML content" to:
  1011. <manifest>
  1012. <supports-screens android:xlargeScreens="true"/>
  1013. </manifest>
  1014. Version 5.1.2
  1015. =============
  1016. Change
  1017. ------
  1018. The method used to classify AudioUnit, VST3 and AAX plug-in parameters as
  1019. either continuous or discrete has changed, and AudioUnit and AudioUnit v3
  1020. parameters are marked as high precision by default.
  1021. Possible Issues
  1022. ---------------
  1023. Plug-ins: DAW projects with automation data written by an AudioUnit, AudioUnit
  1024. v3 VST3 or AAX plug-in built with JUCE version 5.1.1 or earlier may load
  1025. incorrectly when opened by an AudioUnit, AudioUnit v3, VST3 or AAX plug-in
  1026. built with JUCE version 5.1.2 and later.
  1027. Hosts: The AudioPluginInstance::getParameterNumSteps method now returns correct
  1028. values for AU and VST3 plug-ins.
  1029. Workaround
  1030. ----------
  1031. Plug-ins: Enable JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE in the
  1032. juce_audio_plugin_client module config page in the Projucer.
  1033. Hosts: Use AudioPluginInstance::getDefaultNumParameterSteps as the number of
  1034. steps for all parameters.
  1035. Rationale
  1036. ---------
  1037. The old system for presenting plug-in parameters to a host as either continuous
  1038. or discrete is inconsistent between plug-in types and lacks sufficient
  1039. flexibility. This change harmonises the behaviour and allows individual
  1040. parameters to be marked as continuous or discrete. If AudioUnit and AudioUnit
  1041. v3 parameters are not marked as high precision then hosts like Logic Pro only
  1042. offer a limited number of parameter values, which again produces different
  1043. behaviour for different plug-in types.
  1044. Change
  1045. ------
  1046. A new FrameRateType fps23976 has been added to AudioPlayHead,
  1047. Possible Issues
  1048. ---------------
  1049. Previously JUCE would report the FrameRateType fps24 for both 24 and 23.976
  1050. fps. If your code uses switch statements (or similar) to handle all possible
  1051. frame rate types, then this change may cause it to fall through.
  1052. Workaround
  1053. ----------
  1054. Add fps23976 to your switch statement and handle it appropriately.
  1055. Rationale
  1056. ---------
  1057. JUCE should be able to handle all popular frame rate codes but was missing
  1058. support for 23.976.
  1059. Change
  1060. ------
  1061. The String (bool) constructor and operator<< (String&, bool) have been
  1062. explicitly deleted.
  1063. Possible Issues
  1064. ---------------
  1065. Previous code which relied on an implicit bool to int type conversion to
  1066. produce a String will not compile.
  1067. Workaround
  1068. ----------
  1069. Cast your bool to an integer to generate a string representation of it.
  1070. Rationale
  1071. ---------
  1072. Letting things implicitly convert to bool to produce a String opens the door to
  1073. all kinds of nasty type conversion edge cases. Furthermore, before this change,
  1074. MacOS would automatically convert bools to ints but this wouldn't occur on
  1075. different platform. Now the behaviour is consistent across all operating
  1076. systems supported by JUCE.
  1077. Change
  1078. ------
  1079. The writeAsJSON virtual method of the DynamicObject class requires an
  1080. additional parameter, maximumDecimalPlaces, to specify the maximum precision of
  1081. floating point numbers.
  1082. Possible Issues
  1083. ---------------
  1084. Classes which inherit from DynamicObject and override this method will need to
  1085. update their method signature.
  1086. Workaround
  1087. ----------
  1088. Your custom DynamicObject class can choose to ignore the additional parameter
  1089. if you don't wish to support this behaviour.
  1090. Rationale
  1091. ---------
  1092. When serialising the results of calculations to JSON the rounding of floating
  1093. point numbers can result in numbers with 17 significant figures where only a
  1094. few are required. This change to DynamicObject is required to support
  1095. truncating those numbers.
  1096. Version 5.1.0
  1097. =============
  1098. Change
  1099. ------
  1100. The JUCE_COMPILER_SUPPORTS_LAMBDAS preprocessor macro has been removed.
  1101. Possible Issues
  1102. ---------------
  1103. If your project is using JUCE_COMPILER_SUPPORTS_LAMBDAS in your source code
  1104. then it will likely evaluate to "false" and you could end up unnecessarily
  1105. using code paths which avoid lambda functions.
  1106. Workaround
  1107. ----------
  1108. Remove the usage of JUCE_COMPILER_SUPPORTS_LAMBDAS from your code.
  1109. Rationale
  1110. ---------
  1111. Lambda functions are now available on all platforms that JUCE supports.
  1112. Change
  1113. ------
  1114. The option to set the C++ language standard is now located in the project
  1115. settings instead of the build configuration settings.
  1116. Possible Issues
  1117. ---------------
  1118. Projects that had a specific version of the C++ language standard set for
  1119. exporter build configurations will instead use the default (C++11) when
  1120. re-saving with the new Projucer.
  1121. Workaround
  1122. ----------
  1123. Change the "C++ Language Standard" setting in the main project settings to the
  1124. required version - the Projucer will add this value to the exported project as
  1125. a compiler flag when saving exporters.
  1126. Rationale
  1127. ---------
  1128. Having a different C++ language standard option for each build configuration
  1129. was unnecessary and was not fully implemented for all exporters. Changing it to
  1130. a per-project settings means that the preference will propagate to all
  1131. exporters and only needs to be set in one place.
  1132. Change
  1133. ------
  1134. PopupMenus now scale according to the AffineTransform and scaling factor of
  1135. their target components.
  1136. Possible Issues
  1137. ---------------
  1138. Developers who have manually scaled their PopupMenus to fit the scaling factor
  1139. of the parent UI will now have the scaling applied two times in a row.
  1140. Workaround
  1141. ----------
  1142. 1. Do not apply your own manual scaling to make your popups match the UI
  1143. scaling
  1144. or
  1145. 2. Override the Look&Feel method
  1146. PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and
  1147. return false. See
  1148. https://github.com/juce-framework/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725
  1149. Rationale
  1150. ---------
  1151. Previously, PopupMenus would not scale if the GUI of the target component (or
  1152. any of it’s parents) were scaled. The only way to scale PopupMenus was via the
  1153. global scaling factor. This had several drawbacks as the global scaling factor
  1154. would scale everything. This was especially problematic in plug-in editors.
  1155. Change
  1156. ------
  1157. Removed the setSecurityFlags() method from the Windows implementation of
  1158. WebInputStream as it disabled HTTPS security features.
  1159. Possible Issues
  1160. ---------------
  1161. Any code previously relying on connections to insecure webpages succeeding will
  1162. no longer work.
  1163. Workaround
  1164. ----------
  1165. Check network connectivity on Windows and re-write any code that relied on
  1166. insecure connections.
  1167. Rationale
  1168. ---------
  1169. The previous behaviour resulted in network connections on Windows having all
  1170. the HTTPS security features disabled, exposing users to network attacks. HTTPS
  1171. connections on Windows are now secure and will fail when connecting to an
  1172. insecure web address.
  1173. Change
  1174. ------
  1175. Pointer arithmetic on a pointer will have the same result regardless if it is
  1176. wrapped in JUCE's Atomic class or not.
  1177. Possible Issues
  1178. ---------------
  1179. Any code using pointer arithmetic on Atomic<T*> will now have a different
  1180. result leading to undefined behaviour or crashes.
  1181. Workaround
  1182. ----------
  1183. Re-write your code in a way that it does not depend on your pointer being
  1184. wrapped in JUCE's Atomic or not. See rationale.
  1185. Rationale
  1186. ---------
  1187. Before this change, pointer arithmetic with JUCE's Atomic type would yield
  1188. confusing results. For example, the following code would assert before this
  1189. change:
  1190. int* a; Atomic<int*> b;
  1191. jassert (++a == ++b);
  1192. Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's
  1193. Atomic always advances it's underlying pointer by a single byte. The same is
  1194. true for operator+=/operator-= and operator--. The difference in behaviour is
  1195. confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with
  1196. std::atomic.
  1197. Version 4.3.1
  1198. =============
  1199. Change
  1200. ------
  1201. JUCE has changed the way native VST3/AudioUnit parameter ids are calculated.
  1202. Possible Issues
  1203. ---------------
  1204. DAW projects with automation data written by an AudioUnit or VST3 plug-in built
  1205. with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit
  1206. or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using
  1207. JUCE_FORCE_USE_LEGACY_PARAM_IDS are not affected.
  1208. Workaround
  1209. ----------
  1210. Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the
  1211. juce_audio_plugin_client module config page in the Projucer. For new plug-ins,
  1212. be sure to use the default value for this property.
  1213. Rationale
  1214. --------
  1215. JUCE needs to convert between its own JUCE parameter id format (strings) to the
  1216. native parameter id formats of the various plug-in backends. For VST3 and
  1217. AudioUnits, JUCE uses a hash function to generate a numeric id. However, some
  1218. VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any
  1219. parameters that have a negative parameter id. Therefore, the hash function for
  1220. VST3/AudioUnits needed to be changed to only return positive-valued hashes.
  1221. Version 4.3.0
  1222. =============
  1223. Change
  1224. ------
  1225. A revised multi-bus API was released which supersedes the previously flawed
  1226. multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive).
  1227. Possible Issues
  1228. ---------------
  1229. If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive),
  1230. then you will need to update your plug-in to the new multi-bus API. Pre JUCE
  1231. 4.0.0 plug-ins are not affected apart from other breaking changes listed in
  1232. this document.
  1233. Woraround
  1234. ---------
  1235. None.
  1236. Rationale
  1237. --------
  1238. A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version
  1239. 4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE
  1240. 4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API
  1241. compatibility. However, the new multi-bus API is not compatible with the flawed
  1242. multi-bus API (JUCE version 4.0.0 - 4.2.4).
  1243. Change
  1244. ------
  1245. JUCE now generates the AAX plug-in bus layout configuration id independent from
  1246. the position as it appears in the Projucer’s legacy "Channel layout
  1247. configuration" field.
  1248. Possible Issues
  1249. ---------------
  1250. ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may
  1251. load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0
  1252. versions of JUCE.
  1253. Workaround
  1254. ----------
  1255. Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually
  1256. override which AAX plug-in id is associated to a specific bus layout of your
  1257. plug-in. This workaround is only necessary if you have released your plug-in
  1258. built with a version previous to JUCE 4.3.0.
  1259. Rationale
  1260. --------
  1261. The new multi-bus API offers more features, flexibility and accuracy in
  1262. specifying bus layouts which cannot be expressed by the Projucer’s legacy
  1263. "Channel layout configuration" field. The native plug-in format backends use
  1264. the new multi-bus callback APIs to negotiate channel layouts with the host -
  1265. including the AAX plug-in ids assigned to specific bus layouts. With the
  1266. callback API, there is no notion of an order in which the channel
  1267. configurations appear - as was the case with the legacy "Channel layout
  1268. configuration" field - and therefore cannot be used to generate the AAX plug-in
  1269. id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does
  1270. transparently convert the legacy "Channel layout configuration" field to the
  1271. new callback based multi-bus API, but this does not take the order into account
  1272. in which the channel configurations appear in the legacy "Channel layout
  1273. configuration" field.
  1274. Version 4.2.1
  1275. =============
  1276. Change
  1277. ------
  1278. JUCE now uses the paramID property used in AudioProcessorParameterWithID to
  1279. uniquely identify parameters to the host.
  1280. Possible Issues
  1281. ---------------
  1282. DAW projects with automation data written by an audio plug-in built with pre
  1283. JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with
  1284. JUCE 4.2.1 and later.
  1285. Workaround
  1286. ----------
  1287. Enable JUCE_FORCE_USE_LEGACY_PARAM_IDS in the juce_audio_plugin_client module config
  1288. page in the Projucer. For new plug-ins, be sure to disable this property.
  1289. Rationale
  1290. --------
  1291. Each parameter of the AudioProcessor has an id associated so that the plug-in’s
  1292. host can uniquely identify parameters. The id has a different data-type for
  1293. different plug-in types (for example VST uses integers, AAX uses string
  1294. identifiers). Before 4.2.1, JUCE generated the parameter id by using the index
  1295. of the parameter, i.e. the first parameter had id zero, the second parameter
  1296. had id one, etc. This caused problems for certain plug-in types where JUCE
  1297. needs to add internal parameters to the plug-in (for example VST3 requires the
  1298. bypass control to be a parameter - so JUCE automatically creates this parameter
  1299. for you in the VST3 backend). This causes subtle problems if a parameter is
  1300. added to an update of an already published plug-in. The new parameter’s id
  1301. would be identical to the id of the bypass parameter in old versions of your
  1302. plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade
  1303. their plug-in.
  1304. Most plug-in backends differentiate between a parameter’s id an index, so this
  1305. distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s
  1306. unique id from the paramID property of AudioProcessorParameterWithID class.