+ if (_controls.find(control->number()) == _controls.end()) {
+ _controls.insert(make_pair(control->number(), control));
+ } else {
+ PBD::warning << string_compose("%1: Duplicate control %2 ignored",
+ tree.filename(), control->number())
+ << endmsg;
+ }
+ }
+ }
+
+ return 0;
+}
+
+boost::shared_ptr<const Control>
+ControlNameList::control(uint16_t num) const
+{
+ Controls::const_iterator i = _controls.find(num);
+ if (i != _controls.end()) {
+ return i->second;
+ }
+ return boost::shared_ptr<const Control>();
+}
+
+XMLNode&
+Value::get_state (void)
+{
+ XMLNode* node = new XMLNode("Value");
+ node->add_property("Number", _number);
+ node->add_property("Name", _name);
+
+ return *node;
+}
+
+int
+Value::set_state (const XMLTree& tree, const XMLNode& node)
+{
+ assert(node.name() == "Value");
+ _number = string_to_int(tree, node.property("Number")->value());
+ _name = node.property("Name")->value();
+
+ return 0;
+}
+
+XMLNode&
+ValueNameList::get_state (void)
+{
+ XMLNode* node = new XMLNode("ValueNameList");
+ node->add_property("Name", _name);
+
+ return *node;
+}
+
+int
+ValueNameList::set_state (const XMLTree& tree, const XMLNode& node)
+{
+ assert(node.name() == "ValueNameList");
+ const XMLProperty* name_prop = node.property("Name");
+ if (name_prop) {
+ // May be anonymous if written inline within a single <Control> tag
+ _name = name_prop->value();
+ }
+
+ _values.clear();
+ for (XMLNodeList::const_iterator i = node.children().begin();
+ i != node.children().end(); ++i) {
+ if ((*i)->name() == "Value") {
+ boost::shared_ptr<Value> value(new Value());
+ value->set_state (tree, *(*i));
+ if (_values.find(value->number()) == _values.end()) {
+ _values.insert(make_pair(value->number(), value));
+ } else {
+ PBD::warning << string_compose("%1: Duplicate value %2 ignored",
+ tree.filename(), value->number())
+ << endmsg;
+ }