-
Notifications
You must be signed in to change notification settings - Fork 0
/
BREAKING-CHANGES.txt
executable file
·2936 lines (2313 loc) · 94.3 KB
/
BREAKING-CHANGES.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
JUCE breaking changes
=====================
Version 7.0.6
=============
Change
------
Thread::wait and WaitableEvent::wait now take a double rather than an int to
indicate the number of milliseconds to wait.
Possible Issues
---------------
Calls to either wait function may trigger warnings.
Workaround
----------
Explicitly cast the value to double.
Rationale
---------
Changing to double allows sub-millisecond waits which was important for
supporting changes to the HighResolutionTimer.
Change
------
RealtimeOptions member workDurationMs was replaced by three optional member
variables in RealtimeOptions, and all RealtimeOptions member variables were
marked private.
Possible Issues
---------------
Trying to construct a RealtimeOptions object with one or two values, or access
any of its member variables, will no longer compile.
Workaround
----------
Use the withMember functions to construct the object, and the getter functions
to access the member variable values.
Rationale
---------
The new approach improves the flexibility for users to specify realtime thread
options on macOS/iOS and improves the flexibility for the API to evolve without
introducing further breaking changes.
Change
------
JUCE module compilation files with a platform suffix are now checked case
insensitively for CMake builds.
Possible Issues
---------------
If a JUCE module compilation file ends in a specific platform suffix but does
not match the case for the string previously checked by the CMake
implementation, it may have compiled for all platforms. Now, it will only
compile for the platform specified by the suffix.
Workaround
----------
In most cases this was probably a bug, in other cases rename the file to remove
the platform suffix.
Rationale
---------
This change improves consistency between the Projucer and CMake integrations.
Change
------
An undocumented feature that allowed JUCE module compilation files to compile
for a specific platform or subset of platforms by declaring the platform name
followed by an underscore, was removed.
Possible Issues
---------------
If a JUCE module compilation file contains a matching platform suffix followed
by an underscore and is loaded by the Projucer it will no longer compile for
just that platform.
Workaround
----------
Use the suffix of the name only. If the undocumented feature was used to select
multiple platforms, make multiple separate files for each of the required
platforms.
Rationale
---------
This change improves consistency between the Projucer and CMake integrations.
Given the functionality was undocumented, the ease of a workaround, and the
added complexity required for CMake support, the functionality was removed.
Change
------
Unique device IDs on iOS now use the OS provided 'identifierForVendor'.
OnlineUnlockStatus has been updated to handle the iOS edge-case where a device
ID query might return an empty String.
Possible Issues
---------------
The License checks using InAppPurchases, getLocalMachineIDs(), and
getUniqueDeviceID() may return an empty String if iOS 'is not ready'. This can
occur for example if the device has restarted but has not yet been unlocked.
Workaround
----------
InAppPurchase has been updated to handle this and propagate the error
accordingly. The relevant methods have been updated to return a Result object
that can be queried for additional information on failure.
Rationale
---------
Apple have introduced restrictions on device identification rendering our
previous methods unsuitable.
Change
------
AudioProcessor::getAAXPluginIDForMainBusConfig() has been deprecated.
Possible Issues
---------------
Any AudioProcessor overriding this method will fail to compile.
Workaround
----------
- Create an object which inherits from AAXClientExtensions.
- In the object override and implement getPluginIDForMainBusConfig().
- In the AudioProcessor override getAAXClientExtensions() and return a pointer
to the object.
Rationale
---------
Additional AAX specific functionality was required in the audio processor.
Rather than continuing to grow and expand the AudioProcessor class with format
specific functionality, separating this concern into a new class allows for
greater expansion for those that need it without burdening those that don't.
Moving this function into this class improves consistency both with the new
functionality and with similar functionality for the VST2 and VST3 formats.
Change
------
Unique device IDs on Windows have been updated to use a more reliable SMBIOS
parser. The SystemStats::getUniqueDeviceID function now returns new IDs using
this improved parser. Additionally, a new function,
SystemStats::getMachineIdentifiers, has been introduced to aggregate all ID
sources. It is recommended to use this new function to verify any IDs.
Possible Issues
----------------
The SystemStats::getUniqueDeviceID function will return a different ID for the
same machine due to the updated parser.
Workaround
----------
For code that previously relied on SystemStats::getUniqueDeviceID, it is advised
to switch to using SystemStats::getMachineIdentifiers() instead.
Rationale
---------
This update ensures the generation of more stable and reliable unique device
IDs, while also maintaining backward compatibility with the previous ID
generation methods.
Change
------
The Grid layout algorithm has been slightly altered to provide more consistent
behaviour. The new approach guarantees that dimensions specified using the
absolute Px quantity will always be correctly rounded when applied to the
integer dimensions of Components.
Possible Issues
---------------
Components laid out using Grid can observe a size or position change of +/- 1px
along each dimension compared with the result of the previous algorithm.
Workaround
----------
If the Grid based graphical layout is sensitive to changes of +/- 1px, then the
UI layout code may have to be adjusted to the new algorithm.
Rationale
---------
The old Grid layout algorithm could exhibit surprising and difficult to control
single pixel artifacts, where an item with a specified absolute size of
e.g. 100px could end up with a layout size of 101px. The new approach
guarantees that such items will have a layout size exactly as specified, and
this new behaviour is also in line with CSS behaviour in browsers. The new
approach makes necessary corrections easier as adding 1px to the size of an
item with absolute dimensions is guaranteed to translate into an observable 1px
increase in the layout size.
Change
------
The k91_4 and k90_4 VST3 layouts are now mapped to the canonical JUCE 9.1.4 and
9.0.4 AudioChannelSets. This has a different ChannelType layout than the
AudioChannelSet previously used with such VST3 SpeakerArrangements.
Possible Issues
---------------
VST3 plugins that were prepared to work with the k91_4 and k90_4
SpeakerArrangements may now have incorrect channel mapping. The channels
previously accessible through ChannelType::left and right are now accessible
through ChannelType::wideLeft and wideRight, and channels previously accessible
through ChannelType::leftCentre and rightCentre are now accessible through
ChannelType::left and right.
Workaround
----------
Code that accesses the channels that correspond to the VST3 Speakers kSpeakerL,
kSpeakerR, kSpeakerLc and kSpeakerRc needs to be updated. These channels are now
accessible respectively through ChannelTypes wideLeft, wideRight, left and
right. Previously they were accessible respectively through left, right,
leftCentre and rightCentre.
Rationale
---------
This change allows developers to handle the 9.1.4 and 9.0.4 surround layouts
with one codepath across all plugin formats. Previously the
AudioChannelSet::create9point1point4() and create9point0point4() layouts would
only be used in CoreAudio and AAX, but a different AudioChannelSet would be used
in VST3 even though they were functionally equivalent.
Change
------
The signatures of the ContentSharer member functions have been updated. The
ContentSharer class itself is no longer a singleton.
Possible Issues
---------------
Projects that use the old signatures will not build until they are updated.
Workaround
----------
Instead of calling content sharer functions through a singleton instance, e.g.
ContentSharer::getInstance()->shareText (...);
call the static member functions directly:
ScopedMessageBox messageBox = ContentSharer::shareTextScoped (...);
The new functions return a ScopedMessageBox instance. On iOS, the content
sharer will only remain open for as long as the ScopedMessageBox remains alive.
On Android, this functionality will be added as/when the native APIs allow.
Rationale
---------
The new signatures are safer and easier to use. The ScopedMessageBox also
allows content sharers to be dismissed programmatically, which wasn't
previously possible.
Change
------
The minimum supported AAX library version has been bumped to 2.4.0 and the
library is now built automatically while building an AAX plugin. The
JucePlugin_AAXLibs_path preprocessor definition is no longer defined in AAX
plugin builds.
Possible Issues
---------------
Projects that use the JucePlugin_AAXLibs_path definition may no longer build
correctly. Projects that reference an AAX library version earlier than 2.4.0
will fail to build.
Workaround
----------
You must download an AAX library distribution with a version of at least 2.4.0.
Use the definition JucePlugin_Build_AAX to check whether the AAX format is
enabled at build time.
Rationale
---------
The JUCE framework now requires features only present in version 2.4.0 of the
AAX library. The build change removes steps from the build process, and ensures
that the same compiler flags are used across the entire project.
Change
------
The implementation of ColourGradient::createLookupTable has been updated to use
non-premultiplied colours.
Possible Issues
---------------
Programs that draw transparent gradients using the OpenGL or software
renderers, or that use lookup tables generated from transparent gradients for
other purposes, may now produce different results.
Workaround
----------
For gradients to render the same as they did previously, transparent colour
stops should be un-premultiplied. For colours with an alpha component of 0, it
may be necessary to specify appropriate RGB components.
Rationale
---------
Previously, transparent gradients rendered using CoreGraphics looked different
to the same gradients drawn using OpenGL or the software renderer. This change
updates the OpenGL and software renderers, so that they produce the same
results as CoreGraphics.
Change
------
Projucer-generated MSVC projects now build VST3s as bundles, rather than as
single DLL files.
Possible Issues
---------------
Build workflows that expect the VST3 to be a single DLL may break.
Workaround
----------
Any post-build scripts that expect to copy or move the built VST3 should be
updated so that the entire bundle directory is copied/moved. The DLL itself
can still be located and extracted from within the generated bundle if
necessary.
Rationale
---------
Distributing VST3s as single files was deprecated in VST3 v3.6.10. JUCE's CMake
scripts already produce VST3s as bundles, so this change increases consistency
between the two build systems.
Version 7.0.3
=============
Change
------
The default macOS and iOS deployment targets set by the Projucer have been
increased to macOS 10.13 and iOS 11 respectively.
Possible Issues
---------------
Projects using the Projucer's default minimum deployment target will have their
minimum deployment target increased.
Workaround
----------
If you need a lower minimum deployment target then you must set this in the
Projucer's Xcode build configuration settings.
Rationale
---------
Xcode 14 no longer supports deployment targets lower than macOS 10.13 and iOS
11.
Change
------
The ARA SDK expected by JUCE has been updated to version 2.2.0.
Possible Issues
---------------
Builds using earlier versions of the ARA SDK will fail to compile.
Workaround
----------
The ARA SDK configured in JUCE must be updated to version 2.2.0.
Rationale
---------
Version 2.2.0 is the latest official release of the ARA SDK.
Change
------
The Thread::startThread (int) and Thread::setPriority (int) methods have been
removed. A new Thread priority API has been introduced.
Possible Issues
---------------
Code will fail to compile.
Workaround
----------
Rather than using an integer thread priority you must instead use a value from
the Thread::Priority enum. Thread::setPriority and Thread::getPriority should
only be called from the target thread. To start a Thread with a realtime
performance profile you must call startRealtimeThread.
Rationale
---------
Operating systems are moving away from a specific thread priority and towards
more granular control over which types of cores can be used and things like
power throttling options. In particular, it is no longer possible to map a 0-10
integer to a meaningful performance range on macOS ARM using the pthread
interface. Using a more modern interface grants us access to more runtime
options, but also changes how we can work with threads. The two most
significant changes are that we cannot mix operations using the new and old
interfaces, and that changing a priority using the new interface can only be
done on the currently running thread.
Change
------
The constructor of WebBrowserComponent now requires passing in an instance of
a new Options class instead of a single option boolean. The
WindowsWebView2WebBrowserComponent class was removed.
Possible Issues
---------------
Code using the WebBrowserComponent's boolean parameter to indicate if a
webpage should be unloaded when the component is hidden, will now fail to
compile. Additionally, any code using the WindowsWebView2WebBrowserComponent
class will fail to compile. Code relying on the default value of the
WebBrowserComponent's constructor are not affected.
Workaround
----------
Instead of passing in a single boolean to the WebBrowserComponent's
constructor you should now set this option via tha
WebBrowserComponent::Options::withKeepPageLoadedWhenBrowserIsHidden method.
If you were previously using WindowsWebView2WebBrowserComponent to indicate to
JUCE that you prefer JUCE to use Windows' Webview2 browser backend, you now do
this by setting the WebBrowserComponent::Options::withBackend method. The
WebView2Preferences can now be modified with the methods in
WebBrowserComponent::Options::WinWebView2.
Rationale
---------
The old API made adding further options to the WebBrowserComponent cumbersome
especially as the WindowsWebView2WebBrowserComponent already had a parameter
very similar to the above Options class, whereas the base class did not use
such a parameter. Furthermore, using an option to specify the preferred
browser backend is more intuitive then requiring the user to derive from a
special class, especially if additional browser backends are added in the
future.
Change
------
The function AudioIODeviceCallback::audioDeviceIOCallback() was removed.
Possible Issues
---------------
Code overriding audioDeviceIOCallback() will fail to compile.
Workaround
----------
Affected classes should override the audioDeviceIOCallbackWithContext() function
instead.
Rationale
---------
The audioDeviceIOCallbackWithContext() function fulfills the same role as
audioDeviceIOCallback(), it just has an extra parameter. Hence the
audioDeviceIOCallback() function was superfluous.
Change
------
The type representing multi-channel audio data has been changed from T** to
T* const*. Affected classes are AudioIODeviceCallback, AudioBuffer and
AudioFormatReader.
Possible Issues
---------------
Code overriding the affected AudioIODeviceCallback and AudioFormatReader
functions will fail to compile. Code that interacts with the return value of
AudioBuffer::getArrayOfReadPointers() and AudioBuffer::getArrayOfWritePointers()
may fail to compile.
Workaround
----------
Functions overriding the affected AudioIODeviceCallback and AudioFormatReader
members will need to be changed to confirm to the new signature. Type
declarations related to getArrayOfReadPointers() and getArrayOfWritePointers()
of AudioBuffer may have to be adjusted.
Rationale
---------
While the previous signature permitted it, changing the channel pointers by the
previously used types was already being considered illegal. The earlier type
however prevented passing T** values to parameters with type const T**. In some
places this necessitated the usage of const_cast. The new signature can bind to
T** values and the awkward casting can be avoided.
Change
------
The minimum supported C++ standard is now C++17 and the oldest supported
compilers on Linux are now GCC 7.0 and Clang 6.0.
Possible Issues
---------------
Older compilers will no longer be able to compile JUCE.
Workaround
----------
No workaround is available.
Rationale
---------
This compiler upgrade will allow the use of C++17 within the framework.
Change
------
Resource forks are no longer generated for Audio Unit plug-ins.
Possible Issues
---------------
New builds of JUCE Audio Units may no longer load in old hosts that use the
Component Manager to discover plug-ins.
Workaround
----------
No workaround is available.
Rationale
---------
The Component Manager is deprecated in macOS 10.8 and later, so the majority of
hosts have now implemented support for the new plist-based discovery mechanism.
The new AudioUnitSDK (https://github.com/apple/AudioUnitSDK) provided by Apple
to replace the old Core Audio Utility Classes no longer includes the files
required to generate resource forks.
Change
------
Previously, the AudioProcessorGraph would call processBlockBypassed on any
processor for which setBypassed had previously been called. Now, the
AudioProcessorGraph will now only call processBlockBypassed if those processors
do not have dedicated bypass parameters.
Possible Issues
---------------
Processors with non-functional bypass parameters may not bypass in the same way
as before.
Workaround
----------
For each AudioProcessor owned by a Graph, ensure that either: the processor has
a working bypass parameter that correctly affects the output of processBlock();
or, the processor has no bypass parameter, in which case processBlockBypassed()
will be called as before.
Rationale
---------
The documentation for AudioProcessor::getBypassParameter() states that if this
function returns non-null, then processBlockBypassed() should never be called,
but the AudioProcessorGraph was breaking this rule. Calling
processBlockBypassed() on AudioProcessors with bypass parameters is likely to
result in incorrect or unexpected output if this function is not overridden.
The new behaviour obeys the contract set out in the AudioProcessor
documentation.
Version 7.0.2
=============
Change
------
The Matrix3D (Vector3D<Type> vector) constructor has been replaced with an
explicit static Matrix3D fromTranslation (Vector3D<Type> vector) function, and a
bug in the behaviour of the multipication operator that reversed the order of
operations has been addressed.
Possible Issues
---------------
Code using the old constructor will not compile. Code that relied upon the order
of multiplication operations will return different results.
Workaround
----------
Code that was using the old constructor must use the new static function. Code
that relied on the order of multiplication operations will need to have the
order of the arguments reversed. With the old code A * B was returning BA rather
than AB.
Rationale
---------
Previously a matrix multipled by a vector would return a matrix, rather than a
vector, as the multiplied-by vector would be automatically converted into a
matrix during the operation. Removing the converting constructor makes
everything much more explicit and there is no confusion about dimensionality.
The current multiplication routine also included a bug where A * B resulted in
BA rather than AB, which needed to be addressed.
Version 7.0.0
=============
Change
------
AudioProcessor::getHostTimeNs() and AudioProcessor::setHostTimeNanos() have
been removed.
Possible Issues
---------------
Code that used these functions will no longer compile.
Workaround
----------
Set and get the system time corresponding to the current audio callback using
the new functions AudioPlayHead::PositionInfo::getHostTimeNs() and
AudioPlayHead::PositionInfo::setHostTimeNs().
Rationale
---------
This change consolidates callback-related timing information into the
PositionInfo type, improving the consistency of the AudioProcessor and
AudioPlayHead APIs.
Change
------
AudioPlayHead::getCurrentPosition() has been deprecated and replaced with
AudioPlayHead::getPosition().
Possible Issues
---------------
Hosts that implemented custom playhead types may no longer compile. Plugins
that used host-provided timing information may trigger deprecation warnings
when building.
Workaround
----------
Classes that derive from AudioPlayHead must now override getPosition() instead
of getCurrentPosition(). Code that used to use the playhead's
CurrentPositionInfo must switch to using the new PositionInfo type.
Rationale
---------
Not all hosts and plugin formats are capable of providing the full complement
of timing information contained in the old CurrentPositionInfo class.
Previously, in the case that some information could not be provided, fallback
values would be used instead, but it was not possible for clients to distinguish
between "real" values set explicitly by the host, and "fallback" values set by
a plugin wrapper. The new PositionInfo type keeps track of which members have
been explicitly set, so clients can implement their own fallback behaviour.
The new PositionInfo type also includes a new "barCount" member, which is
currently only used by the LV2 host and client.
Change
------
The optional JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS preprocessor
flag will now use a new Metal layer renderer when running on macOS 10.14 or
later. The minimum requirements for building macOS and iOS software are now
macOS 10.13.6 and Xcode 10.1.
Possible Issues
---------------
Previously enabling JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS had no
negative effect on performance. Now it may slow rendering down.
Workaround
----------
Disable JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS.
Rationale
---------
JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS has been ineffective when
running on macOS 10.13 or later. Enabling this flag, and hence using the new
Metal layer renderer when running on macOS 10.14, restores the previous
behaviour and fixes problems where Core Graphics will render much larger
regions than necessary. However, the new renderer will may be slower than the
recently introduced default of asynchronous Core Graphics rendering, depending
on the regions that Core Graphcis is redrawing. Whether
JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS improves or degrades
performance is specific to an application.
Change
------
The optional JUCE_COREGRAPHICS_DRAW_ASYNC preprocessor flag has been removed
and asynchronous Core Graphics rendering is now the default. The helper
function setComponentAsyncLayerBackedViewDisabled has also been removed.
Possible Issues
---------------
Components that were previously using setComponentAsyncLayerBackedViewDisabled
to conditionally opt out of asynchronous Core Graphics rendering will no longer
be able to do so.
Workaround
----------
To opt out of asynchronous Core Graphics rendering the
windowRequiresSynchronousCoreGraphicsRendering ComponentPeer style flag can be
used when adding a component to the desktop.
Rationale
---------
Asynchronous Core Graphics rendering provides a substantial performance
benefit. Asynchronous rendering is a property of a Peer, rather than a
Component, so a Peer style flag to conditionally opt out of asynchronous
rendering is more appropriate.
Change
------
Constructors of AudioParameterBool, AudioParameterChoice, AudioParameterFloat,
AudioParameterInt, and AudioProcessorParameterWithID have been deprecated and
replaced with new constructors taking an 'Attributes' argument.
Possible Issues
---------------
The compiler may issue a deprecation warning upon encountering usages of the
old constructors.
Workaround
----------
Update code to pass an 'Attributes' instance instead. Example usages of the new
constructors are given in the constructor documentation, and in the plugin
example projects.
Rationale
---------
Parameter types have many different properties. Setting a non-default property
using the old constructors required explicitly setting other normally-defaulted
properties, which was redundant. The new Attributes types allow non-default
properties to be set in isolation.
Version 6.1.6
=============
Change
------
Unhandled mouse wheel and magnify events will now be passed to the closest
enclosing enabled ancestor component.
Possible Issues
---------------
Components that previously blocked mouse wheel events when in a disabled state
may no longer block the events as expected.
Workaround
----------
If a component should explicitly prevent events from propagating when disabled,
it should override mouseWheelMove() and mouseMagnify() to do nothing when the
component is disabled.
Rationale
---------
Previously, unhandled wheel events would be passed to the parent component,
but only if the parent was enabled. This meant that scrolling on a component
nested inside a disabled component would have no effect by default. This
behaviour was not intuitive.
Change
------
The invalidPressure, invalidOrientation, invalidRotation, invalidTiltX and
invalidTiltY members of MouseInputSource have been deprecated.
Possible Issues
---------------
Deprecation warnings will be seen when compiling code which uses these members
and eventually builds will fail when they are later removed from the API.
Workaround
----------
Use the equivalent defaultPressure, defaultOrientation, defaultRotation,
defaultTiltX and defaultTiltY members of MouseInputSource.
Rationale
---------
The deprecated members represent valid values and the isPressureValid() etc.
functions return true when using them. This could be a source of confusion and
may be inviting programming errors. The new names are in line with the ongoing
practice of using these values to provide a neutral default in the absence of
actual OS provided values.
Change
------
Plugin wrappers will no longer call processBlockBypassed() if the wrapped
AudioProcessor returns a parameter from getBypassParameter().
Possible Issues
---------------
Plugins that used to depend on processBlockBypassed() being called may no
longer correctly enter a bypassed state.
Workaround
----------
AudioProcessors that implement getBypassParameter() must check the current
value of the bypass parameter on each call to processBlock(), and bypass
processing as appropriate. When switching between bypassed and non-bypassed
states, the plugin must use some sort of ramping or smoothing to avoid
discontinuities in the output. If the plugin introduces latency when not
bypassed, the plugin must delay its output when in bypassed mode so that the
overall latency does not change when enabling/disabling bypass.
Rationale
---------
The documentation for AudioProcessor::getBypassParameter() says
> if this method returns a non-null value, you should never call
processBlockBypassed but use the returned parameter to control the bypass
state instead.
Some plugin wrappers were not following this rule. After this change, the
behaviour of all plugin wrappers is consistent with the documented behaviour.
Change
------
The ComponentPeer::getFrameSize() function has been deprecated on Linux.
Possible Issues
---------------
Deprecation warnings will be seen when compiling code which uses this function
and eventually builds will fail when it is later removed from the API.
Workaround
----------
Use the ComponentPeer::getFrameSizeIfPresent() function. The new function returns
an OptionalBorderSize object. Use operator bool() to determine if the border size
is valid, then access the value using operator*() only if it is.
Rationale
---------
The XWindow system cannot return a valid border size immediately after window
creation. ComponentPeer::getFrameSize() returns a default constructed
BorderSize<int> instance in such cases that corresponds to a frame size of
zero. That however can be a valid value, and needs to be treated differently
from the situation when the frame size is not yet available.
Change
------
The return type of XWindowSystem::getBorderSize() was changed to
ComponentPeer::OptionalBorderSize.
Possible Issues
---------------
User code that uses XWindowSystem::getBorderSize() will fail to build.
Workaround
----------
Use operator bool() to determine the validity of the new return value and
access the contained value using operator*().
Rationale
---------
The XWindow system cannot immediately report the correct border size after
window creation. The underlying X11 calls will signal whether querying the
border size was successful, but there was no way to forward this information
through XWindowSystem::getBorderSize() until this change.
Version 6.1.5
=============
Change
------
XWindowSystemUtilities::XSettings now has a private constructor.
Possible Issues
---------------
User code that uses XSettings::XSettings() will fail to build.
Workaround
----------
Use the XSettings::createXSettings() factory function.
Rationale
---------
The XSETTINGS facility is not available on all Linux distributions and the old
constructor would fail on such systems, potentially crashing the application.
The factory function will return nullptr in such situations instead.
Version 6.1.3
=============
Change
------
The format specific structs of ExtensionsVisitor now return pointers to forward
declared types instead of `void*`. For this purpose the `struct AEffect;`
forward declaration was placed inside the global namespace.
Possible Issues
---------------
User code that includes the VST headers inside a namespace may fail to build,
because the forward declared type can collide with the contents of `aeffect.h`.
Workaround
----------
The collision can be avoided by placing a `struct AEffect;` forward declaration
in the same namespace where the VST headers are included. The forward
declaration must come before the inclusion.
Rationale
---------
Using the forward declared types eliminates the need for error prone casting
at the site where the ExtensionsVisitor facility is used.
Change
------
ListBox::createSnapshotOfRows now returns ScaledImage instead of Image.
Possible Issues
---------------
User code that overrides this function will fail to build.
Workaround
----------
To emulate the old behaviour, simply wrap the Image that was previous returned
into a ScaledImage and return that instead.
Rationale
---------
Returning a ScaledImage allows the overriding function to specify the scale
at which the image should be drawn. Returning an oversampled image will provide
smoother-looking results on high resolution displays.
Change
------
AudioFrameRate::frameRate is now a class type instead of an enum.
Possible Issues
---------------
Code that read the old enum value will not compile.
Workaround
----------
Call frameRate.getType() to fetch the old enum type. Alternatively, use the new
getBaseRate(), isDrop(), isPullDown(), and getEffectiveRate() functions. The
new functions provide a more accurate description of the host's frame rate.
Rationale
---------
The old enum-based interface was not flexible enough to describe all the frame
rates that might be reported by a plugin host.
Change
------
FlexItem::alignSelf now defaults to "autoAlign" rather than "stretch".
Possible Issues
---------------
FlexBox layouts will be different in cases where FlexBox::alignItems is set to
a value other than "stretch". This is because each FlexItem will now default
to using the FlexBox's alignItems value. Layouts that explicitly set
FlexItem::alignSelf on each item will not be affected.
Workaround
----------
To restore the previous layout behaviour, set FlexItem::alignSelf to "stretch"
on all FlexItems that would otherwise use the default value for alignSelf.
Rationale
---------
The new behaviour more closely matches the behaviour of CSS FlexBox
implementations. In CSS, "align-self" has an initial value of "auto", which
computes to the parent's "align-items" value.
Change
------
Functions on AudioPluginInstance that can add parameters have been made
private.
Possible Issues
---------------
Code implementing custom plugin formats may stop building if it calls these
functions.
Workaround
----------
When implementing custom plugin formats, ensure that the plugin parameters
derive from AudioPluginInstance::HostedParameter and then use
addHostedParameter, addHostedParameterGroup or setHostedParameterTree to add
the parameters to the plugin instance.
Rationale
---------
In a plugin host, it is very important to be able to uniquely identify
parameters across different versions of the same plugin. To make this possible,
we needed to introduce a way of retrieving a unique ID for each parameter,
which is now possible using the HostedParameter class. However, we also needed
to enforce that all AudioPluginInstances can only have parameters which are of
the type HostedParameter, which required hiding the old functions.
Version 6.1.0
=============
Change
------
juce::gl::loadFunctions() no longer loads extension functions.
Possible Issues
---------------
Code that depended on extension functions being loaded automatically may cease
to function correctly.