diff options
author | Robin Gareus <robin@gareus.org> | 2016-04-02 01:11:05 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-04-02 01:11:05 +0200 |
commit | e92b7b5ebb2217d052009bb7f81ac7ba5bd53e14 (patch) | |
tree | 292b67796a03949846d7bd39814a81fd3f414fbe | |
parent | 0eea06b6359822fa06956a4e39c3b100ae8fe510 (diff) |
implement save/load channel-maps
-rw-r--r-- | libs/ardour/ardour/chan_mapping.h | 4 | ||||
-rw-r--r-- | libs/ardour/chan_mapping.cc | 36 |
2 files changed, 39 insertions, 1 deletions
diff --git a/libs/ardour/ardour/chan_mapping.h b/libs/ardour/ardour/chan_mapping.h index 88cdf44408..f1ffef373e 100644 --- a/libs/ardour/ardour/chan_mapping.h +++ b/libs/ardour/ardour/chan_mapping.h @@ -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 diff --git a/libs/ardour/chan_mapping.cc b/libs/ardour/chan_mapping.cc index 9e69294fdb..1d59faff00 100644 --- a/libs/ardour/chan_mapping.cc +++ b/libs/ardour/chan_mapping.cc @@ -23,6 +23,10 @@ #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 { |