implement save/load channel-maps

This commit is contained in:
Robin Gareus 2016-04-02 01:11:05 +02:00
parent 0eea06b635
commit e92b7b5ebb
2 changed files with 39 additions and 1 deletions

View 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

View file

@ -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
{