From cd0e36773992e26985bdec1f7a5341f83fa3e521 Mon Sep 17 00:00:00 2001 From: deva Date: Fri, 15 Jul 2011 13:02:33 +0000 Subject: New input/output plugin architecture. New LV2 plugin. --- src/drumkitparser.cc | 177 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 164 insertions(+), 13 deletions(-) (limited to 'src/drumkitparser.cc') diff --git a/src/drumkitparser.cc b/src/drumkitparser.cc index 499b78c..1c16574 100644 --- a/src/drumkitparser.cc +++ b/src/drumkitparser.cc @@ -29,12 +29,19 @@ #include #include -#define DIR_SEPERATOR '/' +#include "instrumentparser.h" +#include "path.h" DrumKitParser::DrumKitParser(const std::string &kitfile, DrumKit &k) : kit(k) { + // instr = NULL; + path = getPath(kitfile); + fd = fopen(kitfile.c_str(), "r"); + + printf("Parsing drumkit in %s\n", kitfile.c_str()); + if(!fd) return; } @@ -44,38 +51,93 @@ DrumKitParser::~DrumKitParser() } void DrumKitParser::startTag(std::string name, - std::map< std::string, std::string> attributes) + std::map< std::string, std::string> attr) { if(name == "drumkit") { - kit.name = attributes["name"]; - kit.description = attributes["description"]; + if(attr.find("name") != attr.end()) + kit._name = attr["name"]; + + if(attr.find("description") != attr.end()) + kit._description = attr["description"]; } if(name == "channels") {} if(name == "channel") { - // Channel *c = new Channel(attributes["name"]); - // dk->channels[attributes["name"]] = c; + if(attr.find("name") == attr.end()) { + printf("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()) { + printf("Missing name in instrument tag.\n"); + return; + } + if(attr.find("file") == attr.end()) { + printf("Missing file in instrument tag.\n"); + return; + } + Instrument i; + InstrumentParser parser(path + "/" + attr["file"], i); + parser.parse(); + kit.instruments.push_back(i);//[attr["name"]] = i; + + // Assign kit channel numbers to instruments channels. + std::vector::iterator ic = parser.channellist.begin(); + while(ic != parser.channellist.end()) { + InstrumentChannel *c = *ic; + + for(size_t cnt = 0; cnt < kit.channels.size(); cnt++) { + if(kit.channels[cnt].name == c->name) c->num = kit.channels[cnt].num; + } + if(c->num == NO_CHANNEL) { + printf("Missing channel '%s' in instrument '%s'\n", + c->name.c_str(), i.name().c_str()); + } else { + printf("Assigned channel '%s' to number %d in instrument '%s'\n", + c->name.c_str(), c->num, i.name().c_str()); + } + ic++; + } + + //instr = &kit.instruments[attr["name"]]; } - + /* if(name == "channelmap") { + if(instr == NULL) { + printf("Missing instrument.\n"); + return; + } + + if(attr.find("in") == attr.end()) { + printf("Missing 'in' in channelmap tag.\n"); + return; + } + + if(attr.find("out") == attr.end()) { + printf("Missing 'out' in channelmap tag.\n"); + return; + } + instr->channelmap[attr["in"]] = attr["out"]; } - - if(name == "midimaps") { - } - - if(name == "midimap") { - } + */ } void DrumKitParser::endTag(std::string name) { + /* + if(name == "instrument") { + instr = NULL; + } + */ } int DrumKitParser::readData(char *data, size_t size) @@ -84,3 +146,92 @@ int DrumKitParser::readData(char *data, size_t size) return fread(data, 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[] = +"\n" +"\n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +"\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*/ -- cgit v1.2.3