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.

355 lines
12KB

  1. JUCE breaking changes
  2. =====================
  3. Develop Branch
  4. =============
  5. Change
  6. ------
  7. The method used to classify AudioUnit, VST3 and AAX plug-in parameters as
  8. either continuous or discrete has changed.
  9. Possible Issues
  10. ---------------
  11. Plug-ins: DAW projects with automation data written by an AudioUnit, VST3 or
  12. AAX plug-in built with JUCE version 5.1.1 or earlier may load incorrectly when
  13. opened by an AudioUnit, VST3 or AAX plug-in built with JUCE version 5.2.0 and
  14. later.
  15. Hosts: The AudioPluginInstance::getParameterNumSteps method now returns correct
  16. values for AU and VST3 plug-ins.
  17. Workaround
  18. ----------
  19. Plug-ins: Enable JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE in the
  20. juce_audio_plugin_client module config page in the Projucer.
  21. Hosts: Use AudioPluginInstance::getDefaultNumParameterSteps as the number of
  22. steps for all parameters.
  23. Rationale
  24. ---------
  25. The old system for presenting plug-in parameters to a host as either continuous
  26. or discrete is inconsistent between plug-in types and lacks sufficient
  27. flexibility. This change harmonises the behaviour and allows individual
  28. parameters to be marked as continuous or discrete.
  29. Change
  30. ------
  31. A new FrameRateType fps23976 has been added to AudioPlayHead,
  32. Possible Issues
  33. ---------------
  34. Previously JUCE would report the FrameRateType fps24 for both 24 and 23.976
  35. fps. If your code uses switch statements (or similar) to handle all possible
  36. frame rate types, then this change may cause it to fall through.
  37. Workaround
  38. ----------
  39. Add fps23976 to your switch statement and handle it appropriately.
  40. Rationale
  41. ---------
  42. JUCE should be able to handle all popular frame rate codes but was missing
  43. support for 23.976.
  44. Change
  45. ------
  46. The String (bool) constructor and operator<< (String&, bool) have been
  47. explicitly deleted.
  48. Possible Issues
  49. ---------------
  50. Previous code which relied on an implicit bool to int type conversion to
  51. produce a String will not compile.
  52. Workaround
  53. ----------
  54. Cast your bool to an integer to generate a string representation of it.
  55. Rationale
  56. ---------
  57. Letting things implicitly convert to bool to produce a String opens the door to
  58. all kinds of nasty type conversion edge cases. Furthermore, before this change,
  59. MacOS would automatically convert bools to ints but this wouldn't occur on
  60. different platform. Now the behaviour is consistent across all operating
  61. systems supported by JUCE.
  62. Change
  63. ------
  64. The writeAsJSON virtual method of the DynamicObject class requires an
  65. additional parameter, maximumDecimalPlaces, to specify the maximum precision of
  66. floating point numbers.
  67. Possible Issues
  68. ---------------
  69. Classes which inherit from DynamicObject and override this method will need to
  70. update their method signature.
  71. Workaround
  72. ----------
  73. Your custom DynamicObject class can choose to ignore the additional parameter
  74. if you don't wish to support this behaviour.
  75. Rationale
  76. ---------
  77. When serialising the results of calculations to JSON the rounding of floating
  78. point numbers can result in numbers with 17 significant figures where only a
  79. few are required. This change to DynamicObject is required to support
  80. truncating those numbers.
  81. Version 5.1.0
  82. =============
  83. Change
  84. ------
  85. The option to set the C++ language standard is now located in the project
  86. settings instead of the build configuration settings.
  87. Possible Issues
  88. ---------------
  89. Projects that had a specific verison of the C++ language standard set for
  90. exporter build configurations will instead use the default (C++11) when
  91. re-saving with the new Projucer.
  92. Workaround
  93. ----------
  94. Change the "C++ Language Standard" setting in the main project settings to the
  95. required version - the Projucer will add this value to the exported project as
  96. a compiler flag when saving exporters.
  97. Rationale
  98. ---------
  99. Having a different C++ language standard option for each build configuration
  100. was unnecessary and was not fully implemented for all exporters. Changing it to
  101. a per-project settings means that the preference will propagate to all
  102. exporters and only needs to be set in one place.
  103. Change
  104. ------
  105. PopupMenus now scale according to the AffineTransform and scaling factor of
  106. their target components.
  107. Possible Issues
  108. ---------------
  109. Developers who have manually scaled their PopupMenus to fit the scaling factor
  110. of the parent UI will now have the scaling applied two times in a row.
  111. Workaround
  112. ----------
  113. 1. Do not apply your own manual scaling to make your popups match the UI
  114. scaling
  115. or
  116. 2. Override the Look&Feel method
  117. PopupMenu::LookAndFeelMethods::shouldPopupMenuScaleWithTargetComponent and
  118. return false. See
  119. https://github.com/WeAreROLI/JUCE/blob/c288c94c2914af20f36c03ca9c5401fcb555e4e9/modules/juce_gui_basics/menus/juce_PopupMenu.h#725
  120. Rationale
  121. ---------
  122. Previously, PopupMenus would not scale if the GUI of the target component (or
  123. any of it’s parents) were scaled. The only way to scale PopupMenus was via the
  124. global scaling factor. This had several drawbacks as the global scaling factor
  125. would scale everything. This was especially problematic in plug-in editors.
  126. Change
  127. ------
  128. Removed the setSecurityFlags() method from the Windows implementation of
  129. WebInputStream as it disabled HTTPS security features.
  130. Possible Issues
  131. ---------------
  132. Any code previously relying on connections to insecure webpages succeeding will
  133. no longer work.
  134. Workaround
  135. ----------
  136. Check network connectivity on Windows and re-write any code that relied on
  137. insecure connections.
  138. Rationale
  139. ---------
  140. The previous behaviour resulted in network connections on Windows having all
  141. the HTTPS security features disabled, exposing users to network attacks. HTTPS
  142. connections on Windows are now secure and will fail when connecting to an
  143. insecure web address.
  144. Change
  145. ------
  146. Pointer arithmetic on a pointer will have the same result regardless if it is
  147. wrapped in JUCE's Atomic class or not.
  148. Possible Issues
  149. ---------------
  150. Any code using pointer arithmetic on Atomic<T*> will now have a different
  151. result leading to undefined behaviour or crashes.
  152. Workaround
  153. ----------
  154. Re-write your code in a way that it does not depend on your pointer being
  155. wrapped in JUCE's Atomic or not. See rationale.
  156. Rationale
  157. ---------
  158. Before this change, pointer arithmetic with JUCE's Atomic type would yield
  159. confusing results. For example, the following code would assert before this
  160. change:
  161. int* a; Atomic<int*> b;
  162. jassert (++a == ++b);
  163. Pointer a in the above code would be advanced by sizeof(int) whereas the JUCE's
  164. Atomic always advances it's underlying pointer by a single byte. The same is
  165. true for operator+=/operator-= and operator--. The difference in behaviour is
  166. confusing and unintuitive. Furthermore, this aligns JUCE's Atomic type with
  167. std::atomic.
  168. Version 4.3.1
  169. =============
  170. Change
  171. ------
  172. JUCE has changed the way native VST3/AudioUnit parameter ids are calculated.
  173. Possible Issues
  174. ---------------
  175. DAW projects with automation data written by an AudioUnit or VST3 plug-in built
  176. with pre JUCE 4.3.1 versions will load incorrectly when opened by an AudioUnit
  177. or VST3 built with JUCE versions 4.3.1 and later. Plug-ins using
  178. JUCE_FORCE_USE_LEGACY_IDS are not affected.
  179. Workaround
  180. ----------
  181. Disable JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS in the
  182. juce_audio_plugin_client module config page in the Projucer. For new plug-ins,
  183. be sure to use the default value for this property.
  184. Rationale
  185. --------
  186. JUCE needs to convert between its own JUCE parameter id format (strings) to the
  187. native parameter id formats of the various plug-in backends. For VST3 and
  188. AudioUnits, JUCE uses a hash function to generate a numeric id. However, some
  189. VST3/AudioUnit hosts (specifically Studio One) have a bug that ignore any
  190. parameters that have a negative parameter id. Therefore, the hash function for
  191. VST3/AudioUnits needed to be changed to only return positive-valued hashes.
  192. Version 4.3.0
  193. =============
  194. Change
  195. ------
  196. A revised multi-bus API was released which supersedes the previously flawed
  197. multi-bus API - JUCE versions 4.0.0 - 4.2.4 (inclusive).
  198. Possible Issues
  199. ---------------
  200. If you have developed a plug-in with JUCE versions 4.0.0 - 4.2.4 (inclusive),
  201. then you will need to update your plug-in to the new multi-bus API. Pre JUCE
  202. 4.0.0 plug-ins are not affected apart from other breaking changes listed in
  203. this document.
  204. Woraround
  205. ---------
  206. None.
  207. Rationale
  208. --------
  209. A flawed multi-bus API was introduced with JUCE versions 4.0.0 up until version
  210. 4.2.4 (inclusive) which was not API compatible with pre JUCE 4 plug-ins. JUCE
  211. 4.3.0 releases a revised multi-bus API which restores pre JUCE 4 API
  212. compatibility. However, the new multi-bus API is not compatible with the flawed
  213. multi-bus API (JUCE version 4.0.0 - 4.2.4).
  214. Change
  215. ------
  216. JUCE now generates the AAX plug-in bus layout configuration id independent from
  217. the position as it appears in the Projucer’s legacy "Channel layout
  218. configuration" field.
  219. Possible Issues
  220. ---------------
  221. ProTools projects generated with a < 4.3.0 JUCE versions of your plug-in, may
  222. load the incorrect bus configuration when upgrading your plug-in to >= 4.3.0
  223. versions of JUCE.
  224. Workaround
  225. ----------
  226. Implement AudioProcessor’s getAAXPluginIDForMainBusConfig callback to manually
  227. override which AAX plug-in id is associated to a specific bus layout of your
  228. plug-in. This workaround is only necessary if you have released your plug-in
  229. built with a version previous to JUCE 4.3.0.
  230. Rationale
  231. --------
  232. The new multi-bus API offers more features, flexibility and accuracy in
  233. specifying bus layouts which cannot be expressed by the Projucer’s legacy
  234. "Channel layout configuration" field. The native plug-in format backends use
  235. the new multi-bus callback APIs to negotiate channel layouts with the host -
  236. including the AAX plug-in ids assigned to specific bus layouts. With the
  237. callback API, there is no notion of an order in which the channel
  238. configurations appear - as was the case with the legacy "Channel layout
  239. configuration" field - and therefore cannot be used to generate the AAX plug-in
  240. id. To remain backward compatible to pre JUCE 4.0.0 plug-ins, JUCE does
  241. transparently convert the legacy "Channel layout configuration" field to the
  242. new callback based multi-bus API, but this does not take the order into account
  243. in which the channel configurations appear in the legacy "Channel layout
  244. configuration" field.
  245. Version 4.2.1
  246. =============
  247. Change
  248. ------
  249. JUCE now uses the paramID property used in AudioProcessorParameterWithID to
  250. uniquely identify parameters to the host.
  251. Possible Issues
  252. ---------------
  253. DAW projects with automation data written by an audio plug-in built with pre
  254. JUCE 4.2.1 will load incorrectly when opened by an audio plug-in built with
  255. JUCE 4.2.1 and later.
  256. Workaround
  257. ----------
  258. Enable JUCE_FORCE_USE_LEGACY_IDS in the juce_audio_plugin_client module config
  259. page in the Projucer. For new plug-ins, be sure to disable this property.
  260. Rationale
  261. --------
  262. Each parameter of the AudioProcessor has an id associated so that the plug-in’s
  263. host can uniquely identify parameters. The id has a different data-type for
  264. different plug-in types (for example VST uses integers, AAX uses string
  265. identifiers). Before 4.2.1, JUCE generated the parameter id by using the index
  266. of the parameter, i.e. the first parameter had id zero, the second parameter
  267. had id one, etc. This caused problems for certain plug-in types where JUCE
  268. needs to add internal parameters to the plug-in (for example VST3 requires the
  269. bypass control to be a parameter - so JUCE automatically creates this parameter
  270. for you in the VST3 backend). This causes subtle problems if a parameter is
  271. added to an update of an already published plug-in. The new parameter’s id
  272. would be identical to the id of the bypass parameter in old versions of your
  273. plug-in, causing seemingly random plug-in bypass behaviour when user’s upgrade
  274. their plug-in.
  275. Most plug-in backends differentiate between a parameter’s id an index, so this
  276. distinction was adopted starting with JUCE 4.2.1 by deriving the parameter’s
  277. unique id from the paramID property of AudioProcessorParameterWithID class.