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.

1093 lines
35KB

  1. JUCE breaking changes
  2. =====================
  3. Develop
  4. =======
  5. Change
  6. ------
  7. JUCE is moving towards using C++11 pointer container types instead of passing
  8. raw pointers as arguments and return values.
  9. Possible Issues
  10. ---------------
  11. You will need to change your code to pass std::unique_ptr into and out of
  12. various functions across JUCE's API.
  13. Workaround
  14. ----------
  15. None
  16. Rationale
  17. ---------
  18. Indicating ownership through the transfer of smart pointer types has been part
  19. of mainstream C++ for a long time and this change enforces memory safety by
  20. default in most situations.
  21. Change
  22. ------
  23. SystemTrayIconComponent::setIconImage now takes two arguments, rather than one.
  24. The new argument is a template image for use on macOS where all non-transparent
  25. regions will render in a monochrome colour determined dynamically by the
  26. operating system.
  27. Possible Issues
  28. ---------------
  29. You will now need to provide two images to display a SystemTrayIconComponent
  30. and the SystemTrayIconComponent will have a different appearance on macOS.
  31. Workaround
  32. ----------
  33. If you are not targeting macOS then you can provide an empty image, `{}`, for
  34. the second argument. If you are targeting macOS then you will likely need to
  35. design a new monochrome icon.
  36. Rationale
  37. ---------
  38. The introduction of "Dark Mode" in macOS 10.14 means that menu bar icons must
  39. support several different colours and highlight modes to retain the same
  40. appearance as the native Apple icons. Doing this correctly without delegating
  41. the behaviour to the operating system is extremely cumbersome, and the APIs we
  42. were previously using to interact with menu bar items have been deprecated.
  43. Change
  44. ------
  45. The AudioBlock class now differentiates between const and non-const data.
  46. Possible Issues
  47. ---------------
  48. The return type of the getInputBlock() method of the ProcessContextReplacing
  49. and ProcessContextNonReplacing classes has changed from AudioBlock<X> to
  50. AudioBlock<const X>.
  51. Workaround
  52. ----------
  53. For ProcessContextReplacing you should use getOutputBlock() instead of
  54. getInputBlock(). For ProcessContextNonReplacing attempting to modify the input
  55. block is very likely an error.
  56. Rationale
  57. ---------
  58. This change makes the intent of the code much clearer and means that we can
  59. remove some const_cast operations.
  60. Change
  61. ------
  62. The formatting of floating point numbers written to XML and JSON files has
  63. changed.
  64. Note that there is no change in precision - the XML and JSON files containing
  65. the new format numbers will parse in exactly the same way, it is only the
  66. string representation that has changed.
  67. Possible Issues
  68. ---------------
  69. If you rely upon exactly reproducing XML or JSON files then the new files may
  70. be different.
  71. Workaround
  72. ----------
  73. Update any reference XML or JSON files to use the new format.
  74. Rationale
  75. ---------
  76. The new format retains full precision, provides a human friendly representation
  77. of values near 1, and uses scientific notation for small and large numbers.
  78. This prevents needless file size bloat from numbers like 0.00000000000000001.
  79. Version 5.4.3
  80. =============
  81. Change
  82. ------
  83. The global user module path setting in the Projucer can now only contain a
  84. single path.
  85. Possible Issues
  86. ---------------
  87. Projects that previously relied on using multiple global user module paths
  88. separated by a semicolon will fail to find these modules after re-saving.
  89. Workaround
  90. ----------
  91. Replace the multiple paths with a single global user module path.
  92. Rationale
  93. ---------
  94. Using multiple global user module paths did not work when saving a project
  95. which exported to different OSes. Only allowing a single path will prevent this
  96. from silently causing issues.
  97. Version 5.4.2
  98. =============
  99. Change
  100. ------
  101. The return type of Block::getBlockAreaWithinLayout() has been changed from
  102. Rectangle to a simpler BlockArea struct.
  103. Possible Issues
  104. ---------------
  105. Classes that derive from Block and implement this pure virtual method will no
  106. longer compile due to a change in the function signature.
  107. Workaround
  108. ----------
  109. Update the method to return a BlockArea struct and update code that calls
  110. getBlockAreaWithinLayout to handle a BlockArea instead of a Rectangle.
  111. Rationale
  112. ---------
  113. The juce_blocks_basics is ISC licensed and therefore cannot depend on the
  114. GPL/Commercial licensed juce_graphics module that contains Rectangle.
  115. Change
  116. ------
  117. Renaming and deletion of open file handles on Windows is now possible using the
  118. FILE_SHARE_DELETE flag.
  119. Possible Issues
  120. ---------------
  121. Previous code that relied on open files not being able to be renamed or deleted
  122. on Windows may fail.
  123. Workaround
  124. ----------
  125. No workaround.
  126. Rationale
  127. ---------
  128. This unifies the behaviour across OSes as POSIX systems already allow this.
  129. Change
  130. ------
  131. Multiple changes to low-level, non-public JNI and Android APIs.
  132. Possible Issues
  133. ---------------
  134. If you were using any non-public, low-level JNI macros, calling java code or
  135. recieving JNI callbacks, then your code will probably no longer work. See the
  136. forum for further details.
  137. Workaround
  138. ----------
  139. See the forum for further details.
  140. Rationale
  141. ---------
  142. See the forum for further details.
  143. Change
  144. ------
  145. The minimum Android version for a JUCE app is now Android 4.1
  146. Possible Issues
  147. ---------------
  148. Your app may not run on very old versions of Android (less than 0.5% of the
  149. devices).
  150. Workaround
  151. ----------
  152. There is no workaround.
  153. Rationale
  154. ---------
  155. Less than 0.5% of all devices in the world run versions of Android older than
  156. Android 4.1. In the interest of keeping JUCE code clean and lean, we must
  157. depricate support for very old Android versions from time to time.
  158. Version 5.4.0
  159. =============
  160. Change
  161. ------
  162. The use of WinRT MIDI functions has been disabled by default for any version
  163. of Windows 10 before 1809 (October 2018 Update).
  164. Possible Issues
  165. ---------------
  166. If you were previously using WinRT MIDI functions on older versions of Windows
  167. then the new behaviour is to revert to the old Win32 MIDI API.
  168. Workaround
  169. ----------
  170. Set the preprocessor macro JUCE_FORCE_WINRT_MIDI=1 (in addition to the
  171. previously selected JUCE_USE_WINRT_MIDI=1) to allow the use of the WinRT API on
  172. older versions of Windows.
  173. Rationale
  174. ---------
  175. Until now JUCE's support for the Windows 10 WinRT MIDI API was experimental,
  176. due to longstanding issues within the API itself. These issues have been
  177. addressed in the Windows 10 1809 (October 2018 Update) release.
  178. Change
  179. ------
  180. The VST2 SDK embedded within JUCE has been removed.
  181. Possible Issues
  182. ---------------
  183. 1. Building or hosting VST2 plug-ins requires header files from the VST2 SDK,
  184. which is no longer part of JUCE.
  185. 2. Building a VST2-compatible VST3 plug-in (the previous default behaviour in
  186. JUCE) requires header files from the VST2 SDK, which is no longer part of
  187. JUCE.
  188. Workaround
  189. ----------
  190. 1. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or
  191. older) VST3 SDK or JUCE version 5.3.2. You should put the VST2 SDK in your
  192. header search paths or use the "VST (Legacy) SDK Folder" fields in the
  193. Projucer.
  194. 2. For new plug-in projects where you will be releasing both a VST2 and VST3
  195. version, and you want the VST3 plug-in to replace the VST2 plug-in in
  196. hosts that support it, then you should enable the JUCE_VST3_CAN_REPLACE_VST2
  197. option.
  198. 3. When a new JUCE plug-in project is created the value of
  199. JUCE_VST3_CAN_REPLACE_VST2 will be set to zero.
  200. Rationale
  201. ---------
  202. Distributing VST2 plug-ins requires a VST2 license from Steinberg. Following
  203. Steinberg's removal of the VST2 SDK from their public SDKs we are also removing
  204. the VST2 SDK from the JUCE codebase.
  205. Change
  206. ------
  207. The AudioProcessorValueTreeState::createAndAddParameter function has been
  208. deprecated.
  209. Possible Issues
  210. ---------------
  211. Deprecation warnings will be seen when compiling code which uses this function
  212. and eventually builds will fail when it is later removed from the API.
  213. Workaround
  214. ----------
  215. Previous calls to
  216. createAndAddParameter (paramID, paramName, ...);
  217. can be directly replaced with
  218. using Parameter = AudioProcessorValueTreeState::Parameter;
  219. createAndAddParameter (std::make_unique<Parameter> (paramID, paramName, ...));
  220. but an even better approach is to use the new AudioProcessorValueTreeState
  221. constructor where you can pass both RangedAudioParameters and
  222. AudioProcessorParameterGroups of RangedAudioParameters to the
  223. AudioProcessorValueTreeState and initialise the ValueTree simultaneously.
  224. Rationale
  225. ---------
  226. The new createAndAddParameter method is much more flexible and enables any
  227. parameter types derived from RangedAudioParameter to be managed by the
  228. AudioProcessorValueTreeState.
  229. Change
  230. ------
  231. The Projucer's per-exporter Android SDK/NDK path options have been removed.
  232. Possible Issues
  233. ---------------
  234. Projects that previously used these fields may no longer build.
  235. Workaround
  236. ----------
  237. Use the Projucer's global paths settings to point to these directories, either
  238. by opening the "Projucer/File->Global Paths..." menu item or using the
  239. "--set-global-search-path" command-line option.
  240. Rationale
  241. ---------
  242. Having multiple places where the paths could be set was confusing and could
  243. cause unexpected mismatches.
  244. Change
  245. ------
  246. SystemStats::getDeviceDescription() will now return the device code on iOS e.g.
  247. "iPhone7, 2" for an iPhone 6 instead of just "iPhone".
  248. Possible Issues
  249. ---------------
  250. Code that previously relied on this method returning either explicitly "iPhone"
  251. or "iPad" may no longer work.
  252. Workaround
  253. ----------
  254. Modify this code to handle the new device code string e.g. by changing:
  255. SystemStats::getDeviceDescription() == "iPhone";
  256. to
  257. SystemStats::getDeviceDescription().contains ("iPhone");.
  258. Rationale
  259. ---------
  260. The exact device model can now be deduced from this information instead of just
  261. the device family.
  262. Change
  263. ------
  264. DragAndDropContainer::performExternalDragDropOfFiles() and
  265. ::performExternalDragDropOfText() are now asynchronous on Windows.
  266. Possible Issues
  267. ---------------
  268. Code that previously relied on these operations being synchronous and blocking
  269. until completion will no longer work as the methods will return immediately and
  270. run asynchronously.
  271. Workaround
  272. ----------
  273. Use the callback argument that has been added to these methods to register a
  274. lambda that will be called when the operation has been completed.
  275. Rationale
  276. ---------
  277. The behaviour of these methods is now consistent across all platforms and the
  278. method no longer blocks the message thread on Windows.
  279. Change
  280. ------
  281. AudioProcessor::getTailLengthSeconds can now return infinity for
  282. VST/VST3/AU/AUv3.
  283. Possible Issues
  284. ---------------
  285. If you are using the result of getTailLengthSeconds to allocate a buffer in
  286. your host, then your host will now likely crash when loading a plug-in with an
  287. infinite tail time.
  288. Workaround
  289. ----------
  290. Rewrite your code to not use the result of getTailLengthSeconds directly to
  291. allocate a buffer.
  292. Rationale
  293. ---------
  294. Before this change there was no way for a JUCE plug-in to report an infinite
  295. tail time.
  296. Version 5.3.2
  297. =============
  298. Change
  299. ------
  300. The behaviour of an UndoManager used by an AudioProcessorValueTreeState has
  301. been improved.
  302. Possible Issues
  303. ---------------
  304. If your plug-in contains an UndoManager used by an AudioProcessorValueTreeState
  305. and relies upon the old behaviour of the UndoManager then it is possible that
  306. the new behaviour is no longer appropriate for your use case.
  307. Workaround
  308. ----------
  309. Use an external UndoManager to reproduce the old behaviour manually.
  310. Rationale
  311. ---------
  312. This change fixes a few bugs in the behaviour of an UndoManager used by an
  313. AudioProcessorValueTreeState.
  314. Change
  315. ------
  316. JUCE no longer supports OS X deployment targets earlier than 10.7.
  317. Possible Issues
  318. ---------------
  319. If you were previously targeting OS X 10.5 or 10.6 you will no longer be able
  320. to build JUCE-based products compatible with those platforms.
  321. Workaround
  322. ----------
  323. None. With the appropriate JUCE licence you may be able to backport new JUCE
  324. features, but there will be no official support for this.
  325. Rationale
  326. ---------
  327. Increasing the minimum supported OS X version allows the JUCE codebase to make
  328. use of the more modern C++ features found in the 10.7 standard library, which
  329. in turn will increase thread and memory safety.
  330. Version 5.3.0
  331. =============
  332. Change
  333. ------
  334. The JUCE examples have been cleaned up, modernised and converted into PIPs
  335. (Projucer Instant Projects). The JUCE Demo has been removed and replaced by the
  336. DemoRunner application and larger projects such as the Audio Plugin Host and
  337. the Network Graphics Demo have been moved into the extras directory.
  338. Possible Issues
  339. ---------------
  340. 1. Due to the large number of changes that have occurred in the JUCE Git
  341. repository, pulling this version may result in a messy folder structure with
  342. empty directories that have been removed.
  343. 2. The JUCE Demo project is no longer in the JUCE repository.
  344. 3. The Audio Plugin Host project has moved from the examples directory to the
  345. extras directory.
  346. Workaround
  347. ----------
  348. 1. Run a Git clean command (git clean -xdf) in your JUCE directory to remove
  349. all untracked files, directories and build products.
  350. 2. The new DemoRunner application, located in extras/DemoRunner, can be used to
  351. preview all the JUCE examples and see the code side-by-side.
  352. 3. Change any file paths that depended on the plugin host project being located
  353. in the examples directory to use the extras directory instead.
  354. Rationale
  355. ---------
  356. The JUCE examples had inconsistent naming, coding styles and the projects and
  357. build products took up a large amount of space in the repository. Replacing
  358. them with PIPs reduces the file size and allows us to categorise the examples
  359. better, as well as cleaning up the code.
  360. Change
  361. ------
  362. When hosting plug-ins all AudioProcessor methods of managing parameters that
  363. take a parameter index as an argument have been deprecated.
  364. Possible Issues
  365. ---------------
  366. A single assertion will be fired in debug builds on the first use of a
  367. deprecated function.
  368. Workaround
  369. ----------
  370. When hosting plug-ins you should use the AudioProcessor::getParameters() method
  371. and interact with parameters via the returned array of
  372. AudioProcessorParameters. For a short-term fix you can also continue past the
  373. assertion in your debugger, or temporarily modify the JUCE source code to
  374. remove it.
  375. Rationale
  376. ---------
  377. Given the structure of JUCE's API it is impossible to deprecate these functions
  378. using only compile-time messages. Therefore a single assertion, which can be
  379. safely ignored, serves to indicate that these functions should no longer be
  380. used. The move away from the AudioProcessor methods both improves the interface
  381. to that class and makes ongoing development work much easier.
  382. Change
  383. ------
  384. This InAppPurchases class is now a JUCE Singleton. This means that you need
  385. to get an instance via InAppPurchases::getInstance(), instead of storing a
  386. InAppPurchases object yourself.
  387. Possible Issues
  388. ---------------
  389. Any code using InAppPurchases needs to be updated to retrieve a singleton
  390. pointer to InAppPurchases.
  391. Workaround
  392. ----------
  393. Instead of holding a InAppPurchase member yourself, you should get an instance
  394. via InAppPurchases::getInstance(), e.g.
  395. instead of:
  396. InAppPurchases iap;
  397. iap.purchaseProduct (...);
  398. call:
  399. InAppPurchases::getInstance()->purchaseProduct (...);
  400. Rationale
  401. ---------
  402. This change was required to fix an issue on Android where on failed transaction
  403. a listener would not get called.
  404. Change
  405. ------
  406. JUCE's MPE classes have been updated to reflect the official specification
  407. recently approved by the MIDI Manufacturers Association (MMA).
  408. Possible Issues
  409. ---------------
  410. The most significant changes have occurred in the MPEZoneLayout classes and
  411. programs using the higher level MPE classes such as MPEInstrument,
  412. MPESynthesiser, MPESynthesiserBase and MPESynthesiserVoice should be
  413. unaffected.
  414. Previously, any MIDI channel from 1 - 15 could be selected to be the master
  415. channel of an MPE zone, with a specified number of member channels ascending
  416. from the master channel + 1. However, in the new specification this has been
  417. simplified so that a device only has a lower and/or an upper zone, where the
  418. lower zone has master channel 1 and assigns new member channels ascending from
  419. channel 2 and the upper zone has master channel 16 and assigns new member
  420. channels descending from channel 15.
  421. Workaround
  422. ----------
  423. Use the MPEZoneLayout::setLowerZone() and MPEZoneLayout::setUpperZone() methods
  424. to set zone layouts.
  425. Any UI that allows users to select and set zones on an MPE instrument should
  426. also be updated to reflect the specification changes.
  427. Rationale
  428. ---------
  429. The MPE classes in JUCE are out of date and should be updated to reflect the
  430. new, official MPE standard.
  431. Version 5.2.1
  432. =============
  433. Change
  434. ------
  435. Calling JUCEApplicationBase::quit() on Android will now really quit the app,
  436. rather than just placing it in background. Starting with API level 21 (Android
  437. 5.0), the app will not appear in recent apps list after calling quit(). Prior
  438. to API 21, the app will still appear in recent app lists but when a user
  439. chooses the app, a new instance of the app will be started.
  440. Possible Issues
  441. ---------------
  442. Any code calling JUCEApplicationBase::quit() to place the app in background
  443. will close the app instead.
  444. Workaround
  445. ----------
  446. Use Process::hide().
  447. Rationale
  448. ---------
  449. The old behaviour JUCEApplicationBase::quit() was confusing JUCE code, as a new
  450. instance of JUCE app was attempted to be created, while the older instance was
  451. still running in background. This would result in assertions when starting a
  452. second instance.
  453. Change
  454. ------
  455. On Windows, release builds will now link to the dynamic C++ runtime by default
  456. Possible Issues
  457. ---------------
  458. If you are creating a new .jucer project, then your plug-in will now link to
  459. the dynamic C++ runtime by default, which means that you MUST ensure that the
  460. C++ runtime libraries exist on your customer's computers.
  461. Workaround
  462. ----------
  463. If you are only targeting Windows 10, then the C++ runtime is now part of the
  464. system core components and will always exist on the computers of your customers
  465. (just like kernel332.dll, for example). If you are targeting Windows versions
  466. between Vista and Windows 10, then you should build your plug-in with the
  467. latest updated version of VS2015 or later, which ensures that it's linked to
  468. the universal runtime. Universal runtime is part of the system's core libraries
  469. on Windows 10 and on Windows versions Vista to 8.1, it will be available on
  470. your customer's computers via Windows Update. Unfortunately, if your customer
  471. has just installed Windows 8.1 to Vista on a fresh computer, then there is a
  472. chance that the update mechanism for the universal runtime hasn't triggered yet
  473. and your plug-in may still fail. Your installer should prompt the user to
  474. install all the Windows updates in this case or you can deploy the universal
  475. runtime as a redistributable with your installer. If you are targeting earlier
  476. versions of Windows then you should always include the runtime as a
  477. redistributable with your plug-in's installer. Alternatively, you can change
  478. the runtime linking to static (however, see 'Rationale' section).
  479. Rationale
  480. ---------
  481. In a recent update to Windows 10, Microsoft has limited the number of fiber
  482. local storage (FLS) slots per process. Effectively, this limits how many
  483. plug-ins with static runtime linkage can be loaded into a DAW. In the worst
  484. case, this limits the total number of plug-ins to a maximum of 64 plug-ins.
  485. There is no workaround for DAW vendors and the only solution is to push plug-in
  486. vendors to use the dynamic runtime. To help with this, JUCE has decided to make
  487. dynamic runtime linkage the default in JUCE.
  488. Change
  489. ------
  490. AudioProcessorGraph interface has changed in a number of ways - Node objects
  491. are now reference counted, there are different accessor methods to iterate
  492. them, and misc other small improvements to the API
  493. Possible Issues
  494. ---------------
  495. The changes won't cause any silent errors in user code, but will require some
  496. manual refactoring
  497. Workaround
  498. ----------
  499. Just find equivalent new methods to replace existing code.
  500. Rationale
  501. ---------
  502. The graph class was extremely old and creaky, and these changes is the start of
  503. an improvement process that should eventually result in it being broken down
  504. into fundamental graph building block classes for use in other contexts.
  505. Version 5.2.0
  506. =============
  507. Change
  508. ------
  509. Viewport now enables "scroll on drag" mode by default on Android and iOS.
  510. Possible Issues
  511. ---------------
  512. Any code relying on "scroll on drag" mode being turned off by default, should
  513. disable it manually.
  514. Workaround
  515. ----------
  516. None.
  517. Rationale
  518. ---------
  519. It is expected on mobile devices to be able to scroll a list by just a drag,
  520. rather than using a dedicated scrollbar. The scrollbar is still available
  521. though if needed.
  522. Change
  523. ------
  524. The previous setting of Android exporter "Custom manifest xml elements"
  525. creating child nodes of <application> element has been replaced by "Custom
  526. manifest XML content" setting that allows to specify the content of the entire
  527. manifest instead. Any previously values of the old setting will be used in the
  528. new setting by default, and they will need changing as mentioned in Workaround.
  529. The custom content will be merged with the content auto-generated by Projucer.
  530. Any custom elements or custom attributes will override the ones set by
  531. Projucer. Projucer will also automatically add any missing and required
  532. elements and attributes.
  533. Possible Issues
  534. ---------------
  535. If a Projucer project used "Custom manifest xml elements" field, the value will
  536. no longer be compatible with the project generated in the latest Projucer
  537. version. The solution is very simple and quick though, as mentioned in the
  538. Workaround section.
  539. Workaround
  540. ----------
  541. For any elements previously used, simply embed them explicitly in
  542. <manifest><application> elements, for example instead of:
  543. <meta-data android:name="paramId1" android:value="paramValue1"/>
  544. <meta-data android:name="paramId2" android:value="paramValue2"/>
  545. simply write:
  546. <manifest>
  547. <application>
  548. <meta-data android:name="paramId1" android:value="paramValue1"/>
  549. <meta-data android:name="paramId2" android:value="paramValue2"/>
  550. </application>
  551. </manifest>
  552. Rationale
  553. ---------
  554. To maintain the high level of flexibility of generated Android projects and to
  555. avoid creating fields in Projucer for every possible future parameter, it is
  556. simpler to allow to set up the required parameters manually. This way it is not
  557. only possible to add any custom elements but it is also possible to override
  558. the default attributes assigned by Projucer for the required elements. For
  559. instance, if the default value of <supports-screens> element is not
  560. satisfactory because you want a support for x-large screens only, simply set
  561. "Custom manifest XML content" to:
  562. <manifest>
  563. <supports-screens android:xlargeScreens="true"/>
  564. </manifest>
  565. Version 5.1.2
  566. =============
  567. Change
  568. ------
  569. The method used to classify AudioUnit, VST3 and AAX plug-in parameters as
  570. either continuous or discrete has changed, and AudioUnit and AudioUnit v3
  571. parameters are marked as high precision by default.
  572. Possible Issues
  573. ---------------
  574. Plug-ins: DAW projects with automation data written by an AudioUnit, AudioUnit
  575. v3 VST3 or AAX plug-in built with JUCE version 5.1.1 or earlier may load
  576. incorrectly when opened by an AudioUnit, AudioUnit v3, VST3 or AAX plug-in
  577. built with JUCE version 5.1.2 and later.
  578. Hosts: The AudioPluginInstance::getParameterNumSteps method now returns correct
  579. values for AU and VST3 plug-ins.
  580. Workaround
  581. ----------
  582. Plug-ins: Enable JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE in the
  583. juce_audio_plugin_client module config page in the Projucer.
  584. Hosts: Use AudioPluginInstance::getDefaultNumParameterSteps as the number of
  585. steps for all parameters.
  586. Rationale
  587. ---------
  588. The old system for presenting plug-in parameters to a host as either continuous
  589. or discrete is inconsistent between plug-in types and lacks sufficient
  590. flexibility. This change harmonises the behaviour and allows individual
  591. parameters to be marked as continuous or discrete. If AudioUnit and AudioUnit
  592. v3 parameters are not marked as high precision then hosts like Logic Pro only
  593. offer a limited number of parameter values, which again produces different
  594. behaviour for different plug-in types.
  595. Change
  596. ------
  597. A new FrameRateType fps23976 has been added to AudioPlayHead,
  598. Possible Issues
  599. ---------------
  600. Previously JUCE would report the FrameRateType fps24 for both 24 and 23.976
  601. fps. If your code uses switch statements (or similar) to handle all possible
  602. frame rate types, then this change may cause it to fall through.
  603. Workaround
  604. ----------
  605. Add fps23976 to your switch statement and handle it appropriately.
  606. Rationale
  607. ---------
  608. JUCE should be able to handle all popular frame rate codes but was missing
  609. support for 23.976.
  610. Change
  611. ------
  612. The String (bool) constructor and operator<< (String&, bool) have been
  613. explicitly deleted.
  614. Possible Issues
  615. ---------------
  616. Previous code which relied on an implicit bool to int type conversion to
  617. produce a String will not compile.
  618. Workaround
  619. ----------
  620. Cast your bool to an integer to generate a string representation of it.
  621. Rationale
  622. ---------
  623. Letting things implicitly convert to bool to produce a String opens the door to
  624. all kinds of nasty type conversion edge cases. Furthermore, before this change,
  625. MacOS would automatically convert bools to ints but this wouldn't occur on
  626. different platform. Now the behaviour is consistent across all operating
  627. systems supported by JUCE.
  628. Change
  629. ------
  630. The writeAsJSON virtual method of the DynamicObject class requires an
  631. additional parameter, maximumDecimalPlaces, to specify the maximum precision of
  632. floating point numbers.
  633. Possible Issues
  634. ---------------
  635. Classes which inherit from DynamicObject and override this method will need to
  636. update their method signature.
  637. Workaround
  638. ----------
  639. Your custom DynamicObject class can choose to ignore the additional parameter
  640. if you don't wish to support this behaviour.
  641. Rationale
  642. ---------
  643. When serialising the results of calculations to JSON the rounding of floating
  644. point numbers can result in numbers with 17 significant figures where only a
  645. few are required. This change to DynamicObject is required to support
  646. truncating those numbers.
  647. Version 5.1.0
  648. =============
  649. Change
  650. ------
  651. The JUCE_COMPILER_SUPPORTS_LAMBDAS preprocessor macro has been removed.
  652. Possible Issues
  653. ---------------
  654. If your project is using JUCE_COMPILER_SUPPORTS_LAMBDAS in your source code
  655. then it will likely evaluate to "false" and you could end up unnecessarily
  656. using code paths which avoid lambda functions.
  657. Workaround
  658. ----------
  659. Remove the usage of JUCE_COMPILER_SUPPORTS_LAMBDAS from your code.
  660. Rationale
  661. ---------
  662. Lambda functions are now available on all platforms that JUCE supports.
  663. Change
  664. ------
  665. The option to set the C++ language standard is now located in the project
  666. settings instead of the build configuration settings.
  667. Possible Issues
  668. ---------------
  669. Projects that had a specific version of the C++ language standard set for
  670. exporter build configurations will instead use the default (C++11) when
  671. re-saving with the new Projucer.
  672. Workaround
  673. ----------
  674. Change the "C++ Language Standard" setting in the main project settings to the
  675. required version - the Projucer will add this value to the exported project as
  676. a compiler flag when saving exporters.
  677. Rationale
  678. ---------
  679. Having a different C++ language standard option for each build configuration
  680. was unnecessary and was not fully implemented for all exporters. Changing it to
  681. a per-project settings means that the preference will propagate to all
  682. exporters and only needs to be set in one place.
  683. Change
  684. ------
  685. PopupMenus now scale according to the AffineTransform and scaling factor of
  686. their target components.
  687. Possible Issues
  688. ---------------
  689. Developers who have manually scaled their PopupMenus to fit the scaling factor
  690. of the parent UI will now have the scaling applied two times in a row.
  691. Workaround
  692. ----------
  693. 1. Do not apply your own manual scaling to make your popups match the UI
  694. scaling
  695. or
  696. 2. Override the Look&Feel method
  697. PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and
  698. return false. See
  699. https://github.com/WeAreROLI/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725
  700. Rationale
  701. ---------
  702. Previously, PopupMenus would not scale if the GUI of the target component (or
  703. any of it’s parents) were scaled. The only way to scale PopupMenus was via the
  704. global scaling factor. This had several drawbacks as the global scaling factor
  705. would scale everything. This was especially problematic in plug-in editors.
  706. Change
  707. ------
  708. Removed the setSecurityFlags() method from the Windows implementation of
  709. WebInputStream as it disabled HTTPS security features.
  710. Possible Issues
  711. ---------------
  712. Any code previously relying on connections to insecure webpages succeeding will
  713. no longer work.
  714. Workaround
  715. ----------
  716. Check network connectivity on Windows and re-write any code that relied on
  717. insecure connections.
  718. Rationale
  719. ---------
  720. The previous behaviour resulted in network connections on Windows having all
  721. the HTTPS security features disabled, exposing users to network attacks. HTTPS
  722. connections on Windows are now secure and will fail when connecting to an
  723. insecure web address.
  724. Change
  725. ------
  726. Pointer arithmetic on a pointer will have the same result regardless if it is
  727. wrapped in JUCE's Atomic class or not.
  728. Possible Issues
  729. ---------------
  730. Any code using pointer arithmetic on Atomic<T*> will now have a different
  731. result leading to undefined behaviour or crashes.
  732. Workaround
  733. ----------
  734. Re-write your code in a way that it does not depend on your pointer being
  735. wrapped in JUCE's Atomic or not. See rationale.
  736. Rationale
  737. ---------
  738. Before this change, pointer arithmetic with JUCE's Atomic type would yield
  739. confusing results. For example, the following code would assert before this
  740. change:
  741. int* a; Atomic<int*> b;
  742. jassert (++a == ++b);
  743. Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's
  744. Atomic always advances it's underlying pointer by a single byte. The same is
  745. true for operator+=/operator-= and operator--. The difference in behaviour is
  746. confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with
  747. std::atomic.
  748. Version 4.3.1
  749. =============
  750. Change
  751. ------
  752. JUCE has changed the way native VST3/AudioUnit parameter ids are calculated.
  753. Possible Issues
  754. ---------------
  755. DAW projects with automation data written by an AudioUnit or VST3 plug-in built
  756. with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit
  757. or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using
  758. JUCE_FORCE_USE_LEGACY_PARAM_IDS are not affected.
  759. Workaround
  760. ----------
  761. Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the
  762. juce_audio_plugin_client module config page in the Projucer. For new plug-ins,
  763. be sure to use the default value for this property.
  764. Rationale
  765. --------
  766. JUCE needs to convert between its own JUCE parameter id format (strings) to the
  767. native parameter id formats of the various plug-in backends. For VST3 and
  768. AudioUnits, JUCE uses a hash function to generate a numeric id. However, some
  769. VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any
  770. parameters that have a negative parameter id. Therefore, the hash function for
  771. VST3/AudioUnits needed to be changed to only return positive-valued hashes.
  772. Version 4.3.0
  773. =============
  774. Change
  775. ------
  776. A revised multi-bus API was released which supersedes the previously flawed
  777. multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive).
  778. Possible Issues
  779. ---------------
  780. If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive),
  781. then you will need to update your plug-in to the new multi-bus API. Pre JUCE
  782. 4.0.0 plug-ins are not affected apart from other breaking changes listed in
  783. this document.
  784. Woraround
  785. ---------
  786. None.
  787. Rationale
  788. --------
  789. A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version
  790. 4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE
  791. 4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API
  792. compatibility. However, the new multi-bus API is not compatible with the flawed
  793. multi-bus API (JUCE version 4.0.0 - 4.2.4).
  794. Change
  795. ------
  796. JUCE now generates the AAX plug-in bus layout configuration id independent from
  797. the position as it appears in the Projucer’s legacy "Channel layout
  798. configuration" field.
  799. Possible Issues
  800. ---------------
  801. ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may
  802. load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0
  803. versions of JUCE.
  804. Workaround
  805. ----------
  806. Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually
  807. override which AAX plug-in id is associated to a specific bus layout of your
  808. plug-in. This workaround is only necessary if you have released your plug-in
  809. built with a version previous to JUCE 4.3.0.
  810. Rationale
  811. --------
  812. The new multi-bus API offers more features, flexibility and accuracy in
  813. specifying bus layouts which cannot be expressed by the Projucer’s legacy
  814. "Channel layout configuration" field. The native plug-in format backends use
  815. the new multi-bus callback APIs to negotiate channel layouts with the host -
  816. including the AAX plug-in ids assigned to specific bus layouts. With the
  817. callback API, there is no notion of an order in which the channel
  818. configurations appear - as was the case with the legacy "Channel layout
  819. configuration" field - and therefore cannot be used to generate the AAX plug-in
  820. id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does
  821. transparently convert the legacy "Channel layout configuration" field to the
  822. new callback based multi-bus API, but this does not take the order into account
  823. in which the channel configurations appear in the legacy "Channel layout
  824. configuration" field.
  825. Version 4.2.1
  826. =============
  827. Change
  828. ------
  829. JUCE now uses the paramID property used in AudioProcessorParameterWithID to
  830. uniquely identify parameters to the host.
  831. Possible Issues
  832. ---------------
  833. DAW projects with automation data written by an audio plug-in built with pre
  834. JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with
  835. JUCE 4.2.1 and later.
  836. Workaround
  837. ----------
  838. Enable JUCE_FORCE_USE_LEGACY_PARAM_IDS in the juce_audio_plugin_client module config
  839. page in the Projucer. For new plug-ins, be sure to disable this property.
  840. Rationale
  841. --------
  842. Each parameter of the AudioProcessor has an id associated so that the plug-in’s
  843. host can uniquely identify parameters. The id has a different data-type for
  844. different plug-in types (for example VST uses integers, AAX uses string
  845. identifiers). Before 4.2.1, JUCE generated the parameter id by using the index
  846. of the parameter, i.e. the first parameter had id zero, the second parameter
  847. had id one, etc. This caused problems for certain plug-in types where JUCE
  848. needs to add internal parameters to the plug-in (for example VST3 requires the
  849. bypass control to be a parameter - so JUCE automatically creates this parameter
  850. for you in the VST3 backend). This causes subtle problems if a parameter is
  851. added to an update of an already published plug-in. The new parameter’s id
  852. would be identical to the id of the bypass parameter in old versions of your
  853. plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade
  854. their plug-in.
  855. Most plug-in backends differentiate between a parameter’s id an index, so this
  856. distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s
  857. unique id from the paramID property of AudioProcessorParameterWithID class.