summaryrefslogtreecommitdiff
path: root/src/drumkitparser.cc
diff options
context:
space:
mode:
authorAndré Nusser <andre.nusser@googlemail.com>2016-03-22 00:40:15 +0100
committerAndré Nusser <andre.nusser@googlemail.com>2016-03-29 22:19:49 +0200
commit0930fdc014bf36fb9e2715b3d14bff5fedf354a9 (patch)
tree9136c06ba9311f164e03156312ed449367acf20a /src/drumkitparser.cc
parent866b09992668f97af063dcd77dc5dd0e3a512b94 (diff)
Parser refactoring.
* Use new style * Update to C++11 * Use more std::string than char*
Diffstat (limited to 'src/drumkitparser.cc')
-rw-r--r--src/drumkitparser.cc413
1 files changed, 193 insertions, 220 deletions
diff --git a/src/drumkitparser.cc b/src/drumkitparser.cc
index f0fddf8..b3f3b99 100644
--- a/src/drumkitparser.cc
+++ b/src/drumkitparser.cc
@@ -34,244 +34,217 @@
#include "path.h"
#include "drumgizmo.h"
-DrumKitParser::DrumKitParser(const std::string &file, DrumKit &k)
- : kit(k)
- , refs(REFSFILE)
+DrumKitParser::DrumKitParser(const std::string& file, DrumKit& k)
+ : kit(k)
+ , refs(REFSFILE)
{
- std::string kitfile = file;
+ std::string kitfile = file;
- if(refs.load()) {
- if(file.size() > 1 && file[0] == '@') {
- kitfile = refs.getValue(file.substr(1));
- }
- } else {
- ERR(drumkitparser, "Error reading refs.conf");
- }
+ if(refs.load())
+ {
+ if(file.size() > 1 && file[0] == '@')
+ {
+ kitfile = refs.getValue(file.substr(1));
+ }
+ }
+ else
+ {
+ ERR(drumkitparser, "Error reading refs.conf");
+ }
- // instr = NULL;
- path = getPath(kitfile);
+ // instr = NULL;
+ path = getPath(kitfile);
- fd = fopen(kitfile.c_str(), "r");
+ fd = fopen(kitfile.c_str(), "r");
- // DEBUG(kitparser, "Parsing drumkit in %s\n", kitfile.c_str());
+ // DEBUG(kitparser, "Parsing drumkit in %s\n", kitfile.c_str());
- if(!fd) return;
+ if(!fd)
+ {
+ return;
+ }
- kit._file = file;
+ kit._file = file;
}
DrumKitParser::~DrumKitParser()
{
- if(fd) fclose(fd);
+ if(fd)
+ {
+ fclose(fd);
+ }
+
}
-void DrumKitParser::startTag(std::string name,
- std::map<std::string, std::string> attr)
+void DrumKitParser::startTag(const std::string& name,
+ attr_t& attr)
{
- if(name == "drumkit") {
- if(attr.find("name") != attr.end())
- kit._name = attr["name"];
-
- if(attr.find("samplerate") != attr.end()) {
- kit._samplerate = atoi(attr["samplerate"].c_str());
- } else {
- // If 'samplerate' attribute is missing, assume 44k1Hz
- // TODO: Ask instrument what samplerate is in the audiofiles...
- kit._samplerate = 44100;
- }
-
- if(attr.find("description") != attr.end())
- kit._description = attr["description"];
-
- if(attr.find("version") != attr.end()) {
- try {
- kit._version = VersionStr(attr["version"]);
- } catch(const char *err) {
- ERR(kitparser, "Error parsing version number: %s, using 1.0\n", err);
- kit._version = VersionStr(1,0,0);
- }
- } else {
- WARN(kitparser, "Missing version number, assuming 1.0\n");
- kit._version = VersionStr(1,0,0);
- }
- }
-
- if(name == "channels") {}
-
- if(name == "channel") {
- if(attr.find("name") == attr.end()) {
- DEBUG(kitparser, "Missing channel name.\n");
- return;
- }
- Channel c(attr["name"]);
- c.num = kit.channels.size();
- kit.channels.push_back(c);
- }
-
- if(name == "instruments") {
- }
-
- if(name == "instrument") {
- if(attr.find("name") == attr.end()) {
- DEBUG(kitparser, "Missing name in instrument tag.\n");
- return;
- }
- if(attr.find("file") == attr.end()) {
- DEBUG(kitparser, "Missing file in instrument tag.\n");
- return;
- }
-
- instr_name = attr["name"];
- instr_file = attr["file"];
- if(attr.find("group") != attr.end()) instr_group = attr["group"];
- else instr_group = "";
- }
-
- if(name == "channelmap") {
- if(attr.find("in") == attr.end()) {
- DEBUG(kitparser, "Missing 'in' in channelmap tag.\n");
- return;
- }
-
- if(attr.find("out") == attr.end()) {
- DEBUG(kitparser, "Missing 'out' in channelmap tag.\n");
- return;
- }
-
- channelmap[attr["in"]] = attr["out"];
- }
+ if(name == "drumkit")
+ {
+ if(attr.find("name") != attr.end())
+ {
+ kit._name = attr["name"];
+ }
+
+ if(attr.find("samplerate") != attr.end())
+ {
+ kit._samplerate = std::stoi(attr["samplerate"]);
+ }
+ else
+ {
+ // If 'samplerate' attribute is missing, assume 44k1Hz
+ // TODO: Ask instrument what samplerate is in the audiofiles...
+ kit._samplerate = 44100;
+ }
+
+ if(attr.find("description") != attr.end())
+ {
+ kit._description = attr["description"];
+ }
+
+ if(attr.find("version") != attr.end())
+ {
+ try
+ {
+ kit._version = VersionStr(attr["version"]);
+ }
+ catch(const char *err)
+ {
+ ERR(kitparser, "Error parsing version number: %s, using 1.0\n", err);
+ kit._version = VersionStr(1,0,0);
+ }
+ }
+ else
+ {
+ WARN(kitparser, "Missing version number, assuming 1.0\n");
+ kit._version = VersionStr(1,0,0);
+ }
+ }
+
+ if(name == "channels")
+ {
+
+ }
+
+ if(name == "channel")
+ {
+ if(attr.find("name") == attr.end())
+ {
+ ERR(kitparser, "Missing channel name.\n");
+ return;
+ }
+
+ Channel c(attr["name"]);
+ c.num = kit.channels.size();
+ kit.channels.push_back(c);
+ }
+
+ if(name == "instruments")
+ {
+
+ }
+
+ if(name == "instrument")
+ {
+ if(attr.find("name") == attr.end())
+ {
+ ERR(kitparser, "Missing name in instrument tag.\n");
+ return;
+ }
+ if(attr.find("file") == attr.end())
+ {
+ ERR(kitparser, "Missing file in instrument tag.\n");
+ return;
+ }
+
+ instr_name = attr["name"];
+ instr_file = attr["file"];
+ if(attr.find("group") != attr.end())
+ {
+ instr_group = attr["group"];
+ }
+ else
+ {
+ instr_group = "";
+ }
+ }
+
+ if(name == "channelmap")
+ {
+ if(attr.find("in") == attr.end())
+ {
+ ERR(kitparser, "Missing 'in' in channelmap tag.\n");
+ return;
+ }
+
+ if(attr.find("out") == attr.end())
+ {
+ ERR(kitparser, "Missing 'out' in channelmap tag.\n");
+ return;
+ }
+
+ channelmap[attr["in"]] = attr["out"];
+ }
}
-void DrumKitParser::endTag(std::string name)
+void DrumKitParser::endTag(const std::string& name)
{
- if(name == "instrument") {
- Instrument *i = new Instrument();
- i->setGroup(instr_group);
- // Instrument &i = kit.instruments[kit.instruments.size() - 1];
- InstrumentParser parser(path + "/" + instr_file, *i);
- parser.parse();
- kit.instruments.push_back(i);
-
- // Assign kit channel numbers to instruments channels.
- std::vector<InstrumentChannel*>::iterator ic = parser.channellist.begin();
- while(ic != parser.channellist.end()) {
- InstrumentChannel *c = *ic;
-
- std::string cname = c->name;
- if(channelmap.find(cname) != channelmap.end()) cname = channelmap[cname];
-
- for(size_t cnt = 0; cnt < kit.channels.size(); cnt++) {
- if(kit.channels[cnt].name == cname) c->num = kit.channels[cnt].num;
- }
- if(c->num == NO_CHANNEL) {
- DEBUG(kitparser, "Missing channel '%s' in instrument '%s'\n",
- c->name.c_str(), i->name().c_str());
- } else {
- /*
- DEBUG(kitparser, "Assigned channel '%s' to number %d in instrument '%s'\n",
- c->name.c_str(), c->num, i.name().c_str());
- */
- }
- ic++;
- }
-
- channelmap.clear();
-
- }
+ if(name == "instrument")
+ {
+ Instrument* i = new Instrument();
+ i->setGroup(instr_group);
+ // Instrument &i = kit.instruments[kit.instruments.size() - 1];
+ InstrumentParser parser(path + "/" + instr_file, *i);
+ parser.parse();
+ kit.instruments.push_back(i);
+
+ // Assign kit channel numbers to instruments channels.
+ std::vector<InstrumentChannel*>::iterator ic = parser.channellist.begin();
+ while(ic != parser.channellist.end())
+ {
+ InstrumentChannel* c = *ic;
+
+ std::string cname = c->name;
+ if(channelmap.find(cname) != channelmap.end())
+ {
+ cname = channelmap[cname];
+ }
+
+ for(std::size_t cnt = 0; cnt < kit.channels.size(); cnt++)
+ {
+ if(kit.channels[cnt].name == cname)
+ {
+ c->num = kit.channels[cnt].num;
+ }
+ }
+ if(c->num == NO_CHANNEL)
+ {
+ ERR(kitparser, "Missing channel '%s' in instrument '%s'\n",
+ c->name.c_str(), i->name().c_str());
+ }
+ else {
+ /*
+ DEBUG(kitparser, "Assigned channel '%s' to number %d in instrument '%s'\n",
+ c->name.c_str(), c->num, i.name().c_str());
+ */
+ }
+ ic++;
+ }
+
+ channelmap.clear();
+ }
}
-int DrumKitParser::readData(char *data, size_t size)
+int DrumKitParser::readData(std::string& data, std::size_t size)
{
- if(!fd) return -1;
- return fread(data, 1, size, fd);
+ if(!fd)
+ {
+ return -1;
+ }
+
+ data.resize(size);
+ auto nr_of_bytes_read = fread((void*)data.data(), 1, size, fd);
+ data.resize(nr_of_bytes_read);
+ return nr_of_bytes_read;
+ return fread((char*)data.c_str(), 1, size, fd);
}
-
-#ifdef TEST_DRUMKITPARSER
-//deps: drumkit.cc saxparser.cc instrument.cc sample.cc audiofile.cc channel.cc
-//cflags: $(EXPAT_CFLAGS) $(SNDFILE_CFLAGS)
-//libs: $(EXPAT_LIBS) $(SNDFILE_LIBS)
-#include "test.h"
-
-const char xml[] =
-"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-"<drumkit name=\"The Aasimonster\"\n"
-" description=\"A large deathmetal drumkit\">\n"
-" <channels>\n"
-" <channel name=\"Alesis\"/>\n"
-" <channel name=\"Kick-L\"/>\n"
-" <channel name=\"Kick-R\"/>\n"
-" <channel name=\"SnareTop\"/>\n"
-" <channel name=\"SnareTrigger\"/>\n"
-" <channel name=\"SnareBottom\"/>\n"
-" <channel name=\"OH-L\"/>\n"
-" <channel name=\"OH-R\"/>\n"
-" <channel name=\"Hihat\"/>\n"
-" <channel name=\"Ride\"/>\n"
-" <channel name=\"Tom1\"/>\n"
-" <channel name=\"Tom2\"/>\n"
-" <channel name=\"Tom3\"/>\n"
-" <channel name=\"Tom4\"/>\n"
-" <channel name=\"Amb-R\"/>\n"
-" <channel name=\"Amb-L\"/>\n"
-" </channels>\n"
-" <instruments>\n"
-" <instrument name=\"Ride\" file=\"ride.xml\">\n"
-" <channelmap in=\"Alesis\" out=\"Alesis\" gain=\"1.5\"/>\n"
-" <channelmap in=\"Kick-L\" out=\"Kick-L\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Kick-R\" out=\"Kick-R\"/>\n"
-" <channelmap in=\"SnareTop\" out=\"SnareTop\" gain=\"0.5\"/>\n"
-" <channelmap in=\"SnareTrigger\" out=\"SnareTrigger\" gain=\"0.5\"/>\n"
-" <channelmap in=\"SnareBottom\" out=\"SnareBottom\" gain=\"0.5\"/>\n"
-" <channelmap in=\"OH-L\" out=\"OH-L\"/>\n"
-" <channelmap in=\"OH-R\" out=\"OH-R\"/>\n"
-" <channelmap in=\"Hihat\" out=\"Hihat\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Ride\" out=\"Ride\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom1\" out=\"Tom1\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom2\" out=\"Tom2\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom3\" out=\"Tom3\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom4\" out=\"Tom4\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Amb-R\" out=\"Amb-R\"/>\n"
-" <channelmap in=\"Amb-L\" out=\"Amb-L\"/>\n"
-" </instrument>\n"
-" <instrument name=\"Snare\" file=\"snare.xml\">\n"
-" <channelmap in=\"Alesis\" out=\"Alesis\" gain=\"1.5\"/>\n"
-" <channelmap in=\"Kick-L\" out=\"Kick-L\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Kick-R\" out=\"Kick-R\"/>\n"
-" <channelmap in=\"SnareTop\" out=\"SnareTop\" gain=\"0.5\"/>\n"
-" <channelmap in=\"SnareTrigger\" out=\"SnareTrigger\" gain=\"0.5\"/>\n"
-" <channelmap in=\"SnareBottom\" out=\"SnareBottom\" gain=\"0.5\"/>\n"
-" <channelmap in=\"OH-L\" out=\"OH-L\"/>\n"
-" <channelmap in=\"OH-R\" out=\"OH-R\"/>\n"
-" <channelmap in=\"Hihat\" out=\"Hihat\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Ride\" out=\"Ride\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom1\" out=\"Tom1\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom2\" out=\"Tom2\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom3\" out=\"Tom3\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Tom4\" out=\"Tom4\" gain=\"0.5\"/>\n"
-" <channelmap in=\"Amb-R\" out=\"Amb-R\"/>\n"
-" <channelmap in=\"Amb-L\" out=\"Amb-L\"/>\n"
-" </instrument>\n"
-" </instruments>\n"
-"</drumkit>\n"
- ;
-
-#define FNAME "/tmp/drumkittest.xml"
-
-TEST_BEGIN;
-
-FILE *fp = fopen(FNAME, "w");
-fprintf(fp, "%s", xml);
-fclose(fp);
-
-DrumKit kit;
-DrumKitParser p(FNAME, kit);
-TEST_EQUAL_INT(p.parse(), 0, "Parsing went well?");
-
-TEST_EQUAL_STR(kit.name(), "The Aasimonster", "Compare name");
-TEST_EQUAL_INT(kit.instruments.size(), 2, "How many instruments?");
-
-unlink(FNAME);
-
-TEST_END;
-
-#endif/*TEST_DRUMKITPARSER*/