Fix ATAV identification by Parameter (1/2) #8201, 8203

See also 72af571f0c, ATAV for Processors cannot be identified by
Parameter alone. STAV uses a std::map<Evoral::Parameter, ..>
that is only valid for unique parameters.

The map cannot store Evoral::Parameter(PluginAutomation)
because it its not unique.
This commit is contained in:
Robin Gareus 2020-06-04 20:49:20 +02:00
parent 1e7207f9ec
commit 0ab13e7b29
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
5 changed files with 47 additions and 11 deletions

View File

@ -2749,6 +2749,24 @@ RouteTimeAxisView::remove_child (boost::shared_ptr<TimeAxisView> c)
}
}
boost::shared_ptr<AutomationLine>
RouteTimeAxisView::automation_child_by_alist_id (PBD::ID alist_id)
{
for (list<ProcessorAutomationInfo*>::iterator i = processor_automation.begin(); i != processor_automation.end(); ++i) {
for (vector<ProcessorAutomationNode*>::iterator ii = (*i)->lines.begin(); ii != (*i)->lines.end(); ++ii) {
boost::shared_ptr<AutomationTimeAxisView> atv ((*ii)->view);
list<boost::shared_ptr<AutomationLine> > lines = atv->lines();
for (list<boost::shared_ptr<AutomationLine> >::const_iterator li = lines.begin(); li != lines.end(); ++li) {
if ((*li)->the_list()->id() == alist_id) {
return *li;
}
}
}
}
return StripableTimeAxisView::automation_child_by_alist_id (alist_id);
}
Gdk::Color
RouteTimeAxisView::color () const
{

View File

@ -208,6 +208,7 @@ protected:
void add_processor_automation_curve (boost::shared_ptr<ARDOUR::Processor> r, Evoral::Parameter);
void add_existing_processor_automation_curves (boost::weak_ptr<ARDOUR::Processor>);
boost::shared_ptr<AutomationLine> automation_child_by_alist_id (PBD::ID);
void reset_processor_automation_curves ();

View File

@ -1247,17 +1247,12 @@ Selection::set_state (XMLNode const & node, int)
vector <ControlPoint *> cps;
if (stv) {
boost::shared_ptr<AutomationTimeAxisView> atv = stv->automation_child (EventTypeMap::instance().from_symbol (param));
if (atv) {
list<boost::shared_ptr<AutomationLine> > lines = atv->lines();
for (list<boost::shared_ptr<AutomationLine> > ::iterator li = lines.begin(); li != lines.end(); ++li) {
if ((*li)->the_list()->id() == alist_id) {
ControlPoint* cp = (*li)->nth(view_index);
if (cp) {
cps.push_back (cp);
cp->show();
}
}
boost::shared_ptr<AutomationLine> li = stv->automation_child_by_alist_id (alist_id);
if (li) {
ControlPoint* cp = li->nth(view_index);
if (cp) {
cps.push_back (cp);
cp->show();
}
}
}
@ -1307,12 +1302,15 @@ Selection::set_state (XMLNode const & node, int)
} else if ((*i)->name() == X_("AutomationView")) {
#if 0
std::string param;
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) {
@ -1327,6 +1325,7 @@ Selection::set_state (XMLNode const & node, int)
add (atv.get());
}
}
#endif
} else if ((*i)->name() == X_("Marker")) {

View File

@ -25,6 +25,7 @@
#include "public_editor.h"
#include "stripable_time_axis.h"
#include "automation_line.h"
#include "pbd/i18n.h"
@ -201,6 +202,21 @@ StripableTimeAxisView::automation_child(Evoral::Parameter param)
}
}
boost::shared_ptr<AutomationLine>
StripableTimeAxisView::automation_child_by_alist_id (PBD::ID alist_id)
{
for (AutomationTracks::iterator i = _automation_tracks.begin(); i != _automation_tracks.end(); ++i) {
boost::shared_ptr<AutomationTimeAxisView> atv (i->second);
std::list<boost::shared_ptr<AutomationLine> > lines = atv->lines();
for (std::list<boost::shared_ptr<AutomationLine> >::const_iterator li = lines.begin(); li != lines.end(); ++li) {
if ((*li)->the_list()->id() == alist_id) {
return *li;
}
}
}
return boost::shared_ptr<AutomationLine> ();
}
void
StripableTimeAxisView::request_redraw ()
{

View File

@ -38,6 +38,8 @@ public:
virtual void create_automation_child (const Evoral::Parameter& param, bool show) = 0;
boost::shared_ptr<AutomationTimeAxisView> automation_child(Evoral::Parameter param);
virtual boost::shared_ptr<AutomationLine> automation_child_by_alist_id (PBD::ID);
void request_redraw ();
virtual void show_all_automation (bool apply_to_selection = false);