From 9a19da77e34df3eddbfaf49c42582e9dc832a5ff Mon Sep 17 00:00:00 2001 From: Hans Baier Date: Tue, 9 Oct 2012 03:17:15 +0000 Subject: [PATCH] fix insidious bugs in midnam_patch.cc which account for garbled data git-svn-id: svn://localhost/ardour2/branches/3.0@13219 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/instrument_info.cc | 13 +++++++++---- libs/midi++2/midnam_patch.cc | 13 ++++++++----- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/libs/ardour/instrument_info.cc b/libs/ardour/instrument_info.cc index 282c21705e..8bae716f4a 100644 --- a/libs/ardour/instrument_info.cc +++ b/libs/ardour/instrument_info.cc @@ -45,6 +45,7 @@ InstrumentInfo::~InstrumentInfo () { } + void InstrumentInfo::set_external_instrument (const string& model, const string& mode) { @@ -114,10 +115,14 @@ InstrumentInfo::get_patches (uint8_t channel) return plugin_programs_to_channel_name_set (p); } - return MidiPatchManager::instance().find_channel_name_set (external_instrument_model, - external_instrument_mode, - channel); - + boost::shared_ptr channel_name_set = + MidiPatchManager::instance().find_channel_name_set (external_instrument_model, + external_instrument_mode, + channel); + + //std::cerr << "got channel name set with name '" << channel_name_set->name() << std::endl; + + return channel_name_set; } boost::shared_ptr diff --git a/libs/midi++2/midnam_patch.cc b/libs/midi++2/midnam_patch.cc index 59fba49ded..2d5ee9973d 100644 --- a/libs/midi++2/midnam_patch.cc +++ b/libs/midi++2/midnam_patch.cc @@ -44,8 +44,11 @@ Patch::Patch (std::string name, uint8_t p_number, uint16_t b_number) int initialize_primary_key_from_commands (PatchPrimaryKey& id, const XMLNode* node) { + id.bank_number = 0; + const XMLNodeList events = node->children(); for (XMLNodeList::const_iterator i = events.begin(); i != events.end(); ++i) { + XMLNode* node = *i; if (node->name() == "ControlChange") { string control = node->property("Control")->value(); @@ -53,13 +56,12 @@ int initialize_primary_key_from_commands (PatchPrimaryKey& id, const XMLNode* no string value = node->property("Value")->value(); assert(value != ""); - id.bank_number = 0; - if (control == "0") { - id.bank_number |= (PBD::atoi (value)<<7); + id.bank_number |= (PBD::atoi (value)) << 7; } else if (control == "32") { id.bank_number |= PBD::atoi (value); } + } else if (node->name() == "ProgramChange") { string number = node->property("Number")->value(); assert(number != ""); @@ -333,13 +335,14 @@ ChannelNameSet::set_state (const XMLTree& tree, const XMLNode& node) { assert(node.name() == "ChannelNameSet"); _name = node.property("Name")->value(); + const XMLNodeList children = node.children(); for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) { XMLNode* node = *i; assert(node); if (node->name() == "AvailableForChannels") { boost::shared_ptr channels = - tree.find("//AvailableChannel[@Available = 'true']/@Channel"); + tree.find("//AvailableChannel[@Available = 'true']/@Channel", node); for(XMLSharedNodeList::const_iterator i = channels->begin(); i != channels->end(); ++i) { @@ -372,7 +375,7 @@ CustomDeviceMode::set_state(const XMLTree& tree, const XMLNode& a_node) _name = a_node.property("Name")->value(); boost::shared_ptr channel_name_set_assignments = - tree.find("//ChannelNameSetAssign"); + tree.find("//ChannelNameSetAssign", (XMLNode *)&a_node); for(XMLSharedNodeList::const_iterator i = channel_name_set_assignments->begin(); i != channel_name_set_assignments->end(); ++i) { -- 2.30.2