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/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 "";
}
}

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);
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;

View File

@ -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 ();
}