The manu is rebuilt every time it is required, no need to delete it. In addition, deleting it
in the middle of an event handler causes memory corruption because the entire menu (with all
items and submenus) is deleted before event handling for the menu is completed
Stop the engine if it was started for latency measurement
but measurement was aborted.
Previously the engine was kept running and the "Start' button
was not available.
If this happened during initial session loading, a user
would have to manually restart the engine to proceed.
When the screen-height is insufficient, the loudness-graph is
not included in the dialog. It is still visible in the image
saved with the export (save-export-analysis-image).
For tiny screens the conformity analysis may also be skipped.
```
gtk2_ardour/ardour_ui.cc:2060: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/usr/include/architecture/i386/math.h:343: note: candidate 1: double pow(double, double)
/usr/include/c++/4.2.1/cmath:357: note: candidate 2: float std::pow(float, float)
```
Previously x-axis threshold was in samples. This is
useless unless zoomed in to the max. So in most cases
the first-move was always in x-direction, making constrained
y-axis drags near impossible.
Furthermore the threshold for copy-drags was increased
as per #8686
Region positions were updated in the GUI, before the playlist
was catching up.
The butler thread reads a region using the region's new position,
but the playlist's old range.
Thread 1 (GUI)
```
#22 ARDOUR::Playlist::notify_layering_changed()
#26 ARDOUR::AudioPlaylist::region_changed
#27 ARDOUR::Playlist::region_changed_proxy
#35 ARDOUR::Region::send_change
#36 ARDOUR::Region::set_position
#37 RegionRippleDrag::remove_unselected_from_views
#38 RegionRippleDrag::finished
```
LayeringChanged() also triggers DiskIOProcessor::playlist_modified
which schedules a pending-override and summons the butler.
Note that when moving only a few regions the butler starts after all
updates have been completed.
Butler thread:
```
#4 ARDOUR::AudioRegion::read_at
#5 ARDOUR::AudioPlaylist::read
#6 ARDOUR::DiskReader::audio_read
#7 ARDOUR::DiskReader::overwrite_existing_audio
#8 ARDOUR::DiskReader::overwrite_existing_buffers
#9 ARDOUR::Track::overwrite_existing_buffers
#10 ARDOUR::Session::non_realtime_overwrite
```
Region read fails:
```
libs/ardour/audioregion.cc:503 assert (position >= _position);
(gdb) p position
$1 = 1312000
(gdb) p _position
$2 = {<PBD::PropertyTemplate<long>> = {_have_old = true,
_current = 1336000, _old = 1312000} }
```
The DraggingView's time_axis_view (index) is set to the size of _time_axis_views
in ::motion() near line 1149. This makes it invalid as index into the vector.
see also 25c0bd9274
play, locate, play resulted in the video-monitor showing
the target frame shortly, and play a few frames from the old
location.
This was due to locate happening async. Click to locate
directly sends the new location:
```
VideoTimeLine::manual_seek_video_monitor
ARDOUR_UI::update_transport_clocks
CursorDrag::fake_locate
CursorDrag::start_grab
DragManager::start_grab
```
CursorDrag::finished unset _dragging_playhead before the
call to resuest_locate(). Meanwhile playback continues.
This is an initial work-around for signal emission with
Playlist:region_lock held:
Playlist::duplicate() takes RegionWriteLock() and then calls
RegionFactory::create(). The newly created region does NOT have
property-changes suspended, and the RegionFactory can change
region-properties which results in signal-emission.
This in turn can lead to a call Editor::session_gui_extents()
-> ARDOUR::Playlist::get_extent() -> Playlist::RegionReadLock
which deadlocks: https://pastebin.com/84rSbsA3
Eventually we need a mechanism to create regions with
->suspend_property_changes() and add it to the playlist's
thawlist (pass a thawlist to the region-factory).
Playlist changes do not include region-property changes.
When inserting a region, position(s) of other Regions may
change and those changes have to be recorded explicitly (for now).
see also RegionRippleDrag.
The undo command needs to be started before calling
playlist->add_region() because that may move automation
or include ripple changes. see the following backtrace:
```
UndoTransaction::add_command
ARDOUR::DiskReader::move_processor_automation
ARDOUR::Route::foreach_processor
ARDOUR::DiskReader::playlist_ranges_moved
ARDOUR::Playlist::flush_notifications
ARDOUR::Playlist::RegionWriteLock::~RegionWriteLock
ARDOUR::Playlist::add_region
Editor::bounce_range_selection
```
Except. it seems automation is moved incorrectly in this case..