summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-10-19 20:23:33 +1000
committerPaul Davis <paul@linuxaudiosystems.com>2015-10-22 11:51:03 -0400
commite93ba5330903ad3ff03da4abe88a0a09ec408df7 (patch)
tree630186b1dc4c78122ae701b6d13336a678e24785 /libs
parentefc26a049063ec9b7f81ab89fbe9b8fdcfd18233 (diff)
Only parse additional Session midnam files on Session load
When loading a Session add the Session patchfiles directory to the MidiPatchManager search path and only process/parse the files for that directory rather than refreshing/reparsing all the files. Similarly for unload, just unload the devices that are from the Session specific midnam files instead of removing the path and refreshing/reparsing all the files. This will not remove the "system" midnam files as they are always added first and duplicates from the session patchfiles directory are ignored.
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/midi_patch_manager.h6
-rw-r--r--libs/ardour/midi_patch_manager.cc74
2 files changed, 56 insertions, 24 deletions
diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h
index c7154c49a6..3c10a3a149 100644
--- a/libs/ardour/ardour/midi_patch_manager.h
+++ b/libs/ardour/ardour/midi_patch_manager.h
@@ -139,9 +139,11 @@ public:
const DeviceNamesByMaker& devices_by_manufacturer() const { return _devices_by_manufacturer; }
private:
- void refresh();
-
bool add_midi_name_document(const std::string& file_path);
+ bool remove_midi_name_document(const std::string& file_path);
+
+ void add_midnam_files_from_directory(const std::string& directory_path);
+ void remove_midnam_files_from_directory(const std::string& directory_path);
private:
PBD::Searchpath _search_path;
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc
index 83a7a20c7f..8233f06353 100644
--- a/libs/ardour/midi_patch_manager.cc
+++ b/libs/ardour/midi_patch_manager.cc
@@ -47,8 +47,6 @@ MidiPatchManager::MidiPatchManager ()
void
MidiPatchManager::add_search_path (const Searchpath& search_path)
{
- bool do_refresh = false;
-
for (Searchpath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) {
if (_search_path.contains(*i)) {
@@ -64,32 +62,52 @@ MidiPatchManager::add_search_path (const Searchpath& search_path)
continue;
}
+ add_midnam_files_from_directory (*i);
+
_search_path.add_directory (*i);
- do_refresh = true;
}
+}
+
+void
+MidiPatchManager::add_midnam_files_from_directory(const std::string& directory_path)
+{
+ vector<std::string> result;
+ find_files_matching_pattern (result, directory_path, "*.midnam");
- if (do_refresh) {
- refresh();
+ info << "Loading " << result.size() << " MIDI patches from " << directory_path
+ << endmsg;
+
+ for (vector<std::string>::const_iterator i = result.begin(); i != result.end(); ++i) {
+ add_midi_name_document (*i);
}
}
void
MidiPatchManager::remove_search_path (const Searchpath& search_path)
{
- bool do_refresh = false;
-
for (Searchpath::const_iterator i = search_path.begin(); i != search_path.end(); ++i) {
if (!_search_path.contains(*i)) {
continue;
}
+ remove_midnam_files_from_directory(*i);
+
_search_path.remove_directory (*i);
- do_refresh = true;
}
+}
- if (do_refresh) {
- refresh();
+void
+MidiPatchManager::remove_midnam_files_from_directory(const std::string& directory_path)
+{
+ vector<std::string> result;
+ find_files_matching_pattern (result, directory_path, "*.midnam");
+
+ info << "Unloading " << result.size() << " MIDI patches from "
+ << directory_path << endmsg;
+
+ for (vector<std::string>::const_iterator i = result.begin(); i != result.end(); ++i) {
+ remove_midi_name_document (*i);
}
}
@@ -135,22 +153,34 @@ MidiPatchManager::add_midi_name_document (const std::string& file_path)
return true;
}
-void
-MidiPatchManager::refresh()
+bool
+MidiPatchManager::remove_midi_name_document (const std::string& file_path)
{
- _documents.clear();
- _master_devices_by_model.clear();
- _all_models.clear();
- _devices_by_manufacturer.clear();
+ bool removed = false;
+ for (MidiNameDocuments::iterator i = _documents.begin(); i != _documents.end();) {
+ if (i->second->file_path() == file_path) {
- vector<std::string> result;
+ boost::shared_ptr<MIDINameDocument> document = i->second;
- find_files_matching_pattern (result, _search_path, "*.midnam");
+ _documents.erase(i++);
- info << "Loading " << result.size() << " MIDI patches from "
- << _search_path.to_string() << endmsg;
+ for (MIDINameDocument::MasterDeviceNamesList::const_iterator device =
+ document->master_device_names_by_model().begin();
+ device != document->master_device_names_by_model().end();
+ ++device) {
- for (vector<std::string>::iterator i = result.begin(); i != result.end(); ++i) {
- add_midi_name_document (*i);
+ _master_devices_by_model.erase(device->first);
+
+ _all_models.erase(device->first);
+
+ const std::string& manufacturer = device->second->manufacturer();
+
+ _devices_by_manufacturer[manufacturer].erase(device->first);
+ }
+ removed = true;
+ } else {
+ ++i;
+ }
}
+ return removed;
}