summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-11-17 00:13:53 -0500
committerDavid Robillard <d@drobilla.net>2014-11-17 00:13:53 -0500
commit85cf4b4dbdaa842f5868ada761c20e5b529dd473 (patch)
treef60aeb0e8eca219ddeef75fe2b26ec8e63c5896f
parentc91b6912604c82e05c341881da9e871878b343b2 (diff)
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.
-rw-r--r--gtk2_ardour/automation_time_axis.cc9
-rw-r--r--gtk2_ardour/automation_time_axis.h10
-rw-r--r--gtk2_ardour/midi_time_axis.cc4
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 <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
+#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<ARDOUR::Automatable>& automatable, std::set<Evoral::Parameter>& 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<ARDOUR::Route> _route;
- /** control; 0 if we are editing region-based automation */
+ /** control */
boost::shared_ptr<ARDOUR::AutomationControl> _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<ARDOUR::Automatable> _automatable;
- /** controller owner; 0 if we are editing region-based automation */
+ /** controller owner */
boost::shared_ptr<AutomationController> _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 ();
}