diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 8fd8855f53..c5759eb859 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -2749,6 +2749,23 @@ RouteTimeAxisView::remove_child (boost::shared_ptr c) } } +boost::shared_ptr +RouteTimeAxisView::automation_child(Evoral::Parameter param, PBD::ID ctrl_id) +{ + if (param.type() != PluginAutomation) { + return StripableTimeAxisView::automation_child (param, ctrl_id); + } + for (list::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) { + for (vector::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) { + boost::shared_ptr atv ((*ii)->view); + if (atv->control()->id() == ctrl_id) { + return atv; + } + } + } + return boost::shared_ptr(); +} + boost::shared_ptr RouteTimeAxisView::automation_child_by_alist_id (PBD::ID alist_id) { diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 4db1036cd9..06e14aff74 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -134,6 +134,7 @@ public: int set_state (const XMLNode&, int version); virtual Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter); + virtual boost::shared_ptr automation_child(Evoral::Parameter param, PBD::ID ctrl_id = PBD::ID(0)); StreamView* view() const { return _view; } ARDOUR::RouteGroup* route_group() const; diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index 4b8ff41160..30c4dfd597 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -1073,6 +1073,7 @@ Selection::get_state () const XMLNode* t = node->add_child (X_("AutomationView")); t->set_property (X_("id"), atv->parent_stripable()->id ()); t->set_property (X_("parameter"), EventTypeMap::instance().to_symbol (atv->parameter ())); + t->set_property (X_("ctrl_id"), atv->control()->id()) } } @@ -1302,30 +1303,28 @@ Selection::set_state (XMLNode const & node, int) } else if ((*i)->name() == X_("AutomationView")) { -#if 0 + // XXX is this even used? -> StripableAutomationControl std::string param; + PBD::ID ctrl_id (0); if (!(*i)->get_property (X_("id"), id) || !(*i)->get_property (X_("parameter"), param)) { assert (false); } - // TODO we need additional information Evoral::Parmeter does not uniquely identify an Automation Lane - StripableTimeAxisView* stv = editor->get_stripable_time_axis_by_id (id); - if (stv) { - boost::shared_ptr atv = stv->automation_child (EventTypeMap::instance().from_symbol (param)); + if (stv && (*i)->get_property (X_("control_id"), ctrl_id)) { + boost::shared_ptr atv = stv->automation_child (EventTypeMap::instance().from_symbol (param), ctrl_id); /* the automation could be for an entity that was never saved - in the session file. Don't freak out if we can't find - it. - */ + * in the session file. Don't freak out if we can't find + * it. + */ if (atv) { add (atv.get()); } } -#endif } else if ((*i)->name() == X_("Marker")) { diff --git a/gtk2_ardour/stripable_time_axis.cc b/gtk2_ardour/stripable_time_axis.cc index f1e01fde4a..4860e5a4b8 100644 --- a/gtk2_ardour/stripable_time_axis.cc +++ b/gtk2_ardour/stripable_time_axis.cc @@ -191,7 +191,7 @@ StripableTimeAxisView::automation_track_hidden (Evoral::Parameter param) } boost::shared_ptr -StripableTimeAxisView::automation_child(Evoral::Parameter param) +StripableTimeAxisView::automation_child(Evoral::Parameter param, PBD::ID) { assert (param.type() != PluginAutomation); AutomationTracks::iterator i = _automation_tracks.find(param); diff --git a/gtk2_ardour/stripable_time_axis.h b/gtk2_ardour/stripable_time_axis.h index 27903a54dd..329968efc9 100644 --- a/gtk2_ardour/stripable_time_axis.h +++ b/gtk2_ardour/stripable_time_axis.h @@ -36,7 +36,7 @@ public: virtual Gtk::CheckMenuItem* automation_child_menu_item (Evoral::Parameter); virtual void create_automation_child (const Evoral::Parameter& param, bool show) = 0; - boost::shared_ptr automation_child(Evoral::Parameter param); + virtual boost::shared_ptr automation_child (Evoral::Parameter param, PBD::ID ctrl_id = PBD::ID(0)); virtual boost::shared_ptr automation_child_by_alist_id (PBD::ID);