From 85cf4b4dbdaa842f5868ada761c20e5b529dd473 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 17 Nov 2014 00:13:53 -0500 Subject: [PATCH] Fix visibility of MIDI controller automation tracks across saves. Fix some inaccurate/misleading comments that led to said bug. Gracefully handle the "impossible" case where we can't figure out a state ID for an automation track, instead of crashing. --- gtk2_ardour/automation_time_axis.cc | 9 ++++++--- gtk2_ardour/automation_time_axis.h | 10 +++++++--- gtk2_ardour/midi_time_axis.cc | 4 +++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 61c5d28e19..5a6bf5dbbe 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -23,6 +23,7 @@ #include #include +#include "pbd/error.h" #include "pbd/memento_command.h" #include "pbd/stacktrace.h" @@ -876,15 +877,17 @@ AutomationTimeAxisView::lines () const string AutomationTimeAxisView::state_id() const { - if (_control) { + if (_automatable != _route && _control) { return string_compose ("automation %1", _control->id().to_s()); - } else { - assert (_parameter); + } else if (_parameter) { return string_compose ("automation %1 %2/%3/%4", _route->id(), _parameter.type(), _parameter.id(), (int) _parameter.channel()); + } else { + error << "Automation time axis has no state ID" << endmsg; + return ""; } } diff --git a/gtk2_ardour/automation_time_axis.h b/gtk2_ardour/automation_time_axis.h index 6db4bd4e64..156a5701e3 100644 --- a/gtk2_ardour/automation_time_axis.h +++ b/gtk2_ardour/automation_time_axis.h @@ -123,13 +123,17 @@ class AutomationTimeAxisView : public TimeAxisView { static void what_has_visible_automation (const boost::shared_ptr& automatable, std::set& visible); protected: + /* Note that for MIDI controller "automation" (in regions), all of these + may be set. In this case, _automatable is likely _route so the + controller will send immediate events out the route's MIDI port. */ + /** parent route */ boost::shared_ptr _route; - /** control; 0 if we are editing region-based automation */ + /** control */ boost::shared_ptr _control; - /** control owner; may be _route, or 0 if we are editing region-based automation */ + /** control owner; may be _route, something else (e.g. a pan control), or NULL */ boost::shared_ptr _automatable; - /** controller owner; 0 if we are editing region-based automation */ + /** controller owner */ boost::shared_ptr _controller; Evoral::Parameter _parameter; diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index 4d55f2e8e1..5f19e0e2a5 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -1303,7 +1303,9 @@ MidiTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool * since it will have been set visible by default. */ - if (existing->second->set_marked_for_display (show) && !no_redraw) { + existing->second->set_marked_for_display (show); + + if (!no_redraw) { request_redraw (); } -- 2.30.2