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.

253 lines
8.8KB

  1. JUCE breaking changes
  2. =====================
  3. Version 5.1.0
  4. =============
  5. Change
  6. ------
  7. The option to set the C++ language standard is now located in the project
  8. settings instead of the build configuration settings.
  9. Possible Issues
  10. ---------------
  11. Projects that had a specific verison of the C++ language standard set for
  12. exporter build configurations will instead use the default (C++11) when
  13. re-saving with the new Projucer.
  14. Workaround
  15. ----------
  16. Change the "C++ Language Standard" setting in the main project settings to the
  17. required version - the Projucer will add this value to the exported project as
  18. a compiler flag when saving exporters.
  19. Rationale
  20. ---------
  21. Having a different C++ language standard option for each build configuration
  22. was unnecessary and was not fully implemented for all exporters. Changing it to
  23. a per-project settings means that the preference will propagate to all
  24. exporters and only needs to be set in one place.
  25. Change
  26. ------
  27. PopupMenus now scale according to the AffineTransform and scaling factor of
  28. their target components.
  29. Possible Issues
  30. ---------------
  31. Developers who have manually scaled their PopupMenus to fit the scaling factor
  32. of the parent UI will now have the scaling applied two times in a row.
  33. Workaround
  34. ----------
  35. 1. Do not apply your own manual scaling to make your popups match the UI
  36. scaling
  37. or
  38. 2. Override the Look&Feel method
  39. PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and
  40. return false. See
  41. https://github.com/WeAreROLI/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725
  42. Rationale
  43. ---------
  44. Previously, PopupMenus would not scale if the GUI of the target component (or
  45. any of it’s parents) were scaled. The only way to scale PopupMenus was via the
  46. global scaling factor. This had several drawbacks as the global scaling factor
  47. would scale everything. This was especially problematic in plug-in editors.
  48. Change
  49. ------
  50. Removed the setSecurityFlags() method from the Windows implementation of
  51. WebInputStream as it disabled HTTPS security features.
  52. Possible Issues
  53. ---------------
  54. Any code previously relying on connections to insecure webpages succeeding will
  55. no longer work.
  56. Workaround
  57. ----------
  58. Check network connectivity on Windows and re-write any code that relied on
  59. insecure connections.
  60. Rationale
  61. ---------
  62. The previous behaviour resulted in network connections on Windows having all
  63. the HTTPS security features disabled, exposing users to network attacks. HTTPS
  64. connections on Windows are now secure and will fail when connecting to an
  65. insecure web address.
  66. Change
  67. ------
  68. Pointer arithmetic on a pointer will have the same result regardless if it is
  69. wrapped in JUCE's Atomic class or not.
  70. Possible Issues
  71. ---------------
  72. Any code using pointer arithmetic on Atomic<T*> will now have a different
  73. result leading to undefined behaviour or crashes.
  74. Workaround
  75. ----------
  76. Re-write your code in a way that it does not depend on your pointer being
  77. wrapped in JUCE's Atomic or not. See rationale.
  78. Rationale
  79. ---------
  80. Before this change, pointer arithmetic with JUCE's Atomic type would yield
  81. confusing results. For example, the following code would assert before this
  82. change:
  83. int* a; Atomic<int*> b;
  84. jassert (++a == ++b);
  85. Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's
  86. Atomic always advances it's underlying pointer by a single byte. The same is
  87. true for operator+=/operator-= and operator--. The difference in behaviour is
  88. confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with
  89. std::atomic.
  90. Version 4.3.1
  91. =============
  92. Change
  93. ------
  94. JUCE has changed the way native VST3/AudioUnit parameter ids are calculated.
  95. Possible Issues
  96. ---------------
  97. DAW projects with automation data written by an AudioUnit or VST3 plug-in built
  98. with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit
  99. or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using
  100. JUCE_FORCE_USE_LEGACY_IDS are not affected.
  101. Workaround
  102. ----------
  103. Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the
  104. juce_audio_plugin_client module config page in the Projucer. For new plug-ins,
  105. be sure to use the default value for this property.
  106. Rationale
  107. --------
  108. JUCE needs to convert between its own JUCE parameter id format (strings) to the
  109. native parameter id formats of the various plug-in backends. For VST3 and
  110. AudioUnits, JUCE uses a hash function to generate a numeric id. However, some
  111. VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any
  112. parameters that have a negative parameter id. Therefore, the hash function for
  113. VST3/AudioUnits needed to be changed to only return positive-valued hashes.
  114. Version 4.3.0
  115. =============
  116. Change
  117. ------
  118. A revised multi-bus API was released which supersedes the previously flawed
  119. multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive).
  120. Possible Issues
  121. ---------------
  122. If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive),
  123. then you will need to update your plug-in to the new multi-bus API. Pre JUCE
  124. 4.0.0 plug-ins are not affected apart from other breaking changes listed in
  125. this document.
  126. Woraround
  127. ---------
  128. None.
  129. Rationale
  130. --------
  131. A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version
  132. 4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE
  133. 4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API
  134. compatibility. However, the new multi-bus API is not compatible with the flawed
  135. multi-bus API (JUCE version 4.0.0 - 4.2.4).
  136. Change
  137. ------
  138. JUCE now generates the AAX plug-in bus layout configuration id independent from
  139. the position as it appears in the Projucer’s legacy "Channel layout
  140. configuration" field.
  141. Possible Issues
  142. ---------------
  143. ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may
  144. load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0
  145. versions of JUCE.
  146. Workaround
  147. ----------
  148. Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually
  149. override which AAX plug-in id is associated to a specific bus layout of your
  150. plug-in. This workaround is only necessary if you have released your plug-in
  151. built with a version previous to JUCE 4.3.0.
  152. Rationale
  153. --------
  154. The new multi-bus API offers more features, flexibility and accuracy in
  155. specifying bus layouts which cannot be expressed by the Projucer’s legacy
  156. "Channel layout configuration" field. The native plug-in format backends use
  157. the new multi-bus callback APIs to negotiate channel layouts with the host -
  158. including the AAX plug-in ids assigned to specific bus layouts. With the
  159. callback API, there is no notion of an order in which the channel
  160. configurations appear - as was the case with the legacy "Channel layout
  161. configuration" field - and therefore cannot be used to generate the AAX plug-in
  162. id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does
  163. transparently convert the legacy "Channel layout configuration" field to the
  164. new callback based multi-bus API, but this does not take the order into account
  165. in which the channel configurations appear in the legacy "Channel layout
  166. configuration" field.
  167. Version 4.2.1
  168. =============
  169. Change
  170. ------
  171. JUCE now uses the paramID property used in AudioProcessorParameterWithID to
  172. uniquely identify parameters to the host.
  173. Possible Issues
  174. ---------------
  175. DAW projects with automation data written by an audio plug-in built with pre
  176. JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with
  177. JUCE 4.2.1 and later.
  178. Workaround
  179. ----------
  180. Enable JUCE_FORCE_USE_LEGACY_IDS in the juce_audio_plugin_client module config
  181. page in the Projucer. For new plug-ins, be sure to disable this property.
  182. Rationale
  183. --------
  184. Each parameter of the AudioProcessor has an id associated so that the plug-in’s
  185. host can uniquely identify parameters. The id has a different data-type for
  186. different plug-in types (for example VST uses integers, AAX uses string
  187. identifiers). Before 4.2.1, JUCE generated the parameter id by using the index
  188. of the parameter, i.e. the first parameter had id zero, the second parameter
  189. had id one, etc. This caused problems for certain plug-in types where JUCE
  190. needs to add internal parameters to the plug-in (for example VST3 requires the
  191. bypass control to be a parameter - so JUCE automatically creates this parameter
  192. for you in the VST3 backend). This causes subtle problems if a parameter is
  193. added to an update of an already published plug-in. The new parameter’s id
  194. would be identical to the id of the bypass parameter in old versions of your
  195. plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade
  196. their plug-in.
  197. Most plug-in backends differentiate between a parameter’s id an index, so this
  198. distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s
  199. unique id from the paramID property of AudioProcessorParameterWithID class.