The big thing is the common efffects UI. Right now Ladspa and VST
have been converted to use it and Audiounits will be next. It makes
everything nice and consistent while reducing the clutter in the
dialog.
Other goodies are:
Ladspa effects now show output controls when supplied by the effect
Ladspa effects now work fine as Analyze type effects
Ladspa now has user presets
VST effects dialog is now less cluttered...leaving more room for the effect
Ladspa and VST effects now share a common UI
Ladspa and VST effects are now usable in chains
Ladspa and VST effects now handle user presets the same way
Currently active effects settings automatically saved and reloaded
Can now do numeric range checking on input fields.
And, as always, plenty of critter squashing.
This change from the old int type to the real enum wxRasterOperationMode was missed during the fix of similar problems in r13403 (when similar fixes were applied), probably because ImageRoll and the affected variable are currently unused and the problem therefore doesn't cause a compilation error and is only fixed preventively.
Compatibility with wxWidgets 2.8 is assured thanks to a conditional definition of wxRasterOperationMode as int in ImageRoll.h, introduced in r13403.
Due to changes in sizing of dialogs with wx3, an assert about the size of the preferences dialog (was max 800x600) fails, which causes an error dialog to pop up. We've recently decided that screens have got bigger, and increased the default size of the Audacity window. Rather than remove this assert, we've upped its limits so that we can go further before we hit the limit. Other code to try to keep the dialog size near to 800x600 has not been changed.
The casting macros wxStaticCast and wxDynamicCast from wxWidgets only work within the hierarchy registered to the wxWidgets class runtime information. But neither the base class wxLog nor the derived class AudacityLogger involved in the cast qualify for this.
This error wasn't visible with wxWidgets 2.8 because asserts weren't activated there by default, which prevented the code that causes the invalid memory access from being executed.
Note: After original creation of this fix, the line causing the crash has been changed in r13426 from using wxStaticCast to wxDynamicCast, which avoids the crash for now thanks to a lucky coincidence. It's still not the desired behaviour (before this fix the runtime type check only checked for wxEvtHandler instead of AudacityLogger) and could start to crash again, depending on implementation details of wxDynamicCast. Hence this fix was still needed, and it was adjusted accordingly.
wxWidgets 3.0 has added a lot of asserts to detect incorrect usage
of its APIs. Now capturing the cursor, when it's already captured,
throws an assertion failure. As the assertion failure window
appears at a very inconvenient moment (when the cursor is captured),
this can lead to Audacity crashing or can even render the whole
Desktop Manager unusable until you find a way to kill
Audacity without using your Desktop Manager (e.g. ssh login)!
The recapturing can occur in the track panel sliders because
the sliders capture the cursor themselves (because they are
also used in other places outside the track panel, where
this is actually necessary), but the track panel also manages
the cursor capturing because it needs it for other operations.
Fixed the recapturing problem by letting the sliders capture the cursor
only if necessary.
The main operational difference is that for v4 effect onward, the
sound name will now be *TRACK*. This will not affect existing
effects since they use version number 3 or less.
This also provides the Nyquist effect with much more information about
the current processing:
Variable Property What
*AUDACITY* VERSION current Audacity version number
*SYSTEM-DIR* BASE Audacity install path
*SYSTEM-DIR* DATA Audacity data path
*SYSTEM-DIR* HELP Audacity help path
*SYSTEM-DIR* TEMP Audacity temp file path
*SYSTEM-DIR* PLUGIN Audacity search path for Nyquist plugins
*PROJECT* RATE current project sample rate
*PROJECT* TRACKS total number of tracks in the project
*PROJECT* WAVETRACKS number of wave tracks in the project
*PROJECT* LABELTRACKS number of label tracks in the project
*PROJECT* MIDITRACKS number of midi tracks in the project
*PROJECT* TIMETRACKS number of time tracks in the project
*SELECTION* START start time of current selection
*SELECTION* END end time of current selection
*SELECTION* TRACKS number of tracks in the current selection
*SELECTION* CHANNELS number of channels in the current selection
*SELECTION* LOW-HZ low frequency from spectrogram (if available, else nil)
*SELECTION* CENTER-HZ center frequence (calculated) (if available, else nil)
*SELECTION* HIGH-HZ high frequence from spectrogram (if available, else nil)
*SELECTION* BANDWIDTH bandwidth in octaves (calculated) (if available, else nil)
*SELECTION* PEAK-LEVEL peak amplitude for the current selection
*TRACK* INDEX 1-based index of track being processed
*TRACK* NAME name of track
*TRACK* TYPE type of track: wave, midi, label, time
*TRACK* VIEW track view: Waveform, Waveform (dB), etc.
*TRACK* CHANNELS number of channels in the track
*TRACK* START-TIME start time of track
*TRACK* END-TIME end time of track
*TRACK* GAIN track gain
*TRACK* PAN track pan
*TRACK* RATE sample rate of track
*TRACK* FORMAT sample format: 16 (int), 24 (int), 32.0 (float)
*TRACK* CLIPS list of start/end times for clips for each channel
1. Change in project.cpp fixes misbehavior of spectral selection toolbar,
when you try to enter numbers in the low or high frequency boxes and one of
the frequencies was undefined.
2. Changes in NoiseReduction.cpp now take the spectral selection into
account in step 2, so that noise is reduced (or isolated) only in the
selected range of frequencies. No effect on statistics gathered in step 1.
3. Other noise reduction changes: avoid an assertion in case of certain
incompatible settings, and end all messages in message boxes consistently
with a period.
0017: Encapsulation of reference type returned by wxString::operator[]
0018: Interface change for classes deriving from wxGridTableBase
0017
----
The NumericTextCtrl relies on the fact that the value returned by
wxString::operator[] is a "wxChar&". However, in wxWidgets 3.0 it is a
wxUniCharRef (encapsulation of a reference to characters, to improve unicode
handling).
wxString::reference provides the correct type in both wx2.8 and wx3.0 and can be
used as writable reference in both cases. However, for the case of an update of
the reference itself (instead of the value), there is no common syntax. In this
case the character position within the string has to be used as reference.
0018
----
With wx3.0, different methods have to be implemented (EndEdit with new signature
and ApplyEdit) than with wx2.8 (only EndEdit with old signature). Now both
versions are implemented in parallel in the classes TimeEditor and ChoiceEditor
(one version essentially being a wrapper of the other one).
Note: Superseding the previous solution of the issue (committed in r13403) by one
that avoids code duplication. This should avoid problems with missed changes in
code that isn't used with the wxWidgets version that the developer tests with
(like just happened in r13557).
"The dialogs LadspaEffectDialog, LV2EffectDialog and VampEffectDialog receive EVT_TEXT events before the dialog classes are properly initialized. To prevent this, a workaround was already in place, but was only active on Windows. This happens now on more platforms (including GTK). So activate it on the wxGTK with wx3.0, too."
Correct string formatting for:
2/15 %d + enum => %d + int
3/15 %lld + int64_t => %lld + long long
4/15 %d + int64_t => %lld + long long
5/15 %d + double => %f + double
6/15 %d + int32_t => %d + int
7/15 %d + intptr_t => %p + void*
8/15 gint, guint
9/15 %d + long => %ld + long
10/15 %n + int => %d + int
11/15 %x + int => %x + unsigned int
12/15 %f + int => %d + int
13/15 %S + wxChar* => %s + wxChar*
14/15 %d + size_t => %d + int
15/15 %d + size_t => %lld + long long
"The functions wxString::Format, wxString::Printf (and others indirectly) have become stricter about parameter types that don't match (format specifier vs. function parameters). So the bugs (that were already present in audacity before) become visible in wx3.0 as error message dialogs. I've checked all occurrences of Printf, wxPrintf, PrintfV, Format, FormatV, wxLogDebug and wxLogError systematically and made the type match."
Note (9/15): In TrackPanel.cpp, ExportMP2.cpp and CompareAudioCommand.cpp this patch supersedes related change done in r13466 because the new solution requires fewer casts and therefore simplifies the code.
Note: Many .po files are affected, and we need to be very careful about this. Incorrect "%d" and similar in translation files may lead to crashes in those languages (only). This is something we should actually have been more careful about in the past. We need to write a script to check that the "%d" and similar format specifiers match between English and translation.
The functions wxString::Format, wxString::Printf (and others indirectly) have become stricter about parameter types that don't match (format specifier vs. function parameters). So the bugs (that were already present in audacity before) become visible in wx3.0 as error message dialogs. I've checked all occurrences of Printf, wxPrintf, PrintfV, Format, FormatV, wxLogDebug and wxLogError systematically and made the type match.
Note: In Shuttle.cpp this patch supersedes one related change done in r13466 because a wxLongLong_t can be bigger than an int and in a generic function like "TransferLongLong" this should be taken into account.