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.

2989 lines
96KB

  1. JUCE breaking changes
  2. =====================
  3. develop
  4. =======
  5. Change
  6. ------
  7. DynamicObject::clone now returns unique_ptr<DynamicObject> instead of
  8. ReferenceCountedObjectPtr<DynamicObject>.
  9. Possible Issues
  10. ---------------
  11. Overrides of this function using the old signature will fail to compile.
  12. The result of this function may need to be manually converted to a
  13. ReferenceCountedObjectPtr.
  14. Workaround
  15. ----------
  16. Update overrides to use the new signature.
  17. If necessary, manually construct a ReferenceCountedObjectPtr at call sites.
  18. Rationale
  19. ---------
  20. It's easy to safely upgrade a unique_ptr to a shared/refcounted pointer.
  21. However, it's not so easy to convert safely in the opposite direction.
  22. Generally, returning unique_ptrs rather than refcounted pointers leads to more
  23. flexible APIs.
  24. Version 7.0.7
  25. =============
  26. Change
  27. ------
  28. The minimum supported CMake version is now 3.22.
  29. Possible Issues
  30. ---------------
  31. It will no longer be possible to configure JUCE projects with CMake versions
  32. between 3.15 and 3.21 inclusive.
  33. Workaround
  34. ----------
  35. No workaround is available. Newer versions of CMake can be obtained from the
  36. official download page, or through system package managers.
  37. Rationale
  38. ---------
  39. Moving to CMake 3.22 improves consistency with the Projucer's Android exporter,
  40. which already requires CMake 3.22. It also allows us to make use of the
  41. XCODE_EMBED_APP_EXTENSIONS property (introduced in CMake 3.21), fixing an
  42. issue when archiving AUv3 plugins.
  43. Version 7.0.6
  44. =============
  45. Change
  46. ------
  47. Thread::wait and WaitableEvent::wait now take a double rather than an int to
  48. indicate the number of milliseconds to wait.
  49. Possible Issues
  50. ---------------
  51. Calls to either wait function may trigger warnings.
  52. Workaround
  53. ----------
  54. Explicitly cast the value to double.
  55. Rationale
  56. ---------
  57. Changing to double allows sub-millisecond waits which was important for
  58. supporting changes to the HighResolutionTimer.
  59. Change
  60. ------
  61. RealtimeOptions member workDurationMs was replaced by three optional member
  62. variables in RealtimeOptions, and all RealtimeOptions member variables were
  63. marked private.
  64. Possible Issues
  65. ---------------
  66. Trying to construct a RealtimeOptions object with one or two values, or access
  67. any of its member variables, will no longer compile.
  68. Workaround
  69. ----------
  70. Use the withMember functions to construct the object, and the getter functions
  71. to access the member variable values.
  72. Rationale
  73. ---------
  74. The new approach improves the flexibility for users to specify realtime thread
  75. options on macOS/iOS and improves the flexibility for the API to evolve without
  76. introducing further breaking changes.
  77. Change
  78. ------
  79. JUCE module compilation files with a platform suffix are now checked case
  80. insensitively for CMake builds.
  81. Possible Issues
  82. ---------------
  83. If a JUCE module compilation file ends in a specific platform suffix but does
  84. not match the case for the string previously checked by the CMake
  85. implementation, it may have compiled for all platforms. Now, it will only
  86. compile for the platform specified by the suffix.
  87. Workaround
  88. ----------
  89. In most cases this was probably a bug, in other cases rename the file to remove
  90. the platform suffix.
  91. Rationale
  92. ---------
  93. This change improves consistency between the Projucer and CMake integrations.
  94. Change
  95. ------
  96. An undocumented feature that allowed JUCE module compilation files to compile
  97. for a specific platform or subset of platforms by declaring the platform name
  98. followed by an underscore, was removed.
  99. Possible Issues
  100. ---------------
  101. If a JUCE module compilation file contains a matching platform suffix followed
  102. by an underscore and is loaded by the Projucer it will no longer compile for
  103. just that platform.
  104. Workaround
  105. ----------
  106. Use the suffix of the name only. If the undocumented feature was used to select
  107. multiple platforms, make multiple separate files for each of the required
  108. platforms.
  109. Rationale
  110. ---------
  111. This change improves consistency between the Projucer and CMake integrations.
  112. Given the functionality was undocumented, the ease of a workaround, and the
  113. added complexity required for CMake support, the functionality was removed.
  114. Change
  115. ------
  116. Unique device IDs on iOS now use the OS provided 'identifierForVendor'.
  117. OnlineUnlockStatus has been updated to handle the iOS edge-case where a device
  118. ID query might return an empty String.
  119. Possible Issues
  120. ---------------
  121. The License checks using InAppPurchases, getLocalMachineIDs(), and
  122. getUniqueDeviceID() may return an empty String if iOS 'is not ready'. This can
  123. occur for example if the device has restarted but has not yet been unlocked.
  124. Workaround
  125. ----------
  126. InAppPurchase has been updated to handle this and propagate the error
  127. accordingly. The relevant methods have been updated to return a Result object
  128. that can be queried for additional information on failure.
  129. Rationale
  130. ---------
  131. Apple have introduced restrictions on device identification rendering our
  132. previous methods unsuitable.
  133. Change
  134. ------
  135. AudioProcessor::getAAXPluginIDForMainBusConfig() has been deprecated.
  136. Possible Issues
  137. ---------------
  138. Any AudioProcessor overriding this method will fail to compile.
  139. Workaround
  140. ----------
  141. - Create an object which inherits from AAXClientExtensions.
  142. - In the object override and implement getPluginIDForMainBusConfig().
  143. - In the AudioProcessor override getAAXClientExtensions() and return a pointer
  144. to the object.
  145. Rationale
  146. ---------
  147. Additional AAX specific functionality was required in the audio processor.
  148. Rather than continuing to grow and expand the AudioProcessor class with format
  149. specific functionality, separating this concern into a new class allows for
  150. greater expansion for those that need it without burdening those that don't.
  151. Moving this function into this class improves consistency both with the new
  152. functionality and with similar functionality for the VST2 and VST3 formats.
  153. Change
  154. ------
  155. Unique device IDs on Windows have been updated to use a more reliable SMBIOS
  156. parser. The SystemStats::getUniqueDeviceID function now returns new IDs using
  157. this improved parser. Additionally, a new function,
  158. SystemStats::getMachineIdentifiers, has been introduced to aggregate all ID
  159. sources. It is recommended to use this new function to verify any IDs.
  160. Possible Issues
  161. ----------------
  162. The SystemStats::getUniqueDeviceID function will return a different ID for the
  163. same machine due to the updated parser.
  164. Workaround
  165. ----------
  166. For code that previously relied on SystemStats::getUniqueDeviceID, it is advised
  167. to switch to using SystemStats::getMachineIdentifiers() instead.
  168. Rationale
  169. ---------
  170. This update ensures the generation of more stable and reliable unique device
  171. IDs, while also maintaining backward compatibility with the previous ID
  172. generation methods.
  173. Change
  174. ------
  175. The Grid layout algorithm has been slightly altered to provide more consistent
  176. behaviour. The new approach guarantees that dimensions specified using the
  177. absolute Px quantity will always be correctly rounded when applied to the
  178. integer dimensions of Components.
  179. Possible Issues
  180. ---------------
  181. Components laid out using Grid can observe a size or position change of +/- 1px
  182. along each dimension compared with the result of the previous algorithm.
  183. Workaround
  184. ----------
  185. If the Grid based graphical layout is sensitive to changes of +/- 1px, then the
  186. UI layout code may have to be adjusted to the new algorithm.
  187. Rationale
  188. ---------
  189. The old Grid layout algorithm could exhibit surprising and difficult to control
  190. single pixel artifacts, where an item with a specified absolute size of
  191. e.g. 100px could end up with a layout size of 101px. The new approach
  192. guarantees that such items will have a layout size exactly as specified, and
  193. this new behaviour is also in line with CSS behaviour in browsers. The new
  194. approach makes necessary corrections easier as adding 1px to the size of an
  195. item with absolute dimensions is guaranteed to translate into an observable 1px
  196. increase in the layout size.
  197. Change
  198. ------
  199. The k91_4 and k90_4 VST3 layouts are now mapped to the canonical JUCE 9.1.4 and
  200. 9.0.4 AudioChannelSets. This has a different ChannelType layout than the
  201. AudioChannelSet previously used with such VST3 SpeakerArrangements.
  202. Possible Issues
  203. ---------------
  204. VST3 plugins that were prepared to work with the k91_4 and k90_4
  205. SpeakerArrangements may now have incorrect channel mapping. The channels
  206. previously accessible through ChannelType::left and right are now accessible
  207. through ChannelType::wideLeft and wideRight, and channels previously accessible
  208. through ChannelType::leftCentre and rightCentre are now accessible through
  209. ChannelType::left and right.
  210. Workaround
  211. ----------
  212. Code that accesses the channels that correspond to the VST3 Speakers kSpeakerL,
  213. kSpeakerR, kSpeakerLc and kSpeakerRc needs to be updated. These channels are now
  214. accessible respectively through ChannelTypes wideLeft, wideRight, left and
  215. right. Previously they were accessible respectively through left, right,
  216. leftCentre and rightCentre.
  217. Rationale
  218. ---------
  219. This change allows developers to handle the 9.1.4 and 9.0.4 surround layouts
  220. with one codepath across all plugin formats. Previously the
  221. AudioChannelSet::create9point1point4() and create9point0point4() layouts would
  222. only be used in CoreAudio and AAX, but a different AudioChannelSet would be used
  223. in VST3 even though they were functionally equivalent.
  224. Change
  225. ------
  226. The signatures of the ContentSharer member functions have been updated. The
  227. ContentSharer class itself is no longer a singleton.
  228. Possible Issues
  229. ---------------
  230. Projects that use the old signatures will not build until they are updated.
  231. Workaround
  232. ----------
  233. Instead of calling content sharer functions through a singleton instance, e.g.
  234. ContentSharer::getInstance()->shareText (...);
  235. call the static member functions directly:
  236. ScopedMessageBox messageBox = ContentSharer::shareTextScoped (...);
  237. The new functions return a ScopedMessageBox instance. On iOS, the content
  238. sharer will only remain open for as long as the ScopedMessageBox remains alive.
  239. On Android, this functionality will be added as/when the native APIs allow.
  240. Rationale
  241. ---------
  242. The new signatures are safer and easier to use. The ScopedMessageBox also
  243. allows content sharers to be dismissed programmatically, which wasn't
  244. previously possible.
  245. Change
  246. ------
  247. The minimum supported AAX library version has been bumped to 2.4.0 and the
  248. library is now built automatically while building an AAX plugin. The
  249. JucePlugin_AAXLibs_path preprocessor definition is no longer defined in AAX
  250. plugin builds.
  251. Possible Issues
  252. ---------------
  253. Projects that use the JucePlugin_AAXLibs_path definition may no longer build
  254. correctly. Projects that reference an AAX library version earlier than 2.4.0
  255. will fail to build.
  256. Workaround
  257. ----------
  258. You must download an AAX library distribution with a version of at least 2.4.0.
  259. Use the definition JucePlugin_Build_AAX to check whether the AAX format is
  260. enabled at build time.
  261. Rationale
  262. ---------
  263. The JUCE framework now requires features only present in version 2.4.0 of the
  264. AAX library. The build change removes steps from the build process, and ensures
  265. that the same compiler flags are used across the entire project.
  266. Change
  267. ------
  268. The implementation of ColourGradient::createLookupTable has been updated to use
  269. non-premultiplied colours.
  270. Possible Issues
  271. ---------------
  272. Programs that draw transparent gradients using the OpenGL or software
  273. renderers, or that use lookup tables generated from transparent gradients for
  274. other purposes, may now produce different results.
  275. Workaround
  276. ----------
  277. For gradients to render the same as they did previously, transparent colour
  278. stops should be un-premultiplied. For colours with an alpha component of 0, it
  279. may be necessary to specify appropriate RGB components.
  280. Rationale
  281. ---------
  282. Previously, transparent gradients rendered using CoreGraphics looked different
  283. to the same gradients drawn using OpenGL or the software renderer. This change
  284. updates the OpenGL and software renderers, so that they produce the same
  285. results as CoreGraphics.
  286. Change
  287. ------
  288. Projucer-generated MSVC projects now build VST3s as bundles, rather than as
  289. single DLL files.
  290. Possible Issues
  291. ---------------
  292. Build workflows that expect the VST3 to be a single DLL may break.
  293. Workaround
  294. ----------
  295. Any post-build scripts that expect to copy or move the built VST3 should be
  296. updated so that the entire bundle directory is copied/moved. The DLL itself
  297. can still be located and extracted from within the generated bundle if
  298. necessary.
  299. Rationale
  300. ---------
  301. Distributing VST3s as single files was deprecated in VST3 v3.6.10. JUCE's CMake
  302. scripts already produce VST3s as bundles, so this change increases consistency
  303. between the two build systems.
  304. Version 7.0.3
  305. =============
  306. Change
  307. ------
  308. The default macOS and iOS deployment targets set by the Projucer have been
  309. increased to macOS 10.13 and iOS 11 respectively.
  310. Possible Issues
  311. ---------------
  312. Projects using the Projucer's default minimum deployment target will have their
  313. minimum deployment target increased.
  314. Workaround
  315. ----------
  316. If you need a lower minimum deployment target then you must set this in the
  317. Projucer's Xcode build configuration settings.
  318. Rationale
  319. ---------
  320. Xcode 14 no longer supports deployment targets lower than macOS 10.13 and iOS
  321. 11.
  322. Change
  323. ------
  324. The ARA SDK expected by JUCE has been updated to version 2.2.0.
  325. Possible Issues
  326. ---------------
  327. Builds using earlier versions of the ARA SDK will fail to compile.
  328. Workaround
  329. ----------
  330. The ARA SDK configured in JUCE must be updated to version 2.2.0.
  331. Rationale
  332. ---------
  333. Version 2.2.0 is the latest official release of the ARA SDK.
  334. Change
  335. ------
  336. The Thread::startThread (int) and Thread::setPriority (int) methods have been
  337. removed. A new Thread priority API has been introduced.
  338. Possible Issues
  339. ---------------
  340. Code will fail to compile.
  341. Workaround
  342. ----------
  343. Rather than using an integer thread priority you must instead use a value from
  344. the Thread::Priority enum. Thread::setPriority and Thread::getPriority should
  345. only be called from the target thread. To start a Thread with a realtime
  346. performance profile you must call startRealtimeThread.
  347. Rationale
  348. ---------
  349. Operating systems are moving away from a specific thread priority and towards
  350. more granular control over which types of cores can be used and things like
  351. power throttling options. In particular, it is no longer possible to map a 0-10
  352. integer to a meaningful performance range on macOS ARM using the pthread
  353. interface. Using a more modern interface grants us access to more runtime
  354. options, but also changes how we can work with threads. The two most
  355. significant changes are that we cannot mix operations using the new and old
  356. interfaces, and that changing a priority using the new interface can only be
  357. done on the currently running thread.
  358. Change
  359. ------
  360. The constructor of WebBrowserComponent now requires passing in an instance of
  361. a new Options class instead of a single option boolean. The
  362. WindowsWebView2WebBrowserComponent class was removed.
  363. Possible Issues
  364. ---------------
  365. Code using the WebBrowserComponent's boolean parameter to indicate if a
  366. webpage should be unloaded when the component is hidden, will now fail to
  367. compile. Additionally, any code using the WindowsWebView2WebBrowserComponent
  368. class will fail to compile. Code relying on the default value of the
  369. WebBrowserComponent's constructor are not affected.
  370. Workaround
  371. ----------
  372. Instead of passing in a single boolean to the WebBrowserComponent's
  373. constructor you should now set this option via tha
  374. WebBrowserComponent::Options::withKeepPageLoadedWhenBrowserIsHidden method.
  375. If you were previously using WindowsWebView2WebBrowserComponent to indicate to
  376. JUCE that you prefer JUCE to use Windows' Webview2 browser backend, you now do
  377. this by setting the WebBrowserComponent::Options::withBackend method. The
  378. WebView2Preferences can now be modified with the methods in
  379. WebBrowserComponent::Options::WinWebView2.
  380. Rationale
  381. ---------
  382. The old API made adding further options to the WebBrowserComponent cumbersome
  383. especially as the WindowsWebView2WebBrowserComponent already had a parameter
  384. very similar to the above Options class, whereas the base class did not use
  385. such a parameter. Furthermore, using an option to specify the preferred
  386. browser backend is more intuitive then requiring the user to derive from a
  387. special class, especially if additional browser backends are added in the
  388. future.
  389. Change
  390. ------
  391. The function AudioIODeviceCallback::audioDeviceIOCallback() was removed.
  392. Possible Issues
  393. ---------------
  394. Code overriding audioDeviceIOCallback() will fail to compile.
  395. Workaround
  396. ----------
  397. Affected classes should override the audioDeviceIOCallbackWithContext() function
  398. instead.
  399. Rationale
  400. ---------
  401. The audioDeviceIOCallbackWithContext() function fulfills the same role as
  402. audioDeviceIOCallback(), it just has an extra parameter. Hence the
  403. audioDeviceIOCallback() function was superfluous.
  404. Change
  405. ------
  406. The type representing multi-channel audio data has been changed from T** to
  407. T* const*. Affected classes are AudioIODeviceCallback, AudioBuffer and
  408. AudioFormatReader.
  409. Possible Issues
  410. ---------------
  411. Code overriding the affected AudioIODeviceCallback and AudioFormatReader
  412. functions will fail to compile. Code that interacts with the return value of
  413. AudioBuffer::getArrayOfReadPointers() and AudioBuffer::getArrayOfWritePointers()
  414. may fail to compile.
  415. Workaround
  416. ----------
  417. Functions overriding the affected AudioIODeviceCallback and AudioFormatReader
  418. members will need to be changed to confirm to the new signature. Type
  419. declarations related to getArrayOfReadPointers() and getArrayOfWritePointers()
  420. of AudioBuffer may have to be adjusted.
  421. Rationale
  422. ---------
  423. While the previous signature permitted it, changing the channel pointers by the
  424. previously used types was already being considered illegal. The earlier type
  425. however prevented passing T** values to parameters with type const T**. In some
  426. places this necessitated the usage of const_cast. The new signature can bind to
  427. T** values and the awkward casting can be avoided.
  428. Change
  429. ------
  430. The minimum supported C++ standard is now C++17 and the oldest supported
  431. compilers on Linux are now GCC 7.0 and Clang 6.0.
  432. Possible Issues
  433. ---------------
  434. Older compilers will no longer be able to compile JUCE.
  435. Workaround
  436. ----------
  437. No workaround is available.
  438. Rationale
  439. ---------
  440. This compiler upgrade will allow the use of C++17 within the framework.
  441. Change
  442. ------
  443. Resource forks are no longer generated for Audio Unit plug-ins.
  444. Possible Issues
  445. ---------------
  446. New builds of JUCE Audio Units may no longer load in old hosts that use the
  447. Component Manager to discover plug-ins.
  448. Workaround
  449. ----------
  450. No workaround is available.
  451. Rationale
  452. ---------
  453. The Component Manager is deprecated in macOS 10.8 and later, so the majority of
  454. hosts have now implemented support for the new plist-based discovery mechanism.
  455. The new AudioUnitSDK (https://github.com/apple/AudioUnitSDK) provided by Apple
  456. to replace the old Core Audio Utility Classes no longer includes the files
  457. required to generate resource forks.
  458. Change
  459. ------
  460. Previously, the AudioProcessorGraph would call processBlockBypassed on any
  461. processor for which setBypassed had previously been called. Now, the
  462. AudioProcessorGraph will now only call processBlockBypassed if those processors
  463. do not have dedicated bypass parameters.
  464. Possible Issues
  465. ---------------
  466. Processors with non-functional bypass parameters may not bypass in the same way
  467. as before.
  468. Workaround
  469. ----------
  470. For each AudioProcessor owned by a Graph, ensure that either: the processor has
  471. a working bypass parameter that correctly affects the output of processBlock();
  472. or, the processor has no bypass parameter, in which case processBlockBypassed()
  473. will be called as before.
  474. Rationale
  475. ---------
  476. The documentation for AudioProcessor::getBypassParameter() states that if this
  477. function returns non-null, then processBlockBypassed() should never be called,
  478. but the AudioProcessorGraph was breaking this rule. Calling
  479. processBlockBypassed() on AudioProcessors with bypass parameters is likely to
  480. result in incorrect or unexpected output if this function is not overridden.
  481. The new behaviour obeys the contract set out in the AudioProcessor
  482. documentation.
  483. Version 7.0.2
  484. =============
  485. Change
  486. ------
  487. The Matrix3D (Vector3D<Type> vector) constructor has been replaced with an
  488. explicit static Matrix3D fromTranslation (Vector3D<Type> vector) function, and a
  489. bug in the behaviour of the multipication operator that reversed the order of
  490. operations has been addressed.
  491. Possible Issues
  492. ---------------
  493. Code using the old constructor will not compile. Code that relied upon the order
  494. of multiplication operations will return different results.
  495. Workaround
  496. ----------
  497. Code that was using the old constructor must use the new static function. Code
  498. that relied on the order of multiplication operations will need to have the
  499. order of the arguments reversed. With the old code A * B was returning BA rather
  500. than AB.
  501. Rationale
  502. ---------
  503. Previously a matrix multipled by a vector would return a matrix, rather than a
  504. vector, as the multiplied-by vector would be automatically converted into a
  505. matrix during the operation. Removing the converting constructor makes
  506. everything much more explicit and there is no confusion about dimensionality.
  507. The current multiplication routine also included a bug where A * B resulted in
  508. BA rather than AB, which needed to be addressed.
  509. Version 7.0.0
  510. =============
  511. Change
  512. ------
  513. AudioProcessor::getHostTimeNs() and AudioProcessor::setHostTimeNanos() have
  514. been removed.
  515. Possible Issues
  516. ---------------
  517. Code that used these functions will no longer compile.
  518. Workaround
  519. ----------
  520. Set and get the system time corresponding to the current audio callback using
  521. the new functions AudioPlayHead::PositionInfo::getHostTimeNs() and
  522. AudioPlayHead::PositionInfo::setHostTimeNs().
  523. Rationale
  524. ---------
  525. This change consolidates callback-related timing information into the
  526. PositionInfo type, improving the consistency of the AudioProcessor and
  527. AudioPlayHead APIs.
  528. Change
  529. ------
  530. AudioPlayHead::getCurrentPosition() has been deprecated and replaced with
  531. AudioPlayHead::getPosition().
  532. Possible Issues
  533. ---------------
  534. Hosts that implemented custom playhead types may no longer compile. Plugins
  535. that used host-provided timing information may trigger deprecation warnings
  536. when building.
  537. Workaround
  538. ----------
  539. Classes that derive from AudioPlayHead must now override getPosition() instead
  540. of getCurrentPosition(). Code that used to use the playhead's
  541. CurrentPositionInfo must switch to using the new PositionInfo type.
  542. Rationale
  543. ---------
  544. Not all hosts and plugin formats are capable of providing the full complement
  545. of timing information contained in the old CurrentPositionInfo class.
  546. Previously, in the case that some information could not be provided, fallback
  547. values would be used instead, but it was not possible for clients to distinguish
  548. between "real" values set explicitly by the host, and "fallback" values set by
  549. a plugin wrapper. The new PositionInfo type keeps track of which members have
  550. been explicitly set, so clients can implement their own fallback behaviour.
  551. The new PositionInfo type also includes a new "barCount" member, which is
  552. currently only used by the LV2 host and client.
  553. Change
  554. ------
  555. The optional JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS preprocessor
  556. flag will now use a new Metal layer renderer when running on macOS 10.14 or
  557. later. The minimum requirements for building macOS and iOS software are now
  558. macOS 10.13.6 and Xcode 10.1.
  559. Possible Issues
  560. ---------------
  561. Previously enabling JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS had no
  562. negative effect on performance. Now it may slow rendering down.
  563. Workaround
  564. ----------
  565. Disable JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS.
  566. Rationale
  567. ---------
  568. JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS has been ineffective when
  569. running on macOS 10.13 or later. Enabling this flag, and hence using the new
  570. Metal layer renderer when running on macOS 10.14, restores the previous
  571. behaviour and fixes problems where Core Graphics will render much larger
  572. regions than necessary. However, the new renderer will may be slower than the
  573. recently introduced default of asynchronous Core Graphics rendering, depending
  574. on the regions that Core Graphcis is redrawing. Whether
  575. JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS improves or degrades
  576. performance is specific to an application.
  577. Change
  578. ------
  579. The optional JUCE_COREGRAPHICS_DRAW_ASYNC preprocessor flag has been removed
  580. and asynchronous Core Graphics rendering is now the default. The helper
  581. function setComponentAsyncLayerBackedViewDisabled has also been removed.
  582. Possible Issues
  583. ---------------
  584. Components that were previously using setComponentAsyncLayerBackedViewDisabled
  585. to conditionally opt out of asynchronous Core Graphics rendering will no longer
  586. be able to do so.
  587. Workaround
  588. ----------
  589. To opt out of asynchronous Core Graphics rendering the
  590. windowRequiresSynchronousCoreGraphicsRendering ComponentPeer style flag can be
  591. used when adding a component to the desktop.
  592. Rationale
  593. ---------
  594. Asynchronous Core Graphics rendering provides a substantial performance
  595. benefit. Asynchronous rendering is a property of a Peer, rather than a
  596. Component, so a Peer style flag to conditionally opt out of asynchronous
  597. rendering is more appropriate.
  598. Change
  599. ------
  600. Constructors of AudioParameterBool, AudioParameterChoice, AudioParameterFloat,
  601. AudioParameterInt, and AudioProcessorParameterWithID have been deprecated and
  602. replaced with new constructors taking an 'Attributes' argument.
  603. Possible Issues
  604. ---------------
  605. The compiler may issue a deprecation warning upon encountering usages of the
  606. old constructors.
  607. Workaround
  608. ----------
  609. Update code to pass an 'Attributes' instance instead. Example usages of the new
  610. constructors are given in the constructor documentation, and in the plugin
  611. example projects.
  612. Rationale
  613. ---------
  614. Parameter types have many different properties. Setting a non-default property
  615. using the old constructors required explicitly setting other normally-defaulted
  616. properties, which was redundant. The new Attributes types allow non-default
  617. properties to be set in isolation.
  618. Version 6.1.6
  619. =============
  620. Change
  621. ------
  622. Unhandled mouse wheel and magnify events will now be passed to the closest
  623. enclosing enabled ancestor component.
  624. Possible Issues
  625. ---------------
  626. Components that previously blocked mouse wheel events when in a disabled state
  627. may no longer block the events as expected.
  628. Workaround
  629. ----------
  630. If a component should explicitly prevent events from propagating when disabled,
  631. it should override mouseWheelMove() and mouseMagnify() to do nothing when the
  632. component is disabled.
  633. Rationale
  634. ---------
  635. Previously, unhandled wheel events would be passed to the parent component,
  636. but only if the parent was enabled. This meant that scrolling on a component
  637. nested inside a disabled component would have no effect by default. This
  638. behaviour was not intuitive.
  639. Change
  640. ------
  641. The invalidPressure, invalidOrientation, invalidRotation, invalidTiltX and
  642. invalidTiltY members of MouseInputSource have been deprecated.
  643. Possible Issues
  644. ---------------
  645. Deprecation warnings will be seen when compiling code which uses these members
  646. and eventually builds will fail when they are later removed from the API.
  647. Workaround
  648. ----------
  649. Use the equivalent defaultPressure, defaultOrientation, defaultRotation,
  650. defaultTiltX and defaultTiltY members of MouseInputSource.
  651. Rationale
  652. ---------
  653. The deprecated members represent valid values and the isPressureValid() etc.
  654. functions return true when using them. This could be a source of confusion and
  655. may be inviting programming errors. The new names are in line with the ongoing
  656. practice of using these values to provide a neutral default in the absence of
  657. actual OS provided values.
  658. Change
  659. ------
  660. Plugin wrappers will no longer call processBlockBypassed() if the wrapped
  661. AudioProcessor returns a parameter from getBypassParameter().
  662. Possible Issues
  663. ---------------
  664. Plugins that used to depend on processBlockBypassed() being called may no
  665. longer correctly enter a bypassed state.
  666. Workaround
  667. ----------
  668. AudioProcessors that implement getBypassParameter() must check the current
  669. value of the bypass parameter on each call to processBlock(), and bypass
  670. processing as appropriate. When switching between bypassed and non-bypassed
  671. states, the plugin must use some sort of ramping or smoothing to avoid
  672. discontinuities in the output. If the plugin introduces latency when not
  673. bypassed, the plugin must delay its output when in bypassed mode so that the
  674. overall latency does not change when enabling/disabling bypass.
  675. Rationale
  676. ---------
  677. The documentation for AudioProcessor::getBypassParameter() says
  678. > if this method returns a non-null value, you should never call
  679. processBlockBypassed but use the returned parameter to control the bypass
  680. state instead.
  681. Some plugin wrappers were not following this rule. After this change, the
  682. behaviour of all plugin wrappers is consistent with the documented behaviour.
  683. Change
  684. ------
  685. The ComponentPeer::getFrameSize() function has been deprecated on Linux.
  686. Possible Issues
  687. ---------------
  688. Deprecation warnings will be seen when compiling code which uses this function
  689. and eventually builds will fail when it is later removed from the API.
  690. Workaround
  691. ----------
  692. Use the ComponentPeer::getFrameSizeIfPresent() function. The new function returns
  693. an OptionalBorderSize object. Use operator bool() to determine if the border size
  694. is valid, then access the value using operator*() only if it is.
  695. Rationale
  696. ---------
  697. The XWindow system cannot return a valid border size immediately after window
  698. creation. ComponentPeer::getFrameSize() returns a default constructed
  699. BorderSize<int> instance in such cases that corresponds to a frame size of
  700. zero. That however can be a valid value, and needs to be treated differently
  701. from the situation when the frame size is not yet available.
  702. Change
  703. ------
  704. The return type of XWindowSystem::getBorderSize() was changed to
  705. ComponentPeer::OptionalBorderSize.
  706. Possible Issues
  707. ---------------
  708. User code that uses XWindowSystem::getBorderSize() will fail to build.
  709. Workaround
  710. ----------
  711. Use operator bool() to determine the validity of the new return value and
  712. access the contained value using operator*().
  713. Rationale
  714. ---------
  715. The XWindow system cannot immediately report the correct border size after
  716. window creation. The underlying X11 calls will signal whether querying the
  717. border size was successful, but there was no way to forward this information
  718. through XWindowSystem::getBorderSize() until this change.
  719. Version 6.1.5
  720. =============
  721. Change
  722. ------
  723. XWindowSystemUtilities::XSettings now has a private constructor.
  724. Possible Issues
  725. ---------------
  726. User code that uses XSettings::XSettings() will fail to build.
  727. Workaround
  728. ----------
  729. Use the XSettings::createXSettings() factory function.
  730. Rationale
  731. ---------
  732. The XSETTINGS facility is not available on all Linux distributions and the old
  733. constructor would fail on such systems, potentially crashing the application.
  734. The factory function will return nullptr in such situations instead.
  735. Version 6.1.3
  736. =============
  737. Change
  738. ------
  739. The format specific structs of ExtensionsVisitor now return pointers to forward
  740. declared types instead of `void*`. For this purpose the `struct AEffect;`
  741. forward declaration was placed inside the global namespace.
  742. Possible Issues
  743. ---------------
  744. User code that includes the VST headers inside a namespace may fail to build,
  745. because the forward declared type can collide with the contents of `aeffect.h`.
  746. Workaround
  747. ----------
  748. The collision can be avoided by placing a `struct AEffect;` forward declaration
  749. in the same namespace where the VST headers are included. The forward
  750. declaration must come before the inclusion.
  751. Rationale
  752. ---------
  753. Using the forward declared types eliminates the need for error prone casting
  754. at the site where the ExtensionsVisitor facility is used.
  755. Change
  756. ------
  757. ListBox::createSnapshotOfRows now returns ScaledImage instead of Image.
  758. Possible Issues
  759. ---------------
  760. User code that overrides this function will fail to build.
  761. Workaround
  762. ----------
  763. To emulate the old behaviour, simply wrap the Image that was previous returned
  764. into a ScaledImage and return that instead.
  765. Rationale
  766. ---------
  767. Returning a ScaledImage allows the overriding function to specify the scale
  768. at which the image should be drawn. Returning an oversampled image will provide
  769. smoother-looking results on high resolution displays.
  770. Change
  771. ------
  772. AudioFrameRate::frameRate is now a class type instead of an enum.
  773. Possible Issues
  774. ---------------
  775. Code that read the old enum value will not compile.
  776. Workaround
  777. ----------
  778. Call frameRate.getType() to fetch the old enum type. Alternatively, use the new
  779. getBaseRate(), isDrop(), isPullDown(), and getEffectiveRate() functions. The
  780. new functions provide a more accurate description of the host's frame rate.
  781. Rationale
  782. ---------
  783. The old enum-based interface was not flexible enough to describe all the frame
  784. rates that might be reported by a plugin host.
  785. Change
  786. ------
  787. FlexItem::alignSelf now defaults to "autoAlign" rather than "stretch".
  788. Possible Issues
  789. ---------------
  790. FlexBox layouts will be different in cases where FlexBox::alignItems is set to
  791. a value other than "stretch". This is because each FlexItem will now default
  792. to using the FlexBox's alignItems value. Layouts that explicitly set
  793. FlexItem::alignSelf on each item will not be affected.
  794. Workaround
  795. ----------
  796. To restore the previous layout behaviour, set FlexItem::alignSelf to "stretch"
  797. on all FlexItems that would otherwise use the default value for alignSelf.
  798. Rationale
  799. ---------
  800. The new behaviour more closely matches the behaviour of CSS FlexBox
  801. implementations. In CSS, "align-self" has an initial value of "auto", which
  802. computes to the parent's "align-items" value.
  803. Change
  804. ------
  805. Functions on AudioPluginInstance that can add parameters have been made
  806. private.
  807. Possible Issues
  808. ---------------
  809. Code implementing custom plugin formats may stop building if it calls these
  810. functions.
  811. Workaround
  812. ----------
  813. When implementing custom plugin formats, ensure that the plugin parameters
  814. derive from AudioPluginInstance::HostedParameter and then use
  815. addHostedParameter, addHostedParameterGroup or setHostedParameterTree to add
  816. the parameters to the plugin instance.
  817. Rationale
  818. ---------
  819. In a plugin host, it is very important to be able to uniquely identify
  820. parameters across different versions of the same plugin. To make this possible,
  821. we needed to introduce a way of retrieving a unique ID for each parameter,
  822. which is now possible using the HostedParameter class. However, we also needed
  823. to enforce that all AudioPluginInstances can only have parameters which are of
  824. the type HostedParameter, which required hiding the old functions.
  825. Version 6.1.0
  826. =============
  827. Change
  828. ------
  829. juce::gl::loadFunctions() no longer loads extension functions.
  830. Possible Issues
  831. ---------------
  832. Code that depended on extension functions being loaded automatically may cease
  833. to function correctly.
  834. Workaround
  835. ----------
  836. Extension functions can now be loaded using juce::gl::loadExtensions().
  837. Rationale
  838. ---------
  839. There are a great number of extension functions, and on some systems these can
  840. be slow to load (i.e. a second or so). Projects that do not require these
  841. extension functions should not have to pay for this unnecessary overhead. Now,
  842. only core functions will be loaded by default, and extensions can be loaded
  843. explicitly in projects that require such functionality.
  844. Change
  845. ------
  846. Thread::setPriority() will no longer set a realtime scheduling policy for all
  847. threads with non-zero priorities on POSIX systems.
  848. Possible Issues
  849. ---------------
  850. Threads that implicitly relied on using a realtime policy will no longer
  851. request a realtime policy if their priority is 7 or lower.
  852. Workaround
  853. ----------
  854. For threads that require a realtime policy on POSIX systems, request a priority
  855. of 8 or higher by calling Thread::setPriority() or
  856. Thread::setCurrentThreadPriority().
  857. Rationale
  858. ---------
  859. By default, new Thread instances have a priority of 5. Previously, non-zero
  860. priorities corresponded to realtime scheduling policies, meaning that new
  861. Threads would use the realtime scheduling policy unless they explicitly
  862. requested a priority of 0. However, most threads do not and should not require
  863. realtime scheduling. Setting a realtime policy on all newly-created threads may
  864. degrade performance, as multiple realtime threads will end up fighting for
  865. limited resources.
  866. Change
  867. ------
  868. The JUCE_GLSL_VERSION preprocessor definition has been removed.
  869. Possible Issues
  870. ---------------
  871. Code which used this definition will no longer compile.
  872. Workaround
  873. ----------
  874. Use OpenGLHelpers::getGLSLVersionString to retrieve a version string which is
  875. consistent with the capabilities of the current OpenGL context.
  876. Rationale
  877. ---------
  878. A compile-time version string is not very useful, as OpenGL versions and
  879. capabilities can change at runtime. Replacing this macro with a function allows
  880. querying the capabilities of the current context at runtime.
  881. Change
  882. ------
  883. The minimum supported CMake version is now 3.15.
  884. Possible Issues
  885. ---------------
  886. It will no longer be possible to configure JUCE projects with CMake versions
  887. between 3.12 and 3.14 inclusive.
  888. Workaround
  889. ----------
  890. No workaround is available.
  891. Rationale
  892. ---------
  893. Moving to 3.15 allows us to use target_link_directories and
  894. target_link_options, which were introduced in 3.13, which in turn allows us to
  895. provide support for bundled precompiled libraries in modules. Plugins already
  896. required CMake 3.15, so this change just brings other target types in line with
  897. the requirements for plugins.
  898. Change
  899. ------
  900. The default value of JUCE_MODAL_LOOPS_PERMITTED has been changed from 1 to 0.
  901. Possible Issues
  902. ---------------
  903. With JUCE_MODAL_LOOPS_PERMITTED set to 0 code that previously relied upon modal
  904. loops will need to be rewritten to use asynchronous versions of the modal
  905. functions. There is no non-modal alternative to
  906. AlterWindow::showNativeDialogBox and the previously modal behaviour of the
  907. MultiDocumentPanel destructor has changed.
  908. Workaround
  909. ----------
  910. Set JUCE_MODAL_LOOPS_PERMITTED back to 1.
  911. Rationale
  912. ---------
  913. Modal operations are a frequent source of problems, particularly when used in
  914. plug-ins. On Android modal loops are not possible, so people wanting to target
  915. Android often have an unwelcome surprise when then have to rewrite what they
  916. assumed to be platform independent code. Changing the default addresses these
  917. problems.
  918. Change
  919. ------
  920. The minimum supported C++ standard is now C++14 and the oldest supported
  921. compilers on macOS and Linux are now Xcode 9.2, GCC 5.0 and Clang 3.4.
  922. Possible Issues
  923. ---------------
  924. Older compilers will no longer be able to compile JUCE. People using Xcode 8.5
  925. on OS X 10.11 will need to update the operating system to OS X 10.12 to be able
  926. to use Xcode 9.2.
  927. Workaround
  928. ----------
  929. No workaround is available.
  930. Rationale
  931. ---------
  932. This compiler upgrade will allow the use of C++14 within the framework.
  933. Change
  934. ------
  935. Platform GL headers are no longer included in juce_opengl.h
  936. Possible Issues
  937. ---------------
  938. Projects depending on symbols declared in these headers may fail to build.
  939. Workaround
  940. ----------
  941. The old platform-supplied headers have been replaced with a new juce_gl.h
  942. header which is generated using the XML registry files supplied by Khronos.
  943. This custom header declares GL symbols in the juce::gl namespace. If your code
  944. only needs to be JUCE-compatible, you can explicitly qualify each name with
  945. `juce::gl::`. If you need your code to build with different extension-loader
  946. libraries (GLEW, GL3W etc.) you can make all GL symbols visible without
  947. additional qualification with `using namespace juce::gl`.
  948. Rationale
  949. ---------
  950. Using our own GL headers allows us to generate platform-independent headers
  951. which include symbols for all specified OpenGL versions and extensions. Note
  952. that although the function signatures exist, they may not resolve to a function
  953. at runtime. If your code uses commands from an extension or recent GL version,
  954. you should check each function pointer against `nullptr` before attempting to
  955. use it. To avoid repeatedly checking, you could query a subset of functions
  956. after calling gl::loadFunctions() and cache the results. Supplying custom GL
  957. headers also allows us to use C++ techniques (namespaces, references), making
  958. the headers safer than the platform-defined headers. Platform headers are
  959. generally written in C, and export a significant portion of their symbols as
  960. preprocessor definitions.
  961. Change
  962. ------
  963. The functions `getComponentAsyncLayerBackedViewDisabled`
  964. and `setComponentAsyncLayerBackedViewDisabled` were moved into the juce
  965. namespace.
  966. Possible Issues
  967. ---------------
  968. Code that declares these functions may fail to link.
  969. Workaround
  970. ----------
  971. Move declarations of these functions into the juce namespace.
  972. Rationale
  973. ---------
  974. Although the names of these functions are unlikely to collide with functions
  975. from other libraries, we can make such collisions much more unlikely by keeping
  976. JUCE code in the juce namespace.
  977. Change
  978. ------
  979. The `juce_blocks_basics` module was removed.
  980. Possible Issues
  981. ---------------
  982. Projects depending on `juce_blocks_basics` will not build.
  983. Workaround
  984. ----------
  985. The BLOCKS API is now located in a separate repository:
  986. https://github.com/WeAreROLI/roli_blocks_basics
  987. Projects which used to depend on `juce_blocks_basics` can use
  988. `roli_blocks_basics` instead.
  989. Rationale
  990. ---------
  991. ROLI is no longer involved with the development of JUCE. Therefore, development
  992. on the BLOCKS API has been moved out of the JUCE repository, and to a new
  993. repository managed by ROLI.
  994. Change
  995. ------
  996. The live build functionality of the Projucer has been removed.
  997. Possible Issues
  998. ---------------
  999. You will no longer be able to use live build in the Projucer.
  1000. Workaround
  1001. ----------
  1002. None.
  1003. Rationale
  1004. ---------
  1005. Keeping the live build compatible with the latest compilers on all our
  1006. supported platforms is a very substantial maintenance burden, but very few
  1007. people are using this feature of the Projucer. Removing the live build will
  1008. simplify the code and our release process.
  1009. Change
  1010. ------
  1011. `Component::createFocusTraverser()` has been renamed to
  1012. `Component::createKeyboardFocusTraverser()` and now returns a `std::unique_ptr`
  1013. instead of a raw pointer. `Component::createFocusTraverser()` is a new method
  1014. for controlling basic focus traversal and not keyboard focus traversal.
  1015. Possible Issues
  1016. ---------------
  1017. Derived Components that override the old method will no longer compile.
  1018. Workaround
  1019. ----------
  1020. Override the new method. Be careful to override
  1021. `createKeyboardFocusTraverser()` and not `createFocusTraverser()` to ensure
  1022. that the behaviour is the same.
  1023. Rationale
  1024. ---------
  1025. The ownership of this method is now clearer as the previous code relied on the
  1026. caller deleting the object. The name has changed to accommodate the new
  1027. `Component::createFocusTraverser()` method that returns an object for
  1028. determining basic focus traversal, of which keyboard focus is generally a
  1029. subset.
  1030. Change
  1031. ------
  1032. PluginDescription::uid has been deprecated and replaced with a new 'uniqueId'
  1033. data member.
  1034. Possible Issues
  1035. ---------------
  1036. Code using the old data member will need to be updated in order to compile.
  1037. Workaround
  1038. ----------
  1039. Code that used to use 'uid' to identify plugins should switch to using
  1040. 'uniqueId', with some caveats - see "Rationale" for details.
  1041. Rationale
  1042. ---------
  1043. The 'uniqueId' member has the benefit of being consistent for
  1044. a given VST3 across Windows, macOS, and Linux. However, the value of the
  1045. uniqueId may differ from the value of the old uid on some platforms. The value
  1046. of the old 'uid' member can now be found in the 'deprecatedUid' member, which
  1047. should allow clients to implement logic such as checking a saved uid against
  1048. the new uniqueId, and falling back to the deprecatedUid. This should allow
  1049. hosts to gracefully upgrade from the old uid values to the new values.
  1050. Version 6.0.8
  1051. =============
  1052. Change
  1053. ------
  1054. Calling AudioProcessorEditor::setResizeLimits() will no longer implicitly add a
  1055. ResizableCornerComponent to the editor if it has not already been set as
  1056. resizable.
  1057. Possible Issues
  1058. ---------------
  1059. Code which previously relied on calling this method to set up the corner
  1060. resizer will no longer work.
  1061. Workaround
  1062. ----------
  1063. Explicitly call AudioProcessorEditor::setResizable() with the second argument
  1064. set to true to enable the corner resizer.
  1065. Rationale
  1066. ---------
  1067. The previous behaviour was undocumented and potentially confusing. There is now
  1068. a single method to control the behaviour of the editor's corner resizer to
  1069. avoid any ambiguity.
  1070. Change
  1071. ------
  1072. The implementations of `getValue` and `setValue` in `AUInstanceParameter` now
  1073. properly take the ranges of discrete parameters into account.
  1074. Possible Issues
  1075. ---------------
  1076. This issue affects JUCE Audio Unit hosts. Automation data previously saved for
  1077. a discrete parameter with a non-zero minimum value may not set the parameter to
  1078. the same values as previous JUCE versions. Note that previously, `getValue` on
  1079. a hosted discrete parameter may have returned out-of-range values, and
  1080. `setValue` may have only mapped to a portion of the parameter range. As a
  1081. result, automation recorded for affected parameters was likely already behaving
  1082. unexpectedly.
  1083. Workaround
  1084. ----------
  1085. There is no workaround.
  1086. Rationale
  1087. ---------
  1088. The old behaviour was incorrect, and was causing issues in plugin validators
  1089. and other hosts. Hosts expect `getValue` to return a normalised parameter
  1090. value. If this function returns an out-of-range value (including Inf and NaN)
  1091. this is likely to break assumptions made by the host, leading to crashes,
  1092. corrupted project data, or other defects.
  1093. Change
  1094. ------
  1095. AudioProcessorListener::audioProcessorChanged gained a new parameter describing
  1096. the nature of any change.
  1097. Possible Issues
  1098. ---------------
  1099. Code using the old function signature will not build until updated to use
  1100. the new signature.
  1101. Workaround
  1102. ----------
  1103. Listeners should add the new parameter to any overrides of
  1104. audioProcessorChanged.
  1105. Rationale
  1106. ---------
  1107. The new function signature means that wrappers can be smarter about the
  1108. requests that they make to hosts whenever some aspect of the processor changes.
  1109. In particular, plugin wrappers can now distinguish between changes to latency,
  1110. parameter attributes, and the current program. This means that hosts will no
  1111. longer assume parameters have changed when `setLatencySamples` is called.
  1112. Change
  1113. ------
  1114. CharacterFunctions::readDoubleValue now returns values consistent with other
  1115. C++ number parsing libraries. Parsing values smaller than the minimum number
  1116. representable in a double will return (+/-)0.0 and parsing values larger than
  1117. the maximum number representable in a double will return (+/-)inf.
  1118. Possible Issues
  1119. ---------------
  1120. Code reading very large or very small numbers may receive values of 0.0 and inf
  1121. rather than nan.
  1122. Workaround
  1123. ----------
  1124. Where you may be using std::isnan to check the validity of the result you can
  1125. instead use std::isfinite.
  1126. Rationale
  1127. ---------
  1128. The new behaviour is consistent with other string parsing libraries.
  1129. Version 6.0.6
  1130. =============
  1131. Change
  1132. ------
  1133. The name of `OperatingSystemType::MacOSX_11_0` was changed to
  1134. `OperatingSystemType::MacOS_11`.
  1135. Possible Issues
  1136. ---------------
  1137. Code using the old name will not build until it is updated to use the new name.
  1138. Workaround
  1139. ----------
  1140. Update code using the old name to use the new name instead.
  1141. Rationale
  1142. ---------
  1143. Newer versions of macOS have dropped the "X" naming. Minor version updates are
  1144. also less significant now than they were for the X-series.
  1145. Change
  1146. ------
  1147. Xcode projects generated using the Projucer will now use the "New Build System"
  1148. instead of the "Legacy Build System" by default.
  1149. Possible Issues
  1150. ---------------
  1151. Xcode 10.0 - 10.2 has some known issues when using the new build system such as
  1152. JUCE modules not rebuilding correctly when modified, issue and file navigation
  1153. not working, and breakpoints not being reliably set or hit.
  1154. Workaround
  1155. ----------
  1156. If you are using an affected version of Xcode then you can enable the "Use
  1157. Legacy Build System" setting in the Projucer Xcode exporter to go back to the
  1158. previous behaviour.
  1159. Rationale
  1160. ---------
  1161. The legacy build system has issues building arm64 binaries for Apple silicon
  1162. and will eventually be removed altogether.
  1163. Version 6.0.5
  1164. =============
  1165. Change
  1166. ------
  1167. New pure virtual methods accepting `PopupMenu::Options` arguments have been
  1168. added to `PopupMenu::LookAndFeelMethods`.
  1169. Possible Issues
  1170. ---------------
  1171. Classes derived from `PopupMenu::LookAndFeelMethods`, such as custom
  1172. LookAndFeel classes, will not compile unless these pure virtual methods are
  1173. implemented.
  1174. Workaround
  1175. ----------
  1176. The old LookAndFeel methods still exist, so if the new Options parameter is not
  1177. useful in your application, your implementation of
  1178. `PopupMenu::LookAndFeelMethods` can simply forward to the old methods. For
  1179. example, your implementation of `drawPopupMenuBackgroundWithOptions` can
  1180. internally call your existing `drawPopupMenuBackground` implementation.
  1181. Rationale
  1182. ---------
  1183. Allowing the LookAndFeelMethods to access the popup menu's options allows for
  1184. more flexible styling. For example, a theme may wish to query the menu's target
  1185. component or parent for colours to use.
  1186. Change
  1187. ------
  1188. A typo in the JUCEUtils CMake script that caused the wrong manufacturer code to
  1189. be set in the compile definitions for a plugin was fixed.
  1190. Possible Issues
  1191. ---------------
  1192. The manufacturer code for plugins built under CMake with this version of JUCE
  1193. will differ from the manufacturer code that was generated previously.
  1194. Workaround
  1195. ----------
  1196. If you have released plugins that used the old, incorrect manufacturer code and
  1197. wish to continue using this code for backwards compatibility, add the following
  1198. to your `juce_add_plugin` call:
  1199. USE_LEGACY_COMPATIBILITY_PLUGIN_CODE TRUE
  1200. In most cases, this should not be necessary, and we recommend using the fixed
  1201. behaviour.
  1202. Rationale
  1203. ---------
  1204. This change ensures that the manufacturer codes used by CMake projects match
  1205. the codes that would be generated by the Projucer, improving compatibility
  1206. when transitioning from the Projucer to CMake.
  1207. Version 6.0.2
  1208. =============
  1209. Change
  1210. ------
  1211. The JUCE_WASAPI_EXCLUSIVE flag has been removed from juce_audio_devices and all
  1212. available WASAPI audio device modes (shared, shared low latency and exclusive)
  1213. are available by default when JUCE_WASAPI is enabled. The
  1214. AudioIODeviceType::createAudioIODeviceType_WASAPI() method which takes a single
  1215. boolean argument has also been deprecated in favour of a new method which takes
  1216. a WASAPIDeviceMode enum.
  1217. Possible Issues
  1218. ---------------
  1219. Code that relied on the JUCE_WASAPI_EXCLUSIVE flag to disable WASAPI exclusive
  1220. mode will no longer work.
  1221. Workaround
  1222. ----------
  1223. Override the AudioDeviceManager::createAudioDeviceTypes() method to omit the
  1224. WASAPI exclusive mode device if you do not want it to be available.
  1225. Rationale
  1226. ---------
  1227. JUCE now supports shared low latency WASAPI audio devices via the AudioClient3
  1228. interface and instead of adding an additional compile time config flag to
  1229. enable this functionality, which adds complexity to the build process when not
  1230. using the Projucer, JUCE makes all WASAPI device modes available by default.
  1231. Change
  1232. ------
  1233. The fields representing Mac OS X 10.4 to 10.6 inclusive have been removed from
  1234. the `OperatingSystemType` enum.
  1235. Possible Issues
  1236. ---------------
  1237. Code that uses these fields will fail to build.
  1238. Workaround
  1239. ----------
  1240. Remove references to these fields from user code.
  1241. Rationale
  1242. ---------
  1243. JUCE is not supported on Mac OS X versions lower than 10.7, so it is a given
  1244. that `getOperatingSystemType` will always return an OS version greater than or
  1245. equal to 10.7. Code that changes behaviours depending on the OS version can
  1246. assume that this version is at least 10.7.
  1247. Change
  1248. ------
  1249. The JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING flag in juce_graphics is no
  1250. longer used on iOS.
  1251. Possible Issues
  1252. ---------------
  1253. Projects with this flag enabled may render differently on iOS.
  1254. Workaround
  1255. ----------
  1256. There is no workaround.
  1257. Rationale
  1258. ---------
  1259. When using a cached image to render Components with `setBufferedToImage (true)`
  1260. the result now matches the default behaviour on iOS where fonts are not
  1261. smoothed.
  1262. Change
  1263. ------
  1264. Space, return and escape key events on the native macOS menu bar are no longer
  1265. passed to the currently focused JUCE Component.
  1266. Possible Issues
  1267. ---------------
  1268. Code relying on receiving these keyboard events will no longer work.
  1269. Workaround
  1270. ----------
  1271. There is no workaround.
  1272. Rationale
  1273. ---------
  1274. It should be possible for users with a keyboard or assistive device to navigate
  1275. the menu, invoking the currently highlighted menu item with the space or return
  1276. key and dismissing the menu with the escape key. These key events should not be
  1277. passed to the application and doing so interferes with the accessibility of
  1278. JUCE apps. Only passing these events to the native macOS menu means that JUCE
  1279. apps behave as expected for users.
  1280. Version 6.0.0
  1281. =============
  1282. Change
  1283. ------
  1284. The Convolution class interface was changed:
  1285. - `loadImpulseResponse` member functions now take `enum class` parameters
  1286. instead of `bool`.
  1287. - `copyAndLoadImpulseResponseFromBlock` and
  1288. `copyAndLoadImpulseResponseFromBuffer` were replaced by a new
  1289. `loadImpulseResponse` overload.
  1290. Possible Issues
  1291. ---------------
  1292. Code using the old interface will no longer compile, and will need to be
  1293. updated.
  1294. Workaround
  1295. ----------
  1296. Code that was previously loading impulse responses from binary data or from
  1297. files can substitute old `bool` parameters with the newer `enum class`
  1298. equivalents. Code that was previously passing buffers or blocks will need
  1299. reworking so that the Convolution instance can take ownership of the buffer
  1300. containing the impulse response.
  1301. Rationale
  1302. ---------
  1303. The newer `enum class` parameters make user code much more readable, e.g.
  1304. `loadImpulseResponse (file, Stereo::yes, Trim::yes, 0, Normalise::yes)` rather
  1305. than `loadImpulseResponse (file, true, true, 0, true);`. By taking ownership of
  1306. the passed buffer, the Convolution can avoid preallocating a large internal
  1307. buffer, reducing memory usage when short impulse responses are used. Changing
  1308. the ownership semantics of the buffer also makes it easier for users to avoid
  1309. copies/allocations on the audio thread, and gives more flexibility to the
  1310. implementation to run initialisation tasks on a background thread.
  1311. Change
  1312. ------
  1313. All references to ROLI Ltd. (ROLI) have been changed to Raw Material Software
  1314. Limited.
  1315. Possible Issues
  1316. ---------------
  1317. Existing projects, particularly Android, may need to be resaved by the Projucer
  1318. and have the old build artefacts deleted before they will build.
  1319. Workaround
  1320. ----------
  1321. In Android projects any explicit mention of paths with the from "com.roli.*"
  1322. should be changed to the form "com.rmsl.*".
  1323. Rationale
  1324. ---------
  1325. This change reflects the change in ownership from ROLI to RMSL.
  1326. Change
  1327. ------
  1328. The Windows DPI handling in the VST wrapper and hosting code has been
  1329. refactored to be more stable.
  1330. Possible Issues
  1331. ---------------
  1332. The new code uses a top-level AffineTransform to scale the JUCE editor window
  1333. instead of native methods. Therefore any AudioProcessorEditors which have their
  1334. own AffineTransform applied will no longer work correctly.
  1335. Workaround
  1336. ----------
  1337. If you are using an AffineTransform to scale the entire plug-in window then
  1338. consider putting the component you want to transform in a child of
  1339. the editor and transform that instead. Alternatively, if you don't need a
  1340. separate scale factor for each plug-in instance you can use
  1341. Desktop::setGlobalScaleFactor().
  1342. Rationale
  1343. ---------
  1344. The old code had some bugs when using OpenGL and when moving between monitors
  1345. with different scale factors. The new code should fix these and DPI-aware
  1346. plug-ins will scale correctly.
  1347. Change
  1348. ------
  1349. Relative Xcode subproject paths specified in the Projucer are now relative to
  1350. the build directory rather than the project directory.
  1351. Possible Issues
  1352. ---------------
  1353. After being re-saved in the Projucer existing Xcode projects will fail to find
  1354. any subprojects specified using a relative path.
  1355. Workaround
  1356. ----------
  1357. Update the subproject path in the Projucer.
  1358. Rationale
  1359. ---------
  1360. Most other Xcode specific paths are specified relative to the build directory.
  1361. This change brings the Xcode subproject path in line with the rest of the
  1362. configuration.
  1363. Version 5.4.6
  1364. =============
  1365. Change
  1366. ------
  1367. AudioProcessorValueTreeState::getRawParameterValue now returns a
  1368. std::atomic<float>* instead of a float*.
  1369. Possible Issues
  1370. ---------------
  1371. Existing code which explicitly mentions the type of the returned value, or
  1372. interacts with the dereferenced float in ways unsupported by the std::atomic
  1373. wrapper, will fail to compile. Certain evaluation-reordering compiler
  1374. optimisations may no longer be possible.
  1375. Workaround
  1376. ----------
  1377. Update your code to deal with a std::atomic<float>* instead of a float*.
  1378. Rationale
  1379. ---------
  1380. Returning a std::atomic<float>* allows the JUCE framework to have much stronger
  1381. guarantees about thread safety.
  1382. Change
  1383. ------
  1384. Removed a workaround from the ASIOAudioIODevice::getOutputLatencyInSamples()
  1385. and ASIOAudioIODevice::getInputLatencyInSamples() methods which was adding an
  1386. arbitrary amount to the reported latencies to compensate for dodgy, old
  1387. drivers.
  1388. Possible Issues
  1389. ---------------
  1390. Code which relied on these altered values may now behave differently.
  1391. Workaround
  1392. ----------
  1393. Update your code to deal with the new, correct values reported from the drivers
  1394. directly.
  1395. Rationale
  1396. ---------
  1397. JUCE will now return the latency values as reported by the drivers without
  1398. adding anything to them. The workaround was for old drivers and the current
  1399. drivers should report the correct values without the need for the workaround.
  1400. Change
  1401. ------
  1402. The default behaviour of the AU and AUv3 plug-in wrappers is now to call
  1403. get/setStateInformation instead of get/setProgramStateInformation.
  1404. Possible Issues
  1405. ---------------
  1406. AudioProcessor subclasses which have overridden the default implementations of
  1407. get/setProgramStateInformation (which simply call through to
  1408. get/setStateInformation) may be unable to load previously saved state; state
  1409. previously saved via a call to getProgramStateInformation will be presented to
  1410. setStateInformation.
  1411. Workaround
  1412. ----------
  1413. Enable the JUCE_AU_WRAPPERS_SAVE_PROGRAM_STATES configuration option in the
  1414. juce_audio_plugin_client module to preserve backwards compatibility if
  1415. required.
  1416. Rationale
  1417. ---------
  1418. When using overridden get/setProgramStateInformation methods the previous
  1419. behaviour of the AU and AUv3 wrappers does not correctly save and restore
  1420. state.
  1421. Version 5.4.5
  1422. =============
  1423. Change
  1424. ------
  1425. The alignment of text rendered on macOS using CoreGraphics may have shifted
  1426. slightly, depending on the font you have used. The default macOS font has
  1427. shifted downwards.
  1428. Possible Issues
  1429. ---------------
  1430. Meticulously aligned text components of a GUI may now be misaligned.
  1431. Workaround
  1432. ----------
  1433. Use a custom LookAndFeel to change the location where text is drawn, or use a
  1434. different font that matches the previous alignment of your original font.
  1435. Rationale
  1436. ---------
  1437. This was an unintentional change resulting from moving away from a deprecated
  1438. macOS text API. The new alignment is consistent with other rendering engines
  1439. (web browsers and text editors) and the software renderer.
  1440. Change
  1441. ------
  1442. The JUCEApplicationBase::backButtonPressed() method now returns a bool to
  1443. indicate whether the back event was handled or not.
  1444. Possible Issues
  1445. ---------------
  1446. Applications which override this method will fail to compile.
  1447. Workaround
  1448. ----------
  1449. You will need to update your code to return a bool indicating whether the back
  1450. event was handled or not.
  1451. Rationale
  1452. ---------
  1453. The back button behaviour on Android was previously broken as it would not do
  1454. anything. The new code will correctly call finish() on the Activity when the
  1455. back button is pressed but this method now allows the user to override this to
  1456. implement their own custom navigation behaviour by returning true to indicate
  1457. that it has been handled.
  1458. Change
  1459. ------
  1460. The AudioBlock class has been refactored and some of the method names have
  1461. changed. Additionally the `const` behaviour now mirrors that of `std::span`,
  1462. with the `const`-ness of the contained data decoupled from the `const`-ness of
  1463. the container.
  1464. Possible Issues
  1465. ---------------
  1466. Code using the old method names or violating `const`-correctness will fail to
  1467. compile.
  1468. Workaround
  1469. ----------
  1470. You will need to update your code to use the new method names and select an
  1471. appropriate `const`-ness for the AudioBlock and the data it references.
  1472. Rationale
  1473. ---------
  1474. The names of some of the methods in the AudioBlock class were ambiguous,
  1475. particularly when chaining methods involving references to other blocks. The
  1476. interaction between the `const`-ness of the AudioBlock and the `const`-ness of
  1477. the referenced data was also ambiguous and has now been standardised to the
  1478. same behaviour as other non-owning data views like `std::span`.
  1479. Version 5.4.4
  1480. =============
  1481. Change
  1482. ------
  1483. The Visual Studio 2013 exporter has been removed from the Projucer and we will
  1484. no longer maintain backwards compatibility with Visual Studio 2013 in JUCE.
  1485. Possible Issues
  1486. ---------------
  1487. It is no longer possible to create Visual Studio 2013 projects from the
  1488. Projucer or compile JUCE-based software using Visual Studio 2013.
  1489. Workaround
  1490. ----------
  1491. If you are using Visual Studio 2013 to build your projects you will need to
  1492. update to a more modern version of Visual Studio.
  1493. Rationale
  1494. ---------
  1495. Of all the platforms JUCE supports Visual Studio 2013 was holding us back the
  1496. most in terms of C++ features we would like to use more broadly across the
  1497. codebase. It is still possible to target older versions of Windows with more
  1498. modern versions of Visual Studio. Until recently the AAX SDK was distributed as
  1499. a Visual Studio 2013 project, but this is now provided as a Visual Studio 2017
  1500. project.
  1501. Change
  1502. ------
  1503. JUCE is moving towards using C++11 pointer container types instead of passing
  1504. raw pointers as arguments and return values.
  1505. Possible Issues
  1506. ---------------
  1507. You will need to change your code to pass std::unique_ptr into and out of
  1508. various functions across JUCE's API.
  1509. Workaround
  1510. ----------
  1511. None
  1512. Rationale
  1513. ---------
  1514. Indicating ownership through the transfer of smart pointer types has been part
  1515. of mainstream C++ for a long time and this change enforces memory safety by
  1516. default in most situations.
  1517. Change
  1518. ------
  1519. SystemTrayIconComponent::setIconImage now takes two arguments, rather than one.
  1520. The new argument is a template image for use on macOS where all non-transparent
  1521. regions will render in a monochrome colour determined dynamically by the
  1522. operating system.
  1523. Possible Issues
  1524. ---------------
  1525. You will now need to provide two images to display a SystemTrayIconComponent
  1526. and the SystemTrayIconComponent will have a different appearance on macOS.
  1527. Workaround
  1528. ----------
  1529. If you are not targeting macOS then you can provide an empty image, `{}`, for
  1530. the second argument. If you are targeting macOS then you will likely need to
  1531. design a new monochrome icon.
  1532. Rationale
  1533. ---------
  1534. The introduction of "Dark Mode" in macOS 10.14 means that menu bar icons must
  1535. support several different colours and highlight modes to retain the same
  1536. appearance as the native Apple icons. Doing this correctly without delegating
  1537. the behaviour to the operating system is extremely cumbersome, and the APIs we
  1538. were previously using to interact with menu bar items have been deprecated.
  1539. Change
  1540. ------
  1541. The AudioBlock class now differentiates between const and non-const data.
  1542. Possible Issues
  1543. ---------------
  1544. The return type of the getInputBlock() method of the ProcessContextReplacing
  1545. and ProcessContextNonReplacing classes has changed from AudioBlock<X> to
  1546. AudioBlock<const X>.
  1547. Workaround
  1548. ----------
  1549. For ProcessContextReplacing you should use getOutputBlock() instead of
  1550. getInputBlock(). For ProcessContextNonReplacing attempting to modify the input
  1551. block is very likely an error.
  1552. Rationale
  1553. ---------
  1554. This change makes the intent of the code much clearer and means that we can
  1555. remove some const_cast operations.
  1556. Change
  1557. ------
  1558. The formatting of floating point numbers written to XML and JSON files has
  1559. changed.
  1560. Note that there is no change in precision - the XML and JSON files containing
  1561. the new format numbers will parse in exactly the same way, it is only the
  1562. string representation that has changed.
  1563. Possible Issues
  1564. ---------------
  1565. If you rely upon exactly reproducing XML or JSON files then the new files may
  1566. be different.
  1567. Workaround
  1568. ----------
  1569. Update any reference XML or JSON files to use the new format.
  1570. Rationale
  1571. ---------
  1572. The new format retains full precision, provides a human friendly representation
  1573. of values near 1, and uses scientific notation for small and large numbers.
  1574. This prevents needless file size bloat from numbers like 0.00000000000000001.
  1575. Version 5.4.3
  1576. =============
  1577. Change
  1578. ------
  1579. The global user module path setting in the Projucer can now only contain a
  1580. single path.
  1581. Possible Issues
  1582. ---------------
  1583. Projects that previously relied on using multiple global user module paths
  1584. separated by a semicolon will fail to find these modules after re-saving.
  1585. Workaround
  1586. ----------
  1587. Replace the multiple paths with a single global user module path.
  1588. Rationale
  1589. ---------
  1590. Using multiple global user module paths did not work when saving a project
  1591. which exported to different OSes. Only allowing a single path will prevent this
  1592. from silently causing issues.
  1593. Version 5.4.2
  1594. =============
  1595. Change
  1596. ------
  1597. The return type of Block::getBlockAreaWithinLayout() has been changed from
  1598. Rectangle to a simpler BlockArea struct.
  1599. Possible Issues
  1600. ---------------
  1601. Classes that derive from Block and implement this pure virtual method will no
  1602. longer compile due to a change in the function signature.
  1603. Workaround
  1604. ----------
  1605. Update the method to return a BlockArea struct and update code that calls
  1606. getBlockAreaWithinLayout to handle a BlockArea instead of a Rectangle.
  1607. Rationale
  1608. ---------
  1609. The juce_blocks_basics is ISC licensed and therefore cannot depend on the
  1610. GPL/Commercial licensed juce_graphics module that contains Rectangle.
  1611. Change
  1612. ------
  1613. Renaming and deletion of open file handles on Windows is now possible using the
  1614. FILE_SHARE_DELETE flag.
  1615. Possible Issues
  1616. ---------------
  1617. Previous code that relied on open files not being able to be renamed or deleted
  1618. on Windows may fail.
  1619. Workaround
  1620. ----------
  1621. No workaround.
  1622. Rationale
  1623. ---------
  1624. This unifies the behaviour across OSes as POSIX systems already allow this.
  1625. Change
  1626. ------
  1627. Multiple changes to low-level, non-public JNI and Android APIs.
  1628. Possible Issues
  1629. ---------------
  1630. If you were using any non-public, low-level JNI macros, calling java code or
  1631. receiving JNI callbacks, then your code will probably no longer work. See the
  1632. forum for further details.
  1633. Workaround
  1634. ----------
  1635. See the forum for further details.
  1636. Rationale
  1637. ---------
  1638. See the forum for further details.
  1639. Change
  1640. ------
  1641. The minimum Android version for a JUCE app is now Android 4.1
  1642. Possible Issues
  1643. ---------------
  1644. Your app may not run on very old versions of Android (less than 0.5% of the
  1645. devices).
  1646. Workaround
  1647. ----------
  1648. There is no workaround.
  1649. Rationale
  1650. ---------
  1651. Less than 0.5% of all devices in the world run versions of Android older than
  1652. Android 4.1. In the interest of keeping JUCE code clean and lean, we must
  1653. deprecate support for very old Android versions from time to time.
  1654. Version 5.4.0
  1655. =============
  1656. Change
  1657. ------
  1658. The use of WinRT MIDI functions has been disabled by default for any version
  1659. of Windows 10 before 1809 (October 2018 Update).
  1660. Possible Issues
  1661. ---------------
  1662. If you were previously using WinRT MIDI functions on older versions of Windows
  1663. then the new behaviour is to revert to the old Win32 MIDI API.
  1664. Workaround
  1665. ----------
  1666. Set the preprocessor macro JUCE_FORCE_WINRT_MIDI=1 (in addition to the
  1667. previously selected JUCE_USE_WINRT_MIDI=1) to allow the use of the WinRT API on
  1668. older versions of Windows.
  1669. Rationale
  1670. ---------
  1671. Until now JUCE's support for the Windows 10 WinRT MIDI API was experimental,
  1672. due to longstanding issues within the API itself. These issues have been
  1673. addressed in the Windows 10 1809 (October 2018 Update) release.
  1674. Change
  1675. ------
  1676. The VST2 SDK embedded within JUCE has been removed.
  1677. Possible Issues
  1678. ---------------
  1679. 1. Building or hosting VST2 plug-ins requires header files from the VST2 SDK,
  1680. which is no longer part of JUCE.
  1681. 2. Building a VST2-compatible VST3 plug-in (the previous default behaviour in
  1682. JUCE) requires header files from the VST2 SDK, which is no longer part of
  1683. JUCE.
  1684. Workaround
  1685. ----------
  1686. 1. The VST2 SDK can be obtained from the vstsdk3610_11_06_2018_build_37 (or
  1687. older) VST3 SDK or JUCE version 5.3.2. You should put the VST2 SDK in your
  1688. header search paths or use the "VST (Legacy) SDK Folder" fields in the
  1689. Projucer.
  1690. 2. For new plug-in projects where you will be releasing both a VST2 and VST3
  1691. version, and you want the VST3 plug-in to replace the VST2 plug-in in
  1692. hosts that support it, then you should enable the JUCE_VST3_CAN_REPLACE_VST2
  1693. option.
  1694. 3. When a new JUCE plug-in project is created the value of
  1695. JUCE_VST3_CAN_REPLACE_VST2 will be set to zero.
  1696. Rationale
  1697. ---------
  1698. Distributing VST2 plug-ins requires a VST2 license from Steinberg. Following
  1699. Steinberg's removal of the VST2 SDK from their public SDKs we are also removing
  1700. the VST2 SDK from the JUCE codebase.
  1701. Change
  1702. ------
  1703. The AudioProcessorValueTreeState::createAndAddParameter function has been
  1704. deprecated.
  1705. Possible Issues
  1706. ---------------
  1707. Deprecation warnings will be seen when compiling code which uses this function
  1708. and eventually builds will fail when it is later removed from the API.
  1709. Workaround
  1710. ----------
  1711. Previous calls to
  1712. createAndAddParameter (paramID, paramName, ...);
  1713. can be directly replaced with
  1714. using Parameter = AudioProcessorValueTreeState::Parameter;
  1715. createAndAddParameter (std::make_unique<Parameter> (paramID, paramName, ...));
  1716. but an even better approach is to use the new AudioProcessorValueTreeState
  1717. constructor where you can pass both RangedAudioParameters and
  1718. AudioProcessorParameterGroups of RangedAudioParameters to the
  1719. AudioProcessorValueTreeState and initialise the ValueTree simultaneously.
  1720. Rationale
  1721. ---------
  1722. The new createAndAddParameter method is much more flexible and enables any
  1723. parameter types derived from RangedAudioParameter to be managed by the
  1724. AudioProcessorValueTreeState.
  1725. Change
  1726. ------
  1727. The Projucer's per-exporter Android SDK/NDK path options have been removed.
  1728. Possible Issues
  1729. ---------------
  1730. Projects that previously used these fields may no longer build.
  1731. Workaround
  1732. ----------
  1733. Use the Projucer's global paths settings to point to these directories, either
  1734. by opening the "Projucer/File->Global Paths..." menu item or using the
  1735. "--set-global-search-path" command-line option.
  1736. Rationale
  1737. ---------
  1738. Having multiple places where the paths could be set was confusing and could
  1739. cause unexpected mismatches.
  1740. Change
  1741. ------
  1742. SystemStats::getDeviceDescription() will now return the device code on iOS e.g.
  1743. "iPhone7, 2" for an iPhone 6 instead of just "iPhone".
  1744. Possible Issues
  1745. ---------------
  1746. Code that previously relied on this method returning either explicitly "iPhone"
  1747. or "iPad" may no longer work.
  1748. Workaround
  1749. ----------
  1750. Modify this code to handle the new device code string e.g. by changing:
  1751. SystemStats::getDeviceDescription() == "iPhone";
  1752. to
  1753. SystemStats::getDeviceDescription().contains ("iPhone");.
  1754. Rationale
  1755. ---------
  1756. The exact device model can now be deduced from this information instead of just
  1757. the device family.
  1758. Change
  1759. ------
  1760. DragAndDropContainer::performExternalDragDropOfFiles() and
  1761. ::performExternalDragDropOfText() are now asynchronous on Windows.
  1762. Possible Issues
  1763. ---------------
  1764. Code that previously relied on these operations being synchronous and blocking
  1765. until completion will no longer work as the methods will return immediately and
  1766. run asynchronously.
  1767. Workaround
  1768. ----------
  1769. Use the callback argument that has been added to these methods to register a
  1770. lambda that will be called when the operation has been completed.
  1771. Rationale
  1772. ---------
  1773. The behaviour of these methods is now consistent across all platforms and the
  1774. method no longer blocks the message thread on Windows.
  1775. Change
  1776. ------
  1777. AudioProcessor::getTailLengthSeconds can now return infinity for
  1778. VST/VST3/AU/AUv3.
  1779. Possible Issues
  1780. ---------------
  1781. If you are using the result of getTailLengthSeconds to allocate a buffer in
  1782. your host, then your host will now likely crash when loading a plug-in with an
  1783. infinite tail time.
  1784. Workaround
  1785. ----------
  1786. Rewrite your code to not use the result of getTailLengthSeconds directly to
  1787. allocate a buffer.
  1788. Rationale
  1789. ---------
  1790. Before this change there was no way for a JUCE plug-in to report an infinite
  1791. tail time.
  1792. Version 5.3.2
  1793. =============
  1794. Change
  1795. ------
  1796. The behaviour of an UndoManager used by an AudioProcessorValueTreeState has
  1797. been improved.
  1798. Possible Issues
  1799. ---------------
  1800. If your plug-in contains an UndoManager used by an AudioProcessorValueTreeState
  1801. and relies upon the old behaviour of the UndoManager then it is possible that
  1802. the new behaviour is no longer appropriate for your use case.
  1803. Workaround
  1804. ----------
  1805. Use an external UndoManager to reproduce the old behaviour manually.
  1806. Rationale
  1807. ---------
  1808. This change fixes a few bugs in the behaviour of an UndoManager used by an
  1809. AudioProcessorValueTreeState.
  1810. Change
  1811. ------
  1812. JUCE no longer supports OS X deployment targets earlier than 10.7.
  1813. Possible Issues
  1814. ---------------
  1815. If you were previously targeting OS X 10.5 or 10.6 you will no longer be able
  1816. to build JUCE-based products compatible with those platforms.
  1817. Workaround
  1818. ----------
  1819. None. With the appropriate JUCE licence you may be able to backport new JUCE
  1820. features, but there will be no official support for this.
  1821. Rationale
  1822. ---------
  1823. Increasing the minimum supported OS X version allows the JUCE codebase to make
  1824. use of the more modern C++ features found in the 10.7 standard library, which
  1825. in turn will increase thread and memory safety.
  1826. Version 5.3.0
  1827. =============
  1828. Change
  1829. ------
  1830. The JUCE examples have been cleaned up, modernised and converted into PIPs
  1831. (Projucer Instant Projects). The JUCE Demo has been removed and replaced by the
  1832. DemoRunner application and larger projects such as the Audio Plugin Host and
  1833. the Network Graphics Demo have been moved into the extras directory.
  1834. Possible Issues
  1835. ---------------
  1836. 1. Due to the large number of changes that have occurred in the JUCE Git
  1837. repository, pulling this version may result in a messy folder structure with
  1838. empty directories that have been removed.
  1839. 2. The JUCE Demo project is no longer in the JUCE repository.
  1840. 3. The Audio Plugin Host project has moved from the examples directory to the
  1841. extras directory.
  1842. Workaround
  1843. ----------
  1844. 1. Run a Git clean command (git clean -xdf) in your JUCE directory to remove
  1845. all untracked files, directories and build products.
  1846. 2. The new DemoRunner application, located in extras/DemoRunner, can be used to
  1847. preview all the JUCE examples and see the code side-by-side.
  1848. 3. Change any file paths that depended on the plugin host project being located
  1849. in the examples directory to use the extras directory instead.
  1850. Rationale
  1851. ---------
  1852. The JUCE examples had inconsistent naming, coding styles and the projects and
  1853. build products took up a large amount of space in the repository. Replacing
  1854. them with PIPs reduces the file size and allows us to categorise the examples
  1855. better, as well as cleaning up the code.
  1856. Change
  1857. ------
  1858. When hosting plug-ins all AudioProcessor methods of managing parameters that
  1859. take a parameter index as an argument have been deprecated.
  1860. Possible Issues
  1861. ---------------
  1862. A single assertion will be fired in debug builds on the first use of a
  1863. deprecated function.
  1864. Workaround
  1865. ----------
  1866. When hosting plug-ins you should use the AudioProcessor::getParameters() method
  1867. and interact with parameters via the returned array of
  1868. AudioProcessorParameters. For a short-term fix you can also continue past the
  1869. assertion in your debugger, or temporarily modify the JUCE source code to
  1870. remove it.
  1871. Rationale
  1872. ---------
  1873. Given the structure of JUCE's API it is impossible to deprecate these functions
  1874. using only compile-time messages. Therefore a single assertion, which can be
  1875. safely ignored, serves to indicate that these functions should no longer be
  1876. used. The move away from the AudioProcessor methods both improves the interface
  1877. to that class and makes ongoing development work much easier.
  1878. Change
  1879. ------
  1880. This InAppPurchases class is now a JUCE Singleton. This means that you need
  1881. to get an instance via InAppPurchases::getInstance(), instead of storing a
  1882. InAppPurchases object yourself.
  1883. Possible Issues
  1884. ---------------
  1885. Any code using InAppPurchases needs to be updated to retrieve a singleton
  1886. pointer to InAppPurchases.
  1887. Workaround
  1888. ----------
  1889. Instead of holding a InAppPurchase member yourself, you should get an instance
  1890. via InAppPurchases::getInstance(), e.g.
  1891. instead of:
  1892. InAppPurchases iap;
  1893. iap.purchaseProduct (...);
  1894. call:
  1895. InAppPurchases::getInstance()->purchaseProduct (...);
  1896. Rationale
  1897. ---------
  1898. This change was required to fix an issue on Android where on failed transaction
  1899. a listener would not get called.
  1900. Change
  1901. ------
  1902. JUCE's MPE classes have been updated to reflect the official specification
  1903. recently approved by the MIDI Manufacturers Association (MMA).
  1904. Possible Issues
  1905. ---------------
  1906. The most significant changes have occurred in the MPEZoneLayout classes and
  1907. programs using the higher level MPE classes such as MPEInstrument,
  1908. MPESynthesiser, MPESynthesiserBase and MPESynthesiserVoice should be
  1909. unaffected.
  1910. Previously, any MIDI channel from 1 - 15 could be selected to be the master
  1911. channel of an MPE zone, with a specified number of member channels ascending
  1912. from the master channel + 1. However, in the new specification this has been
  1913. simplified so that a device only has a lower and/or an upper zone, where the
  1914. lower zone has master channel 1 and assigns new member channels ascending from
  1915. channel 2 and the upper zone has master channel 16 and assigns new member
  1916. channels descending from channel 15.
  1917. Workaround
  1918. ----------
  1919. Use the MPEZoneLayout::setLowerZone() and MPEZoneLayout::setUpperZone() methods
  1920. to set zone layouts.
  1921. Any UI that allows users to select and set zones on an MPE instrument should
  1922. also be updated to reflect the specification changes.
  1923. Rationale
  1924. ---------
  1925. The MPE classes in JUCE are out of date and should be updated to reflect the
  1926. new, official MPE standard.
  1927. Version 5.2.1
  1928. =============
  1929. Change
  1930. ------
  1931. Calling JUCEApplicationBase::quit() on Android will now really quit the app,
  1932. rather than just placing it in background. Starting with API level 21 (Android
  1933. 5.0), the app will not appear in recent apps list after calling quit(). Prior
  1934. to API 21, the app will still appear in recent app lists but when a user
  1935. chooses the app, a new instance of the app will be started.
  1936. Possible Issues
  1937. ---------------
  1938. Any code calling JUCEApplicationBase::quit() to place the app in background
  1939. will close the app instead.
  1940. Workaround
  1941. ----------
  1942. Use Process::hide().
  1943. Rationale
  1944. ---------
  1945. The old behaviour JUCEApplicationBase::quit() was confusing JUCE code, as a new
  1946. instance of JUCE app was attempted to be created, while the older instance was
  1947. still running in background. This would result in assertions when starting a
  1948. second instance.
  1949. Change
  1950. ------
  1951. On Windows, release builds will now link to the dynamic C++ runtime by default
  1952. Possible Issues
  1953. ---------------
  1954. If you are creating a new .jucer project, then your plug-in will now link to
  1955. the dynamic C++ runtime by default, which means that you MUST ensure that the
  1956. C++ runtime libraries exist on your customer's computers.
  1957. Workaround
  1958. ----------
  1959. If you are only targeting Windows 10, then the C++ runtime is now part of the
  1960. system core components and will always exist on the computers of your customers
  1961. (just like kernel332.dll, for example). If you are targeting Windows versions
  1962. between Vista and Windows 10, then you should build your plug-in with the
  1963. latest updated version of VS2015 or later, which ensures that it's linked to
  1964. the universal runtime. Universal runtime is part of the system's core libraries
  1965. on Windows 10 and on Windows versions Vista to 8.1, it will be available on
  1966. your customer's computers via Windows Update. Unfortunately, if your customer
  1967. has just installed Windows 8.1 to Vista on a fresh computer, then there is a
  1968. chance that the update mechanism for the universal runtime hasn't triggered yet
  1969. and your plug-in may still fail. Your installer should prompt the user to
  1970. install all the Windows updates in this case or you can deploy the universal
  1971. runtime as a redistributable with your installer. If you are targeting earlier
  1972. versions of Windows then you should always include the runtime as a
  1973. redistributable with your plug-in's installer. Alternatively, you can change
  1974. the runtime linking to static (however, see 'Rationale' section).
  1975. Rationale
  1976. ---------
  1977. In a recent update to Windows 10, Microsoft has limited the number of fiber
  1978. local storage (FLS) slots per process. Effectively, this limits how many
  1979. plug-ins with static runtime linkage can be loaded into a DAW. In the worst
  1980. case, this limits the total number of plug-ins to a maximum of 64 plug-ins.
  1981. There is no workaround for DAW vendors and the only solution is to push plug-in
  1982. vendors to use the dynamic runtime. To help with this, JUCE has decided to make
  1983. dynamic runtime linkage the default in JUCE.
  1984. Change
  1985. ------
  1986. AudioProcessorGraph interface has changed in a number of ways - Node objects
  1987. are now reference counted, there are different accessor methods to iterate
  1988. them, and misc other small improvements to the API
  1989. Possible Issues
  1990. ---------------
  1991. The changes won't cause any silent errors in user code, but will require some
  1992. manual refactoring
  1993. Workaround
  1994. ----------
  1995. Just find equivalent new methods to replace existing code.
  1996. Rationale
  1997. ---------
  1998. The graph class was extremely old and creaky, and these changes is the start of
  1999. an improvement process that should eventually result in it being broken down
  2000. into fundamental graph building block classes for use in other contexts.
  2001. Version 5.2.0
  2002. =============
  2003. Change
  2004. ------
  2005. Viewport now enables "scroll on drag" mode by default on Android and iOS.
  2006. Possible Issues
  2007. ---------------
  2008. Any code relying on "scroll on drag" mode being turned off by default, should
  2009. disable it manually.
  2010. Workaround
  2011. ----------
  2012. None.
  2013. Rationale
  2014. ---------
  2015. It is expected on mobile devices to be able to scroll a list by just a drag,
  2016. rather than using a dedicated scrollbar. The scrollbar is still available
  2017. though if needed.
  2018. Change
  2019. ------
  2020. The previous setting of Android exporter "Custom manifest xml elements"
  2021. creating child nodes of <application> element has been replaced by "Custom
  2022. manifest XML content" setting that allows to specify the content of the entire
  2023. manifest instead. Any previously values of the old setting will be used in the
  2024. new setting by default, and they will need changing as mentioned in Workaround.
  2025. The custom content will be merged with the content auto-generated by Projucer.
  2026. Any custom elements or custom attributes will override the ones set by
  2027. Projucer. Projucer will also automatically add any missing and required
  2028. elements and attributes.
  2029. Possible Issues
  2030. ---------------
  2031. If a Projucer project used "Custom manifest xml elements" field, the value will
  2032. no longer be compatible with the project generated in the latest Projucer
  2033. version. The solution is very simple and quick though, as mentioned in the
  2034. Workaround section.
  2035. Workaround
  2036. ----------
  2037. For any elements previously used, simply embed them explicitly in
  2038. <manifest><application> elements, for example instead of:
  2039. <meta-data android:name="paramId1" android:value="paramValue1"/>
  2040. <meta-data android:name="paramId2" android:value="paramValue2"/>
  2041. simply write:
  2042. <manifest>
  2043. <application>
  2044. <meta-data android:name="paramId1" android:value="paramValue1"/>
  2045. <meta-data android:name="paramId2" android:value="paramValue2"/>
  2046. </application>
  2047. </manifest>
  2048. Rationale
  2049. ---------
  2050. To maintain the high level of flexibility of generated Android projects and to
  2051. avoid creating fields in Projucer for every possible future parameter, it is
  2052. simpler to allow to set up the required parameters manually. This way it is not
  2053. only possible to add any custom elements but it is also possible to override
  2054. the default attributes assigned by Projucer for the required elements. For
  2055. instance, if the default value of <supports-screens> element is not
  2056. satisfactory because you want a support for x-large screens only, simply set
  2057. "Custom manifest XML content" to:
  2058. <manifest>
  2059. <supports-screens android:xlargeScreens="true"/>
  2060. </manifest>
  2061. Version 5.1.2
  2062. =============
  2063. Change
  2064. ------
  2065. The method used to classify AudioUnit, VST3 and AAX plug-in parameters as
  2066. either continuous or discrete has changed, and AudioUnit and AudioUnit v3
  2067. parameters are marked as high precision by default.
  2068. Possible Issues
  2069. ---------------
  2070. Plug-ins: DAW projects with automation data written by an AudioUnit, AudioUnit
  2071. v3 VST3 or AAX plug-in built with JUCE version 5.1.1 or earlier may load
  2072. incorrectly when opened by an AudioUnit, AudioUnit v3, VST3 or AAX plug-in
  2073. built with JUCE version 5.1.2 and later.
  2074. Hosts: The AudioPluginInstance::getParameterNumSteps method now returns correct
  2075. values for AU and VST3 plug-ins.
  2076. Workaround
  2077. ----------
  2078. Plug-ins: Enable JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE in the
  2079. juce_audio_plugin_client module config page in the Projucer.
  2080. Hosts: Use AudioPluginInstance::getDefaultNumParameterSteps as the number of
  2081. steps for all parameters.
  2082. Rationale
  2083. ---------
  2084. The old system for presenting plug-in parameters to a host as either continuous
  2085. or discrete is inconsistent between plug-in types and lacks sufficient
  2086. flexibility. This change harmonises the behaviour and allows individual
  2087. parameters to be marked as continuous or discrete. If AudioUnit and AudioUnit
  2088. v3 parameters are not marked as high precision then hosts like Logic Pro only
  2089. offer a limited number of parameter values, which again produces different
  2090. behaviour for different plug-in types.
  2091. Change
  2092. ------
  2093. A new FrameRateType fps23976 has been added to AudioPlayHead,
  2094. Possible Issues
  2095. ---------------
  2096. Previously JUCE would report the FrameRateType fps24 for both 24 and 23.976
  2097. fps. If your code uses switch statements (or similar) to handle all possible
  2098. frame rate types, then this change may cause it to fall through.
  2099. Workaround
  2100. ----------
  2101. Add fps23976 to your switch statement and handle it appropriately.
  2102. Rationale
  2103. ---------
  2104. JUCE should be able to handle all popular frame rate codes but was missing
  2105. support for 23.976.
  2106. Change
  2107. ------
  2108. The String (bool) constructor and operator<< (String&, bool) have been
  2109. explicitly deleted.
  2110. Possible Issues
  2111. ---------------
  2112. Previous code which relied on an implicit bool to int type conversion to
  2113. produce a String will not compile.
  2114. Workaround
  2115. ----------
  2116. Cast your bool to an integer to generate a string representation of it.
  2117. Rationale
  2118. ---------
  2119. Letting things implicitly convert to bool to produce a String opens the door to
  2120. all kinds of nasty type conversion edge cases. Furthermore, before this change,
  2121. MacOS would automatically convert bools to ints but this wouldn't occur on
  2122. different platform. Now the behaviour is consistent across all operating
  2123. systems supported by JUCE.
  2124. Change
  2125. ------
  2126. The writeAsJSON virtual method of the DynamicObject class requires an
  2127. additional parameter, maximumDecimalPlaces, to specify the maximum precision of
  2128. floating point numbers.
  2129. Possible Issues
  2130. ---------------
  2131. Classes which inherit from DynamicObject and override this method will need to
  2132. update their method signature.
  2133. Workaround
  2134. ----------
  2135. Your custom DynamicObject class can choose to ignore the additional parameter
  2136. if you don't wish to support this behaviour.
  2137. Rationale
  2138. ---------
  2139. When serialising the results of calculations to JSON the rounding of floating
  2140. point numbers can result in numbers with 17 significant figures where only a
  2141. few are required. This change to DynamicObject is required to support
  2142. truncating those numbers.
  2143. Version 5.1.0
  2144. =============
  2145. Change
  2146. ------
  2147. The JUCE_COMPILER_SUPPORTS_LAMBDAS preprocessor macro has been removed.
  2148. Possible Issues
  2149. ---------------
  2150. If your project is using JUCE_COMPILER_SUPPORTS_LAMBDAS in your source code
  2151. then it will likely evaluate to "false" and you could end up unnecessarily
  2152. using code paths which avoid lambda functions.
  2153. Workaround
  2154. ----------
  2155. Remove the usage of JUCE_COMPILER_SUPPORTS_LAMBDAS from your code.
  2156. Rationale
  2157. ---------
  2158. Lambda functions are now available on all platforms that JUCE supports.
  2159. Change
  2160. ------
  2161. The option to set the C++ language standard is now located in the project
  2162. settings instead of the build configuration settings.
  2163. Possible Issues
  2164. ---------------
  2165. Projects that had a specific version of the C++ language standard set for
  2166. exporter build configurations will instead use the default (C++11) when
  2167. re-saving with the new Projucer.
  2168. Workaround
  2169. ----------
  2170. Change the "C++ Language Standard" setting in the main project settings to the
  2171. required version - the Projucer will add this value to the exported project as
  2172. a compiler flag when saving exporters.
  2173. Rationale
  2174. ---------
  2175. Having a different C++ language standard option for each build configuration
  2176. was unnecessary and was not fully implemented for all exporters. Changing it to
  2177. a per-project settings means that the preference will propagate to all
  2178. exporters and only needs to be set in one place.
  2179. Change
  2180. ------
  2181. PopupMenus now scale according to the AffineTransform and scaling factor of
  2182. their target components.
  2183. Possible Issues
  2184. ---------------
  2185. Developers who have manually scaled their PopupMenus to fit the scaling factor
  2186. of the parent UI will now have the scaling applied two times in a row.
  2187. Workaround
  2188. ----------
  2189. 1. Do not apply your own manual scaling to make your popups match the UI
  2190. scaling
  2191. or
  2192. 2. Override the Look&Feel method
  2193. PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and
  2194. return false. See
  2195. https://github.com/juce-framework/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725
  2196. Rationale
  2197. ---------
  2198. Previously, PopupMenus would not scale if the GUI of the target component (or
  2199. any of its parents) were scaled. The only way to scale PopupMenus was via the
  2200. global scaling factor. This had several drawbacks as the global scaling factor
  2201. would scale everything. This was especially problematic in plug-in editors.
  2202. Change
  2203. ------
  2204. Removed the setSecurityFlags() method from the Windows implementation of
  2205. WebInputStream as it disabled HTTPS security features.
  2206. Possible Issues
  2207. ---------------
  2208. Any code previously relying on connections to insecure webpages succeeding will
  2209. no longer work.
  2210. Workaround
  2211. ----------
  2212. Check network connectivity on Windows and re-write any code that relied on
  2213. insecure connections.
  2214. Rationale
  2215. ---------
  2216. The previous behaviour resulted in network connections on Windows having all
  2217. the HTTPS security features disabled, exposing users to network attacks. HTTPS
  2218. connections on Windows are now secure and will fail when connecting to an
  2219. insecure web address.
  2220. Change
  2221. ------
  2222. Pointer arithmetic on a pointer will have the same result regardless if it is
  2223. wrapped in JUCE's Atomic class or not.
  2224. Possible Issues
  2225. ---------------
  2226. Any code using pointer arithmetic on Atomic<T*> will now have a different
  2227. result leading to undefined behaviour or crashes.
  2228. Workaround
  2229. ----------
  2230. Re-write your code in a way that it does not depend on your pointer being
  2231. wrapped in JUCE's Atomic or not. See rationale.
  2232. Rationale
  2233. ---------
  2234. Before this change, pointer arithmetic with JUCE's Atomic type would yield
  2235. confusing results. For example, the following code would assert before this
  2236. change:
  2237. int* a; Atomic<int*> b;
  2238. jassert (++a == ++b);
  2239. Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's
  2240. Atomic always advances it's underlying pointer by a single byte. The same is
  2241. true for operator+=/operator-= and operator--. The difference in behaviour is
  2242. confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with
  2243. std::atomic.
  2244. Version 4.3.1
  2245. =============
  2246. Change
  2247. ------
  2248. JUCE has changed the way native VST3/AudioUnit parameter ids are calculated.
  2249. Possible Issues
  2250. ---------------
  2251. DAW projects with automation data written by an AudioUnit or VST3 plug-in built
  2252. with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit
  2253. or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using
  2254. JUCE_FORCE_USE_LEGACY_PARAM_IDS are not affected.
  2255. Workaround
  2256. ----------
  2257. Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the
  2258. juce_audio_plugin_client module config page in the Projucer. For new plug-ins,
  2259. be sure to use the default value for this property.
  2260. Rationale
  2261. --------
  2262. JUCE needs to convert between its own JUCE parameter id format (strings) to the
  2263. native parameter id formats of the various plug-in backends. For VST3 and
  2264. AudioUnits, JUCE uses a hash function to generate a numeric id. However, some
  2265. VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any
  2266. parameters that have a negative parameter id. Therefore, the hash function for
  2267. VST3/AudioUnits needed to be changed to only return positive-valued hashes.
  2268. Version 4.3.0
  2269. =============
  2270. Change
  2271. ------
  2272. A revised multi-bus API was released which supersedes the previously flawed
  2273. multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive).
  2274. Possible Issues
  2275. ---------------
  2276. If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive),
  2277. then you will need to update your plug-in to the new multi-bus API. Pre JUCE
  2278. 4.0.0 plug-ins are not affected apart from other breaking changes listed in
  2279. this document.
  2280. Workaround
  2281. ---------
  2282. None.
  2283. Rationale
  2284. --------
  2285. A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version
  2286. 4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE
  2287. 4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API
  2288. compatibility. However, the new multi-bus API is not compatible with the flawed
  2289. multi-bus API (JUCE version 4.0.0 - 4.2.4).
  2290. Change
  2291. ------
  2292. JUCE now generates the AAX plug-in bus layout configuration id independent from
  2293. the position as it appears in the Projucer’s legacy "Channel layout
  2294. configuration" field.
  2295. Possible Issues
  2296. ---------------
  2297. ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may
  2298. load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0
  2299. versions of JUCE.
  2300. Workaround
  2301. ----------
  2302. Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually
  2303. override which AAX plug-in id is associated to a specific bus layout of your
  2304. plug-in. This workaround is only necessary if you have released your plug-in
  2305. built with a version previous to JUCE 4.3.0.
  2306. Rationale
  2307. --------
  2308. The new multi-bus API offers more features, flexibility and accuracy in
  2309. specifying bus layouts which cannot be expressed by the Projucer’s legacy
  2310. "Channel layout configuration" field. The native plug-in format backends use
  2311. the new multi-bus callback APIs to negotiate channel layouts with the host -
  2312. including the AAX plug-in ids assigned to specific bus layouts. With the
  2313. callback API, there is no notion of an order in which the channel
  2314. configurations appear - as was the case with the legacy "Channel layout
  2315. configuration" field - and therefore cannot be used to generate the AAX plug-in
  2316. id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does
  2317. transparently convert the legacy "Channel layout configuration" field to the
  2318. new callback based multi-bus API, but this does not take the order into account
  2319. in which the channel configurations appear in the legacy "Channel layout
  2320. configuration" field.
  2321. Version 4.2.1
  2322. =============
  2323. Change
  2324. ------
  2325. JUCE now uses the paramID property used in AudioProcessorParameterWithID to
  2326. uniquely identify parameters to the host.
  2327. Possible Issues
  2328. ---------------
  2329. DAW projects with automation data written by an audio plug-in built with pre
  2330. JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with
  2331. JUCE 4.2.1 and later.
  2332. Workaround
  2333. ----------
  2334. Enable JUCE_FORCE_USE_LEGACY_PARAM_IDS in the juce_audio_plugin_client module config
  2335. page in the Projucer. For new plug-ins, be sure to disable this property.
  2336. Rationale
  2337. --------
  2338. Each parameter of the AudioProcessor has an id associated so that the plug-in’s
  2339. host can uniquely identify parameters. The id has a different data-type for
  2340. different plug-in types (for example VST uses integers, AAX uses string
  2341. identifiers). Before 4.2.1, JUCE generated the parameter id by using the index
  2342. of the parameter, i.e. the first parameter had id zero, the second parameter
  2343. had id one, etc. This caused problems for certain plug-in types where JUCE
  2344. needs to add internal parameters to the plug-in (for example VST3 requires the
  2345. bypass control to be a parameter - so JUCE automatically creates this parameter
  2346. for you in the VST3 backend). This causes subtle problems if a parameter is
  2347. added to an update of an already published plug-in. The new parameter’s id
  2348. would be identical to the id of the bypass parameter in old versions of your
  2349. plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade
  2350. their plug-in.
  2351. Most plug-in backends differentiate between a parameter’s id an index, so this
  2352. distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s
  2353. unique id from the paramID property of AudioProcessorParameterWithID class.