X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_patch_manager.cc;h=ab93b173066d46a71cb70c6921a3c5ddf7d1b077;hb=3e923470576d2867062d2b62291064cccc4dfe0f;hp=8a6d8dfd100a5a88be14a8bfc47b6cb076b5e250;hpb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;p=ardour.git diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index 8a6d8dfd10..ab93b17306 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -68,6 +68,35 @@ MidiPatchManager::add_search_path (const Searchpath& search_path) } } +bool +MidiPatchManager::add_custom_midnam (const std::string& id, const std::string& midnam) +{ + boost::shared_ptr document; + document = boost::shared_ptr(new MIDINameDocument()); + XMLTree mxml; + if (mxml.read_buffer (midnam, true)) { + if (0 == document->set_state (mxml, *mxml.root())) { + document->set_file_path ("custom:" + id); + add_midi_name_document (document); + return true; + } + } + return false; +} + +bool +MidiPatchManager::remove_custom_midnam (const std::string& id) +{ + return remove_midi_name_document ("custom:" + id); +} + +bool +MidiPatchManager::update_custom_midnam (const std::string& id, const std::string& midnam) +{ + remove_midi_name_document ("custom:" + id, false); + return add_custom_midnam (id, midnam); +} + void MidiPatchManager::add_midnam_files_from_directory(const std::string& directory_path) { @@ -80,7 +109,7 @@ MidiPatchManager::add_midnam_files_from_directory(const std::string& directory_p << endmsg; for (vector::const_iterator i = result.begin(); i != result.end(); ++i) { - add_midi_name_document (*i); + load_midi_name_document (*i); } } @@ -116,7 +145,7 @@ MidiPatchManager::remove_midnam_files_from_directory(const std::string& director } bool -MidiPatchManager::add_midi_name_document (const std::string& file_path) +MidiPatchManager::load_midi_name_document (const std::string& file_path) { boost::shared_ptr document; try { @@ -127,6 +156,23 @@ MidiPatchManager::add_midi_name_document (const std::string& file_path) << endmsg; return false; } + return add_midi_name_document (document); +} + +boost::shared_ptr +MidiPatchManager::document_by_model(std::string model_name) const +{ + MidiNameDocuments::const_iterator i = _documents.find (model_name); + if (i != _documents.end ()) { + return i->second; + } + return boost::shared_ptr (); +} + +bool +MidiPatchManager::add_midi_name_document (boost::shared_ptr document) +{ + bool added = false; for (MIDINameDocument::MasterDeviceNamesList::const_iterator device = document->master_device_names_by_model().begin(); device != document->master_device_names_by_model().end(); @@ -134,7 +180,7 @@ MidiPatchManager::add_midi_name_document (const std::string& file_path) if (_documents.find(device->first) != _documents.end()) { warning << string_compose(_("Duplicate MIDI device `%1' in `%2' ignored"), device->first, - file_path) << endmsg; + document->file_path()) << endmsg; continue; } @@ -151,15 +197,20 @@ MidiPatchManager::add_midi_name_document (const std::string& file_path) _devices_by_manufacturer[manufacturer].insert( std::make_pair(device->first, device->second)); + added = true; // TODO: handle this gracefully. assert(_documents.count(device->first) == 1); assert(_master_devices_by_model.count(device->first) == 1); } - return true; + + if (added) { + PatchesChanged(); /* EMIT SIGNAL */ + } + return added; } bool -MidiPatchManager::remove_midi_name_document (const std::string& file_path) +MidiPatchManager::remove_midi_name_document (const std::string& file_path, bool emit_signal) { bool removed = false; for (MidiNameDocuments::iterator i = _documents.begin(); i != _documents.end();) { @@ -189,5 +240,8 @@ MidiPatchManager::remove_midi_name_document (const std::string& file_path) ++i; } } + if (removed && emit_signal) { + PatchesChanged(); /* EMIT SIGNAL */ + } return removed; }