diff options
Diffstat (limited to 'src/instrumentparser.cc')
-rw-r--r-- | src/instrumentparser.cc | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/src/instrumentparser.cc b/src/instrumentparser.cc index 45e76d8..1f3948e 100644 --- a/src/instrumentparser.cc +++ b/src/instrumentparser.cc @@ -82,6 +82,28 @@ void InstrumentParser::startTag(const std::string& name, const attr_t& attr) } } + if(name == "channels") + { + } + + if(name == "channel") + { + if(attr.find("name") == attr.end()) + { + ERR(instrparser,"Missing channel required attribute 'name'.\n"); + return; + } + + bool main = false; + if(attr.find("main") != attr.end()) + { + main = attr.at("main") == "true"; + } + + InstrumentChannel* channel = addOrGetChannel(attr.at("name")); + channel->main = main; + } + if(name == "samples") { } @@ -142,19 +164,13 @@ void InstrumentParser::startTag(const std::string& name, const attr_t& attr) filechannel = filechannel - 1; // 1-based in file but zero-based internally. - auto audio_file = std::make_unique<AudioFile>(path + "/" + attr.at("file"), filechannel); + InstrumentChannel *instrument_channel = addOrGetChannel(attr.at("channel")); - // note: memory leak! the channels are never released - // once I replaced this using unique_ptr, the channels were - // destroyed when the InstrumentParser went out of scope - // (see drumkitparser.cc, where the InstrumentParser lives in - // local scope). - // so.. we cannot replace this using smart ptr until we decided - // the ownership semantics for instances InstrumentChannel - InstrumentChannel *instrument_channel = - new InstrumentChannel(attr.at("channel")); + auto audio_file = + std::make_unique<AudioFile>(path + "/" + attr.at("file"), + filechannel, + instrument_channel->main); - channellist.push_back(instrument_channel); sample->addAudioFile(instrument_channel, audio_file.get()); // Transfer audio_file ownership to the instrument. @@ -203,7 +219,7 @@ void InstrumentParser::startTag(const std::string& name, const attr_t& attr) if(sample_ref == nullptr) { - ERR(instrparser,"Samplref pointed at non-existing sample.\n"); + ERR(instrparser,"Sampleref pointed at non-existing sample.\n"); return; } @@ -234,3 +250,21 @@ void InstrumentParser::endTag(const std::string& name) instrument.finalise(); } } + +InstrumentChannel* InstrumentParser::addOrGetChannel(const std::string& name) +{ + for(auto& channel : instrument.instrument_channels) + { + if(channel.name == name) + { + return &channel; + } + } + + instrument.instrument_channels.emplace_back(name); + InstrumentChannel& channel = instrument.instrument_channels.back(); + channel.main = true; // Ad-hoc added channels are all main by default for + // backwards compatibility. + + return &channel; +} |