Return from poll_for_request() when CrossThreadChannel is
closed/destroyed. -- see also f4166fb61d
This also cleans up poll API usage, and check for nonnegative
return value is added.
This is mainly relevant for Mixbus, which allows cyclic-connections
to record Master-out on a Track (which unconditionally has Mixbus send
and feeds master).
In Ardour it may also cause issues when creating loopback connections,
however latency is not usually updated with invalid graphs (old
process graph remains in use).
Otherwise it fixes a crash connecting Track 1 -> Track 2 -> Track 1.
This also optimizes Route::output_effectively_connected by caching
any prior lookup. This helps e.g. Track 1 -> Track 2 -> Master.
The connection "Track 2 -> Master" now only need to be looked up once.
See also 7958031287 and a556e96ed0
The virtual keyboard sends all events with the same timestamp.
When playing fast (mouse-sweep) note-on and note-off will have
the same timestamp.
Since dbd8089fb8, a393f75694 concurrent MIDI are sorted with note-off
first. This correctly handles events when played from the timeline:
note-on .. note-off|note-on ... note-off
But in case of a MIDI keyboard a note-off event must be send after
the note-on.
Changes handle_cursor_right_press() in PluginSubviewState to pure virtual
function so that PluginSelect and PluginEdit can each have their own
version.
The cursor_left and cursor_right mackie control buttons will now move the
sends subview left and right like it does in the plugin subview. Previously,
if you had more than 8 sends (which is almost always the case for Mixbus),
then sends 9+ were unreachable on an 8 channel controller.
The ::start_drag() implementation now defers add/extend selection logic to
MidiRegionView::note_selected(), and drops the original limitation that we did
not do extend-selection on button press, only button release.
When adding ffmpeg 5.0 compatibility, the dialog was
dramatically simplified. This re-introduces some options
for audio-quality and also saves/restores settings.
This is in preparation for a pure-virtual base class for
PluginInsert to expose `DropReferences` in the virtual base.
```
class PlugInsertBase : virtual public PBD::Destructible
class PluginInsert : public Processor, public PlugInsertBase
class Processor : public SessionObject
class SessionObject : public PBD::StatefulDestructible
```
This fixes a crash on windows, close(-1) or closing an
already closed FD will abort the application
(Save-As can trigger the issue in done_with_peakfile_writes).
Note that g_open() returns -1 if an error occurred. However
other negative number may still be a valid FD.
Found via `codespell -q 3 -S *.po,./.git,./share/patchfiles,./libs,./msvc_extra_headers,./share/web_surfaces,*.patch -L ba,buss,busses,discreet,doubleclick,hsi,ontop,ro,scrollin,seh,siz,sord,sur,te,trough,ue`
Previously, when running timefx on multiple regions on
the same track, undo commands accumulated for each region
in the playlist. Resulting in duplicate actions on undo/redo.
```
<UndoTransaction tv-sec="1649607270" tv-usec="646684" name="pitch shift">
<StatefulDiffCommand obj-id="1690" type-name="ARDOUR::AudioPlaylist">
<Changes>
<Regions>
<Add id="4046"/>
<Remove id="2284"/>
</Regions>
</Changes>
</StatefulDiffCommand>
<StatefulDiffCommand obj-id="1690" type-name="ARDOUR::AudioPlaylist">
<Changes>
<Regions>
<Add id="4046"/>
<Add id="4057"/>
<Remove id="2284"/>
<Remove id="2388"/>
</Regions>
</Changes>
</StatefulDiffCommand>
...
```