summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-10-30 21:24:26 +0100
committerRobin Gareus <robin@gareus.org>2016-10-30 21:24:26 +0100
commite08c80370cfcadb7400b6f342b027b6c64ed3dd0 (patch)
tree75385ae8c8b8e03dd637708cc3d81952922b84f6 /libs/ardour
parent2a0aadfd97cec15acf90deb4cfc32ae201ca69a5 (diff)
Fix midnam replacement:
Unloading before update may otherwise reset the patch to generic midi (when the current patch is no longer available)
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/midi_patch_manager.h3
-rw-r--r--libs/ardour/lv2_plugin.cc10
-rw-r--r--libs/ardour/midi_patch_manager.cc19
3 files changed, 25 insertions, 7 deletions
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<void> 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<MIDINameDocument>);
- 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<MIDINameDocument> 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<MIDINameDocument> 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;