diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/midi_patch_manager.h | 6 | ||||
-rw-r--r-- | libs/ardour/midi_patch_manager.cc | 74 |
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; } |