rework AU scanning/discovery
[ardour.git] / libs / ardour / midi_patch_manager.cc
index f2d964bb77ba0acb2554a40401c5ea11ee76843e..e0638f035e510232d27e5701b5e216990451ac38 100644 (file)
@@ -29,7 +29,7 @@
 #include "ardour/session_directory.h"
 #include "ardour/midi_patch_manager.h"
 
-#include "ardour/midi_patch_search_path.h"
+#include "ardour/search_paths.h"
 
 #include "i18n.h"
 
@@ -50,6 +50,7 @@ void
 MidiPatchManager::set_session (Session* s)
 {
        SessionHandlePtr::set_session (s);
+       refresh ();
        add_session_patches ();
 }
 
@@ -68,10 +69,9 @@ MidiPatchManager::add_session_patches ()
 
        assert (Glib::file_test (path_to_patches, Glib::FILE_TEST_IS_DIR));
 
-       Glib::PatternSpec pattern(string("*.midnam"));
        vector<std::string> result;
 
-       find_matching_files_in_directory (path_to_patches, pattern, result);
+       find_files_matching_pattern (result, path_to_patches, "*.midnam");
 
        info << "Loading " << result.size() << " MIDI patches from " << path_to_patches << endmsg;
 
@@ -87,6 +87,12 @@ MidiPatchManager::add_session_patches ()
                        // build a list of all master devices from all documents
                        _master_devices_by_model[device->first] = device->second;
                        _all_models.insert(device->first);
+                       const std::string& manufacturer = device->second->manufacturer();
+                       if (_devices_by_manufacturer.find(manufacturer) == _devices_by_manufacturer.end()) {
+                               MIDINameDocument::MasterDeviceNamesList empty;
+                               _devices_by_manufacturer.insert(std::make_pair(manufacturer, empty));
+                       }
+                       _devices_by_manufacturer[manufacturer].insert(std::make_pair(device->first, device->second));
 
                        // make sure there are no double model names
                        // TODO: handle this gracefully.
@@ -102,12 +108,12 @@ MidiPatchManager::refresh()
        _documents.clear();
        _master_devices_by_model.clear();
        _all_models.clear();
+       _devices_by_manufacturer.clear();
 
        Searchpath search_path = midi_patch_search_path ();
-       Glib::PatternSpec pattern (string("*.midnam"));
        vector<std::string> result;
 
-       find_matching_files_in_search_path (search_path, pattern, result);
+       find_files_matching_pattern (result, search_path, "*.midnam");
 
        info << "Loading " << result.size() << " MIDI patches from " << search_path.to_string() << endmsg;
 
@@ -134,6 +140,12 @@ MidiPatchManager::refresh()
                        _master_devices_by_model[device->first] = device->second;
 
                        _all_models.insert(device->first);
+                       const std::string& manufacturer = device->second->manufacturer();
+                       if (_devices_by_manufacturer.find(manufacturer) == _devices_by_manufacturer.end()) {
+                               MIDINameDocument::MasterDeviceNamesList empty;
+                               _devices_by_manufacturer.insert(std::make_pair(manufacturer, empty));
+                       }
+                       _devices_by_manufacturer[manufacturer].insert(std::make_pair(device->first, device->second));
                }
        }
 
@@ -146,5 +158,8 @@ void
 MidiPatchManager::session_going_away ()
 {
        SessionHandlePtr::session_going_away ();
-       refresh ();
+       _documents.clear();
+       _master_devices_by_model.clear();
+       _all_models.clear();
+       _devices_by_manufacturer.clear();
 }