This should not be needed, however Editor::idle_remove_tracks()
has the same priority as Editor::redisplay_track_views() and this
might save us another redisplay call.
There is probably a good reason why _vca.reset() is called
immediately, and 6dc66ea78f is a better solution to the issue
This reverts commit 83719fba1a.
This addresses the issue described in 83719fba1a.
First process all queued self_delete() requests before scheduling
Editor::redisplay_track_views() which uses PRIORITY_DEFAULT.
Session::remove_routes() first calls IO::disconnect()
before eventually calling route->drop_references().
RouteTimeAxisView::io_changed() is called while the route still
exists and requests a redraw which in turn emits
_stripable->gui_changed ("track_height").
Since the RTAV is deleted later during an idle-callback, there
was another redraw performed just before the RTAV is actually deleted.
VCATimeAxisView::self_delete () resets _vca and queues delete_when_idle.
From now on STAV::strippable () will return 0.
Editor::idle_remove_tracks() returns, and before the VCATimeAxisView
is destroyed. Editor::redisplay_track_views() may be called.
The VCATimeAxisView still exists at this point and is in
Editor::track_views, but has no valid stripable.
This causes a crash in TrackViewStripableSorter which depends
on STAV::stripable();
THe length of a Source(File) is always measured from its start. In this sense,
the length is like a position on the timeline, which is a duration with an
implicit origin, or a Region start, also a duration with an implicit origin (in
that case the start of the Source). There is no good reason for using
a timecnt_t for this value, because the position component of a timecnt_t
(the origin for the duration) is implicit and always zero. So we make
this property into a timepos_t, and include a number of asserts() to check
for common possible coding errors related to the time domain
The length needs to use consistent time domains for duration and position,
and total_capture is a sample count. The "real" length of a whole
file region is the length of its source, so just defer to that.
Session::process_audition calls Graph::swap_process_chain()
to handle any pending graph changes (notably route removal
depends the graph to switch chains to drop references).
However this must not change the Graph::_trigger_queue
(which is refilled when processing resumes).
Previously routes were added to the trigger_queue, leading to
an inconsistent Graph state. When the terminal-count was reached
the trigger-queue was not empty. Process threads ran after processing
already completed and or concurrently with processing.
A common result of that was:
delayline.cc:70: virtual void ARDOUR::DelayLine::run(ARDOUR::BufferSet&, ARDOUR::samplepos_t, ARDOUR::samplepos_t, double, ARDOUR::pframes_t, bool): Assertion `lm.locked ()' failed.
This is required to be able to include
"audiographer/sndfile/sndfile_writer.h" in more than
one source file. which would otherwise lead to
duplicate symbol: AudioGrapher::SndfileHandle::..
In session file formats earlier than 7000, region position and length
are stored in distinct XML node properties. For 7000 or later, both
position and length are part of the "length" member. Fix reloading
this by noting session file format and loading position and length
more explicitly
The track-height change needs to be applied so that
vertical_adjustment max range is set correctly.
Otherwise vertical_adjustment.set_value() may fail
or scroll to the wrong position.
In 5b3eacd421 `redisplay_track_views()` was moved from
EditorRoutes to Editor. The call was delegated to the idle
thread, potentially collecting multiple calls before performing
the update.
This resulted in "Fit selection" to set the y-offset before the
height-change was applied.
Somewhat alarmed that gcc (at least) allows if (cue_recording ...) to be
used just like if (_cue_recording) even though the former is a class method
and the latter is a class member.