Inform plugins about host theme (fg, bg colors) and UI scale-factor.
The latter follows an implementation already present in Carla and DPF.
These extension use proposed official URLs.
This removes a border painted in the host's UI theme color around
any plugin UI.
This results in a much nicer look/feel for plugin-UIs that have their
own theme
Parent class d'tor runs after derived class d'tor. By the time
~TimeAxisView() is called, the actual object has already been
deleted and dyanamic_cast<RouteTimeAxisView*> or
dynamic_cast<AutomationTimeAxisView*> will fail.
CatchDeletion() needs to be emitted from the actual d'tor of the object.
There are currently three non-virtual TAVs:
* RouteTimeAxisView
* AutomationTimeAxisView
* VCATimeAxisView
The first two already directly emit CatchDeletion(), there's no need to
call it again from ~TimeAxisView().
When a plugin is deleted, automation-lanes of the given plugin
are removed, but previously a pointed to the deleted lane remained
in the selection.
This caused crashes later when the track selection is used. e.g.
during sensitize_the_right_region_actions()
Note that ~TimeAxisView() also emits CatchDeletion (this);
however "this" fails to be dynamic_cast<AutomationTimeAxisView*>
because that d'tor has already been completed.
Plugin analysis uses a GUI thread instance of a given plugin to
perform a IR analysis.
Some plugins can be rather CPU expensive to analyze.
e.g. a-hi/lo-filter when interpolating is recalculating biquad
coefficients every 64samples during the 8k IR analysis. This can take
a significant amount of time on older CPUs.
Furthermore live-signal collection happens in the rt-thread,
using cross-thread signals. Signal collection is periodically initiated
from the same timeout signal as analysis.
Analysis is was done using default thread priority, which is higher
than the GUI redraw priority (PRIORITY_HIGH_IDLE).
So it was possible to contiguously initiate analysis, loading the CPU
and preventing redraws.
Without a session, there are no regions. Besides,
there is an unconditional call using _session directly
after the if (_session) clause, which would segfault...
This fixes a potentially undefined branch if the USB device list is empty.
dev is NULL, the loop is never entered, 'r' isn't set.
if (!dev && !r) is undefined.