implement save/load channel-maps
authorRobin Gareus <robin@gareus.org>
Fri, 1 Apr 2016 23:11:05 +0000 (01:11 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 1 Apr 2016 23:11:05 +0000 (01:11 +0200)
libs/ardour/ardour/chan_mapping.h
libs/ardour/chan_mapping.cc

index 88cdf44408aac0084fbd46c69722492164681bc0..f1ffef373e45d85193c2ed5c5d4558e82ea6abdb 100644 (file)
@@ -25,6 +25,7 @@
 #include <ostream>
 #include <utility>
 
+#include "pbd/xml++.h"
 #include "ardour/data_type.h"
 #include "ardour/chan_count.h"
 
@@ -42,6 +43,7 @@ public:
        ChanMapping() {}
        ChanMapping(ARDOUR::ChanCount identity);
        ChanMapping(const ChanMapping&);
+       ChanMapping(const XMLNode& node);
 
        uint32_t get(DataType t, uint32_t from, bool* valid) const;
 
@@ -88,6 +90,8 @@ public:
 
        uint32_t count () const;
 
+       XMLNode* state(const std::string& name) const;
+
        /** Test if this mapping is a subset
         * @param superset to test against
         * @returns true if all mapping are also present in the superset
index 9e69294fdbad233d926ec6c86b9579319a291884..1d59faff00033def1aa2858cac7f1d6dcc39a4de 100644 (file)
 #include <iostream>
 #include "ardour/chan_mapping.h"
 
+#include "i18n.h"
+
+static const char* state_node_name = "Channelmap";
+
 using namespace std;
 
 namespace ARDOUR {
@@ -40,7 +44,7 @@ ChanMapping::ChanMapping(ChanCount identity)
        }
 }
 
-ChanMapping::ChanMapping (const ChanMapping& other )
+ChanMapping::ChanMapping (const ChanMapping& other)
 {
        const ChanMapping::Mappings& mp (other.mappings());
        for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
@@ -50,6 +54,19 @@ ChanMapping::ChanMapping (const ChanMapping& other )
        }
 }
 
+ChanMapping::ChanMapping (const XMLNode& node)
+{
+       XMLNodeConstIterator iter = node.children().begin();
+       for ( ; iter != node.children().end(); ++iter) {
+               if ((*iter)->name() == X_(state_node_name)) {
+                       const string& type_str  = (*iter)->property("type")->value();
+                       const string& from_str = (*iter)->property("from")->value();
+                       const string& to_str = (*iter)->property("to")->value();
+                       set(DataType(type_str), atol (from_str.c_str()), atol (to_str.c_str()));
+               }
+       }
+}
+
 uint32_t
 ChanMapping::get(DataType t, uint32_t from, bool* valid) const
 {
@@ -135,6 +152,23 @@ ChanMapping::offset_to(DataType t, int32_t delta)
        }
 }
 
+XMLNode*
+ChanMapping::state(const std::string& name) const
+{
+       XMLNode* node = new XMLNode (name);
+       const Mappings& mp (mappings());
+       for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
+               for (TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
+                       XMLNode* n = new XMLNode(X_(state_node_name));
+                       n->add_property("type", tm->first.to_string());
+                       n->add_property("from", i->first);
+                       n->add_property("to", i->second);
+                       node->add_child_nocopy(*n);
+               }
+       }
+       return node;
+}
+
 bool
 ChanMapping::is_subset (const ChanMapping& superset) const
 {