diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2015-10-19 20:23:33 +1000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-10-22 11:51:03 -0400 |
commit | e93ba5330903ad3ff03da4abe88a0a09ec408df7 (patch) | |
tree | 630186b1dc4c78122ae701b6d13336a678e24785 /libs/ardour/midi_patch_manager.cc | |
parent | efc26a049063ec9b7f81ab89fbe9b8fdcfd18233 (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/ardour/midi_patch_manager.cc')
-rw-r--r-- | libs/ardour/midi_patch_manager.cc | 74 |
1 files changed, 52 insertions, 22 deletions
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; } |