When removing the monitor section, or any route that has sends
to it, Session::remove_routes will remove those sends. Despite
Route::remove_processor taking the process lock and removing
the send safely. The send itself will only be destroyed later.
Furthermore the send first calls ~BufferSet() on its
BufferSet mixbufs, before it itself is destroyed.
It was possible to still respond to CycleStart signal which
accessed the mixbufs from the RT thread, causing a heap-use-after-free.
Previously bundles were added one at a time, each taking a
RCUWriter. This lead to issues when another thread concurrently
reads the list.
This fixes an issue with LiveTrax, auto-connecting the monitor bus.
For ardev to work on windows (msys) the enviroment variable for the
DLL path needs to be used.
Without this, ardour fails to find the VST(3) scanner programs.
If the currently playing trigger has follow action set to Again, when it stops the previous code state
would cause use to simply retrigger it, causing a lot of things to break. Now, in ::begin_switch() we
set _explicitly_stopped to true, so that ::when_stopped_in_run() can do the right thing and simply
shutdown the trigger completely
Properties::region_fx may not be emitted for add/remove/reorder
cases when no disk-reader overrride is required.
However we need to inform the GUI when such changes happen,
and various UI widgets listen to property changes.
This allows the user to not have to aim for such precise timing, since they can
hold the note down during the count-in.
At some point the question will arise why we don't do this for controllers
etc. too.
This is a bit ironic, since EventSink is an abstract base class for MidiBuffer, which is
already supported for a flush_notes() call. But we use MidiBuffer::push_back() for that,
mostly for efficiency purposes (write() can insert an event at any time).
Allow for 192kHz session (needs testing, by ear and
by down-sampling to 48k vs. running directly at 48k, etc)
Also prevent plugin from loading when sample-rate is out of bounds.
Previously the plugin loaded but was pitched up when the sample
rate exceeded 96k.
This properly handles missing write permissions (that previously
crashed when trying to close the archive).
Also report and error on disk-full or other write failures
such as 4GB file limit.
If walking the grid by bar, but points are closer than that, we could end up
with the wrong TempoMetric being used to compute various time domain
conversions (which tends to leads to abort()).
This small change makes sure that we keep looking for more points if we have
not yet reached the next grid point (e.g. bar).