+void
+SlavableAutomationControl::use_saved_master_ratios ()
+{
+ if (!_masters_node) {
+ return;
+ }
+
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+
+ /* use stored state, do not recompute */
+
+ if (_desc.toggled) {
+
+ XMLNodeList nlist = _masters_node->children();
+ XMLNodeIterator niter;
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ XMLProperty const * id_prop = (*niter)->property (X_("id"));
+ if (!id_prop) {
+ continue;
+ }
+ XMLProperty const * yn_prop = (*niter)->property (X_("yn"));
+ if (!yn_prop) {
+ continue;
+ }
+ Masters::iterator mi = _masters.find (ID (id_prop->value()));
+ if (mi != _masters.end()) {
+ mi->second.set_yn (string_is_affirmative (yn_prop->value()));
+ }
+ }
+
+ } else {
+
+ }
+
+ delete _masters_node;
+ _masters_node = 0;
+
+ return;
+}
+
+
+XMLNode&
+SlavableAutomationControl::get_state ()
+{
+ XMLNode& node (AutomationControl::get_state());
+
+ /* store VCA master ratios */
+
+ {
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+
+ if (!_masters.empty()) {
+
+ XMLNode* masters_node = new XMLNode (X_("masters"));
+
+ if (_desc.toggled) {
+ for (Masters::iterator mr = _masters.begin(); mr != _masters.end(); ++mr) {
+ XMLNode* mnode = new XMLNode (X_("master"));
+ mnode->add_property (X_("id"), mr->second.master()->id().to_s());
+ mnode->add_property (X_("yn"), mr->second.yn());
+ masters_node->add_child_nocopy (*mnode);
+ }
+ } else {
+
+ }
+
+ node.add_child_nocopy (*masters_node);
+ }
+ }
+
+ return node;
+}
+
+int
+SlavableAutomationControl::set_state (XMLNode const& node, int version)
+{
+ XMLNodeList nlist = node.children();
+ XMLNodeIterator niter;
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ if ((*niter)->name() == X_("masters")) {
+ _masters_node = new XMLNode (**niter);
+ }
+ }
+
+ return AutomationControl::set_state (node, version);
+}
+
+