summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dgxmlparser.cc53
-rw-r--r--test/dgxmlparsertest.cc34
2 files changed, 56 insertions, 31 deletions
diff --git a/src/dgxmlparser.cc b/src/dgxmlparser.cc
index 016ad60..cc76b3e 100644
--- a/src/dgxmlparser.cc
+++ b/src/dgxmlparser.cc
@@ -58,25 +58,40 @@ static bool assign(std::string& dest, const std::string& val)
return true;
}
-static bool assign(size_t& dest, const std::string& val)
+static bool assign(std::size_t& dest, const std::string& val)
{
int tmp = atoi(val.c_str());
if(tmp < 0) return false;
dest = tmp;
- return std::to_string(dest) == val;
+ return std::to_string(dest) == val;
+}
+
+static bool assign(main_state_t& dest, const std::string& val)
+{
+ if(val != "true" && val != "false")
+ {
+ return false;
+ }
+ dest = (val == "true") ? main_state_t::is_main : main_state_t::is_not_main;
+ return true;
}
template<typename T>
-static bool attrcpy(T& dest, const pugi::xml_node& src, const std::string& attr)
+static bool attrcpy(T& dest, const pugi::xml_node& src, const std::string& attr, bool opt = false)
{
- const char* val = src.attribute(attr.c_str()).as_string(nullptr);
+ const char* val = src.attribute(attr.c_str()).as_string(nullptr);
if(!val) {
- ERR("Attribute %s not found in %s, offset %s\n", attr.c_str(), src.path().c_str(), (int) src.offset_debug());
- return false;
+ if(!opt)
+ {
+ ERR(dgxmlparser, "Attribute %s not found in %s, offset %d\n",
+ attr.data(), src.path().data(), (int)src.offset_debug());
+ }
+ return opt;
}
if(!assign(dest, std::string(val))) {
- ERR("Attribute %s could not be assigned, offset %s\n", attr.c_str(), (int) src.offset_debug());
+ ERR(dgxmlparser, "Attribute %s could not be assigned, offset %d\n",
+ attr.data(), (int)src.offset_debug());
return false;
}
@@ -96,11 +111,12 @@ bool parseDrumkitFile(const std::string& filename, DrumkitDOM& dom)
return false;
}
- //TODO: handle xml version
-
+ //TODO: handle xml version
+
pugi::xml_node drumkit = doc.child("drumkit");
res &= attrcpy(dom.description, drumkit, "description");
res &= attrcpy(dom.name, drumkit, "name");
+ res &= attrcpy(dom.samplerate, drumkit, "samplerate");
pugi::xml_node channels = doc.child("drumkit").child("channels");
for(pugi::xml_node channel: channels.children("channel"))
@@ -110,20 +126,21 @@ bool parseDrumkitFile(const std::string& filename, DrumkitDOM& dom)
}
pugi::xml_node instruments = doc.child("drumkit").child("instruments");
- for(pugi::xml_node instrument: instruments.children("instrument"))
+ for(pugi::xml_node instrument : instruments.children("instrument"))
{
dom.instruments.emplace_back();
res &= attrcpy(dom.instruments.back().name, instrument, "name");
res &= attrcpy(dom.instruments.back().file, instrument, "file");
- res &= attrcpy(dom.instruments.back().group, instrument, "group");
+ res &= attrcpy(dom.instruments.back().group, instrument, "group", true);
for(pugi::xml_node cmap: instrument.children("channelmap"))
{
dom.instruments.back().channel_map.emplace_back();
res &= attrcpy(dom.instruments.back().channel_map.back().in, cmap, "in");
res &= attrcpy(dom.instruments.back().channel_map.back().out, cmap, "out");
- //TODO:handle main
+ dom.instruments.back().channel_map.back().main = main_state_t::unset;
+ res &= attrcpy(dom.instruments.back().channel_map.back().main, cmap, "main", true);
}
}
@@ -135,14 +152,22 @@ bool parseInstrumentFile(const std::string& filename, InstrumentDOM& dom)
bool res = true;
pugi::xml_document doc;
- pugi::xml_parse_result result = doc.load_file(filename.c_str());
-
+ pugi::xml_parse_result result = doc.load_file(filename.data());
res &= !result.status;
//TODO: handle version
pugi::xml_node instrument = doc.child("instrument");
res &= attrcpy(dom.name, instrument, "name");
+ pugi::xml_node channels = instrument.child("channels");
+ for(pugi::xml_node channel : channels.children("channel"))
+ {
+ dom.instrument_channels.emplace_back();
+ res &= attrcpy(dom.instrument_channels.back().name, channel, "name");
+ dom.instrument_channels.back().main = main_state_t::unset;
+ res &= attrcpy(dom.instrument_channels.back().main, channel, "main", true);
+ }
+
pugi::xml_node samples = doc.child("instrument").child("samples");
for(pugi::xml_node sample: samples.children("sample"))
{
diff --git a/test/dgxmlparsertest.cc b/test/dgxmlparsertest.cc
index c5bb984..cee034b 100644
--- a/test/dgxmlparsertest.cc
+++ b/test/dgxmlparsertest.cc
@@ -52,9 +52,9 @@ public:
"<?xml version='1.0' encoding='UTF-8'?>\n" \
"<instrument version=\"2.0\" name=\"Snare\">\n" \
" <channels>\n" \
- " <channel name=\"AmbLeft\" main=\"true\">\">\n" \
- " <channel name=\"AmbRight\" main=\"false\">\">\n" \
- " <channel name=\"SnareBottom\">\">\n" \
+ " <channel name=\"AmbLeft\" main=\"true\"/>\n" \
+ " <channel name=\"AmbRight\" main=\"false\"/>\n" \
+ " <channel name=\"SnareBottom\"/>\n" \
" </channels>\n" \
" <samples>\n" \
" <sample name=\"Snare-1\" power=\"0.00985718\">\n" \
@@ -95,11 +95,11 @@ public:
CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), s.audiofiles[2].instrument_channel);
CPPUNIT_ASSERT_EQUAL(std::string("1-Snare.wav"), s.audiofiles[2].file);
- CPPUNIT_ASSERT_EQUAL(std::size_t(3), s.audiofiles[2].filechannel);
+ CPPUNIT_ASSERT_EQUAL(std::size_t(12), s.audiofiles[2].filechannel);
CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), s.audiofiles[3].instrument_channel);
CPPUNIT_ASSERT_EQUAL(std::string("1-Snare.wav"), s.audiofiles[3].file);
- CPPUNIT_ASSERT_EQUAL(std::size_t(4), s.audiofiles[3].filechannel);
+ CPPUNIT_ASSERT_EQUAL(std::size_t(13), s.audiofiles[3].filechannel);
}
{
@@ -117,11 +117,11 @@ public:
CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), s.audiofiles[2].instrument_channel);
CPPUNIT_ASSERT_EQUAL(std::string("2-Snare.wav"), s.audiofiles[2].file);
- CPPUNIT_ASSERT_EQUAL(std::size_t(3), s.audiofiles[2].filechannel);
+ CPPUNIT_ASSERT_EQUAL(std::size_t(12), s.audiofiles[2].filechannel);
CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), s.audiofiles[3].instrument_channel);
CPPUNIT_ASSERT_EQUAL(std::string("2-Snare.wav"), s.audiofiles[3].file);
- CPPUNIT_ASSERT_EQUAL(std::size_t(4), s.audiofiles[3].filechannel);
+ CPPUNIT_ASSERT_EQUAL(std::size_t(13), s.audiofiles[3].filechannel);
}
CPPUNIT_ASSERT_EQUAL(std::size_t(3), dom.instrument_channels.size());
@@ -177,13 +177,13 @@ public:
CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft-in"), instr.channel_map[0].in);
CPPUNIT_ASSERT_EQUAL(std::string("AmbRight-in"), instr.channel_map[1].in);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom-in"), instr.channel_map[2].in);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareTop-in"), instr.channel_map[3].in);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareTop-in"), instr.channel_map[2].in);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom-in"), instr.channel_map[3].in);
CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft"), instr.channel_map[0].out);
CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"), instr.channel_map[1].out);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), instr.channel_map[2].out);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), instr.channel_map[3].out);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), instr.channel_map[2].out);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), instr.channel_map[3].out);
CPPUNIT_ASSERT(main_state_t::is_main == instr.channel_map[0].main);
CPPUNIT_ASSERT(main_state_t::is_main == instr.channel_map[1].main);
@@ -199,13 +199,13 @@ public:
CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft2-in"), instr.channel_map[0].in);
CPPUNIT_ASSERT_EQUAL(std::string("AmbRight2-in"), instr.channel_map[1].in);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom2-in"), instr.channel_map[2].in);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareTop2-in"), instr.channel_map[3].in);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareTop2-in"), instr.channel_map[2].in);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom2-in"), instr.channel_map[3].in);
CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft"), instr.channel_map[0].out);
CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"), instr.channel_map[1].out);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), instr.channel_map[2].out);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), instr.channel_map[3].out);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), instr.channel_map[2].out);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), instr.channel_map[3].out);
CPPUNIT_ASSERT(main_state_t::is_not_main == instr.channel_map[0].main);
CPPUNIT_ASSERT(main_state_t::is_not_main == instr.channel_map[1].main);
@@ -216,8 +216,8 @@ public:
CPPUNIT_ASSERT_EQUAL(std::size_t(4), dom.channels.size());
CPPUNIT_ASSERT_EQUAL(std::string("AmbLeft"), dom.channels[0].name);
CPPUNIT_ASSERT_EQUAL(std::string("AmbRight"), dom.channels[1].name);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), dom.channels[2].name);
- CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), dom.channels[3].name);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareTop"), dom.channels[2].name);
+ CPPUNIT_ASSERT_EQUAL(std::string("SnareBottom"), dom.channels[3].name);
}
};