Fix crash when adding events to disabled MIDI event-lane

In case of MIDI CC/Bend/Pressure etc events, the underlying
data is provided by a MidiTrack (is-a Automatable) and not
an automation-control.

When directly calling AutomationControl::set_automation_state,
the AC disables automation-watch using shared_from_this().
With the Evoral::Control used for MidiTrack event-lists this
results in a tr1::bad_weak_ptr.
This commit is contained in:
Robin Gareus 2022-07-22 03:37:57 +02:00
parent 62aae6cffb
commit 2245042b85
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
3 changed files with 5 additions and 3 deletions

View File

@ -214,7 +214,7 @@ AutomationRegionView::add_automation_event (GdkEvent *, timepos_t const & w, dou
if (_line->the_list()->editor_add (when, y, with_guard_points)) {
if (ac->automation_state () == ARDOUR::Off) {
ac->set_automation_state (ARDOUR::Play);
view->set_automation_state (ARDOUR::Play);
}
if (UIConfiguration::instance().get_automation_edit_cancels_auto_hide () && ac == view->session()->recently_touched_controllable ()) {
RouteTimeAxisView::signal_ctrl_touched (false);

View File

@ -791,8 +791,9 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, timepos_t const &
if (list->editor_add (when, y, with_guard_points)) {
if (_control->automation_state () == ARDOUR::Off) {
_control->set_automation_state (ARDOUR::Play);
set_automation_state (ARDOUR::Play);
}
if (UIConfiguration::instance().get_automation_edit_cancels_auto_hide () && _control == _session->recently_touched_controllable ()) {
RouteTimeAxisView::signal_ctrl_touched (false);
}

View File

@ -134,6 +134,8 @@ public:
return _show_regions;
}
void set_automation_state (ARDOUR::AutoState);
protected:
/* Note that for MIDI controller "automation" (in regions), all of these
* may be set. In this case, _automatable is likely _route so the
@ -190,7 +192,6 @@ protected:
bool paste_one (Temporal::timepos_t const &, unsigned, float times, const Selection&, ItemCounts& counts, bool greedy=false);
void route_going_away ();
void set_automation_state (ARDOUR::AutoState);
bool ignore_state_request;
bool ignore_mode_request;