X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_patch_manager.cc;h=717f290944c4bcde20c6764588979acf98cae053;hb=2d9a15087bad6dfaeedd259b2fe948627d3b5ffb;hp=a0ccbdec9edead484fe9b772d272e2ef53a49b5e;hpb=bb9cc45cd22af67ac275a5e73accbe14fee664d8;p=ardour.git diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index a0ccbdec9e..717f290944 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -18,62 +18,62 @@ $Id$ */ -#include #include -#include "pbd/compose.h" +#include + #include "pbd/file_utils.h" #include "pbd/error.h" #include "ardour/session.h" #include "ardour/session_directory.h" #include "ardour/midi_patch_manager.h" - -#include "i18n.h" +#include "ardour/midi_patch_search_path.h" using namespace std; -using namespace sigc; using namespace ARDOUR; using namespace MIDI; using namespace MIDI::Name; using namespace PBD; -using namespace PBD::sys; MidiPatchManager* MidiPatchManager::_manager = 0; -void -MidiPatchManager::set_session (Session& s) +MidiPatchManager::MidiPatchManager () { - _session = &s; - _session->GoingAway.connect (mem_fun (*this, &MidiPatchManager::drop_session)); - - refresh(); + refresh (); } void -MidiPatchManager::refresh() +MidiPatchManager::set_session (Session* s) { - _documents.clear(); - _master_devices_by_model.clear(); - _all_models.clear(); + SessionHandlePtr::set_session (s); + add_session_patches (); +} - path path_to_patches = _session->session_directory().midi_patch_path(); +void +MidiPatchManager::add_session_patches () +{ + if (!_session) { + return; + } + + std::string path_to_patches = _session->session_directory().midi_patch_path(); - if (!exists(path_to_patches)) { + if (!Glib::file_test (path_to_patches, Glib::FILE_TEST_EXISTS)) { return; } - assert(is_directory(path_to_patches)); + assert (Glib::file_test (path_to_patches, Glib::FILE_TEST_IS_DIR)); - Glib::PatternSpec pattern(Glib::ustring("*.midnam")); - vector result; + Glib::PatternSpec pattern(string("*.midnam")); + vector result; - find_matching_files_in_directory(path_to_patches, pattern, result); + find_matching_files_in_directory (path_to_patches, pattern, result); - cerr << "Loading " << result.size() << " MIDI patches from " << path_to_patches.to_string() << endl; + info << "Loading " << result.size() << " MIDI patches from " << path_to_patches << endmsg; - for (vector::iterator i = result.begin(); i != result.end(); ++i) { - boost::shared_ptr document(new MIDINameDocument(i->to_string())); + for (vector::iterator i = result.begin(); i != result.end(); ++i) { + boost::shared_ptr document(new MIDINameDocument(*i)); for (MIDINameDocument::MasterDeviceNamesList::const_iterator device = document->master_device_names_by_model().begin(); device != document->master_device_names_by_model().end(); @@ -83,7 +83,7 @@ MidiPatchManager::refresh() _documents[device->first] = document; // build a list of all master devices from all documents _master_devices_by_model[device->first] = device->second; - _all_models.push_back(device->first); + _all_models.insert(device->first); // make sure there are no double model names // TODO: handle this gracefully. @@ -94,10 +94,48 @@ MidiPatchManager::refresh() } void -MidiPatchManager::drop_session () +MidiPatchManager::refresh() { - _session = 0; _documents.clear(); _master_devices_by_model.clear(); _all_models.clear(); + + SearchPath search_path = midi_patch_search_path (); + Glib::PatternSpec pattern (string("*.midnam")); + vector result; + + find_matching_files_in_search_path (search_path, pattern, result); + + info << "Loading " << result.size() << " MIDI patches from " << search_path.to_string() << endmsg; + + for (vector::iterator i = result.begin(); i != result.end(); ++i) { + boost::shared_ptr document(new MIDINameDocument(*i)); + for (MIDINameDocument::MasterDeviceNamesList::const_iterator device = + document->master_device_names_by_model().begin(); + device != document->master_device_names_by_model().end(); + ++device) { + //cerr << "got model " << device->first << endl; + // have access to the documents by model name + _documents[device->first] = document; + // build a list of all master devices from all documents + _master_devices_by_model[device->first] = device->second; + _all_models.insert(device->first); + + // make sure there are no double model names + // TODO: handle this gracefully. + assert(_documents.count(device->first) == 1); + assert(_master_devices_by_model.count(device->first) == 1); + } + } + + if (_session) { + add_session_patches (); + } +} + +void +MidiPatchManager::session_going_away () +{ + SessionHandlePtr::session_going_away (); + refresh (); }