diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h index aa4fda108e..5eb34dbbf4 100644 --- a/libs/ardour/ardour/midi_patch_manager.h +++ b/libs/ardour/ardour/midi_patch_manager.h @@ -60,6 +60,7 @@ public: PBD::Signal0 PatchesChanged; bool add_custom_midnam (const std::string& id, const std::string& midnam); + bool update_custom_midnam (const std::string& id, const std::string& midnam); bool remove_custom_midnam (const std::string& id); void add_search_path (const PBD::Searchpath& search_path); @@ -145,7 +146,7 @@ public: private: bool load_midi_name_document(const std::string& file_path); bool add_midi_name_document(boost::shared_ptr); - bool remove_midi_name_document(const std::string& file_path); + bool remove_midi_name_document(const std::string& file_path, bool emit_signal = true); void add_midnam_files_from_directory(const std::string& directory_path); void remove_midnam_files_from_directory(const std::string& directory_path); diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 94760dc336..eca7f0c0ef 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -982,9 +982,15 @@ LV2Plugin::read_midnam () { std::stringstream ss; ss << (void*)this; ss << unique_id(); - MIDI::Name::MidiPatchManager::instance().remove_custom_midnam (ss.str()); - rv = MIDI::Name::MidiPatchManager::instance().add_custom_midnam (ss.str(), midnam); + rv = MIDI::Name::MidiPatchManager::instance().update_custom_midnam (ss.str(), midnam); } +#ifndef NDEBUG + if (rv) { + info << string_compose(_("LV2: update midnam for plugin '%1'"), name ()) << endmsg; + } else { + warning << string_compose(_("LV2: Failed to parse midnam of plugin '%1'"), name ()) << endmsg; + } +#endif _midname_interface->free (midnam); return rv; } diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index a400eb3b77..ab93b17306 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -90,6 +90,13 @@ MidiPatchManager::remove_custom_midnam (const std::string& id) return remove_midi_name_document ("custom:" + id); } +bool +MidiPatchManager::update_custom_midnam (const std::string& id, const std::string& midnam) +{ + remove_midi_name_document ("custom:" + id, false); + return add_custom_midnam (id, midnam); +} + void MidiPatchManager::add_midnam_files_from_directory(const std::string& directory_path) { @@ -165,6 +172,7 @@ MidiPatchManager::document_by_model(std::string model_name) const bool MidiPatchManager::add_midi_name_document (boost::shared_ptr document) { + bool added = false; for (MIDINameDocument::MasterDeviceNamesList::const_iterator device = document->master_device_names_by_model().begin(); device != document->master_device_names_by_model().end(); @@ -189,17 +197,20 @@ MidiPatchManager::add_midi_name_document (boost::shared_ptr do _devices_by_manufacturer[manufacturer].insert( std::make_pair(device->first, device->second)); + added = true; // TODO: handle this gracefully. assert(_documents.count(device->first) == 1); assert(_master_devices_by_model.count(device->first) == 1); } - PatchesChanged(); /* EMIT SIGNAL */ - return true; + if (added) { + PatchesChanged(); /* EMIT SIGNAL */ + } + return added; } bool -MidiPatchManager::remove_midi_name_document (const std::string& file_path) +MidiPatchManager::remove_midi_name_document (const std::string& file_path, bool emit_signal) { bool removed = false; for (MidiNameDocuments::iterator i = _documents.begin(); i != _documents.end();) { @@ -229,7 +240,7 @@ MidiPatchManager::remove_midi_name_document (const std::string& file_path) ++i; } } - if (removed) { + if (removed && emit_signal) { PatchesChanged(); /* EMIT SIGNAL */ } return removed;