X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fchan_mapping.cc;h=f6f0e092c8065acd309bfe7d92c1cf73fb7be600;hb=47ba20143e06445a9977f4757d816439ea8042d0;hp=6386c2863b264a668121631b1bdf1c71071d9cb6;hpb=884cb355230d293233e599bdfebae7f67684a48e;p=ardour.git diff --git a/libs/ardour/chan_mapping.cc b/libs/ardour/chan_mapping.cc index 6386c2863b..f6f0e092c8 100644 --- a/libs/ardour/chan_mapping.cc +++ b/libs/ardour/chan_mapping.cc @@ -23,6 +23,10 @@ #include #include "ardour/chan_mapping.h" +#include "pbd/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 { @@ -184,6 +218,31 @@ ChanMapping::is_identity (ChanCount offset) const return true; } +uint32_t +ChanMapping::n_total () const +{ + // fast version of count().n_total(); + uint32_t rv = 0; + const Mappings& mp (mappings()); + for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) { + rv += tm->second.size (); + } + return rv; +} + +ChanCount +ChanMapping::count () const +{ + ChanCount rv; + const Mappings& mp (mappings()); + for (Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) { + rv.set (tm->first, tm->second.size ()); + } + return rv; +} + + + } // namespace ARDOUR std::ostream& operator<<(std::ostream& o, const ARDOUR::ChanMapping& cm)