* yabridge runs the plugin's process function in a dedicated
bridged thread. Ardour's process thread is not (it just waits)
* When a plugin calls `restartComponent` from the realtime
thread. yabridge uses a host notification thread to perform
the callback.
Unlike other VST3 implementations that use a notification thread
(eg. JUCE), yabridge blocks and waits for the notification to
complete before the realtime thread can continue.
This leads to a deadlock.
However, we know that yabridge always synchronizes the
callback and concurrent calls are prevented by yabridge's design.
https://github.com/robbert-vdh/yabridge/issues/266
Locations::ripple can never add/remove markers, hence
Locations::changed is not applicable.
That signal is to indicate when more than one location is
added or removed from the location list.
Undo sets the state of ALL Locations, which resulted in
at least two signals for each Location (name changed,
start+end changed), even if there was no change.
Now that Location signal(s) are only emitted when the
drag ended, the list can be kept in sync.
This also adds a further optimization to only update the
list once, even when multiple locations have been changed.
This is in preparation to reduce signals during
Location Drag motion (which operates on a copied
Location, that causes [static] signal emissions,
but the location itself is not in any list).
Section Markers only need to be updated when an actual
section-marker is modified OR flags change.
This also removes duplicate signal subscriptions and
caches sorted Location list when iterating over section markers.
Every call to ::next_section() copies the location list
and sorts all the regions.
If the session has a significant amount of Locations and
Section Marker (#9568 has 300+) sorting them each time
when iterating over sections is significant.
Exporting a dedicated Range should not be constrained by
session markers. This fixes at least 2 issues:
* export could be cut short when using latent plugins
* exporting a range crossing the session end marker was cut short
When a user first connected a port to the Timecode master
input and then disconnected a previous port, the Timecode
master assumed it was not connected.
Previously the port-engine was a LIFO. Changes were pushed back
and then popped-back. This causes issues when re-connecting
Transport Masters.
The GUI does the following when changing connections:
1. disconnect all
2. connect to new port
which lead to TransportMaster::connection_handler being called
in reverse order: connect, disconnect, and the transport
master was assumed to not be connected.
--
Now connections queue is a FIFO and code was consolidated.
(Note, we cannot use a std::deque because it does not support
memory pre-allocation with ::reserve)
This allows Ardour to re-open previously shown plugins,
and toggle externalUI.
This worked in the distant past, before Ardour 3.3 introduced
the Ardour Window Manager.
when the surround bus is removed, it (probably erroneously) causes
changes to the I/O routing for the auditioner, which will be
delivered to anyone who cares via an RCConfiguration ParameterChanged
signal. This will be emitted from a non-GUI thread, and so will not
be handled synchronously. The GUI thread will first handle the notification
that the surround bus was deleted, and that will include deleting the
MixerStrip for the surround bus. But another call_slot() request will
be pending to notify the now-deleted MixerStrip about the auditioner change.
Adding invalidator() calls ensures that the deletion of the MixerStrip removes
all of these pending call_slot() requests.