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.
This commit is contained in:
David Robillard 2014-11-17 00:13:53 -05:00
parent c91b691260
commit 85cf4b4dbd
3 changed files with 16 additions and 7 deletions

View file

@ -23,6 +23,7 @@
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include "pbd/error.h"
#include "pbd/memento_command.h" #include "pbd/memento_command.h"
#include "pbd/stacktrace.h" #include "pbd/stacktrace.h"
@ -876,15 +877,17 @@ AutomationTimeAxisView::lines () const
string string
AutomationTimeAxisView::state_id() const AutomationTimeAxisView::state_id() const
{ {
if (_control) { if (_automatable != _route && _control) {
return string_compose ("automation %1", _control->id().to_s()); return string_compose ("automation %1", _control->id().to_s());
} else { } else if (_parameter) {
assert (_parameter);
return string_compose ("automation %1 %2/%3/%4", return string_compose ("automation %1 %2/%3/%4",
_route->id(), _route->id(),
_parameter.type(), _parameter.type(),
_parameter.id(), _parameter.id(),
(int) _parameter.channel()); (int) _parameter.channel());
} else {
error << "Automation time axis has no state ID" << endmsg;
return "";
} }
} }

View file

@ -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); static void what_has_visible_automation (const boost::shared_ptr<ARDOUR::Automatable>& automatable, std::set<Evoral::Parameter>& visible);
protected: 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 */ /** parent route */
boost::shared_ptr<ARDOUR::Route> _route; boost::shared_ptr<ARDOUR::Route> _route;
/** control; 0 if we are editing region-based automation */ /** control */
boost::shared_ptr<ARDOUR::AutomationControl> _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; boost::shared_ptr<ARDOUR::Automatable> _automatable;
/** controller owner; 0 if we are editing region-based automation */ /** controller owner */
boost::shared_ptr<AutomationController> _controller; boost::shared_ptr<AutomationController> _controller;
Evoral::Parameter _parameter; Evoral::Parameter _parameter;

View file

@ -1303,7 +1303,9 @@ MidiTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool
* since it will have been set visible by default. * 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 (); request_redraw ();
} }