diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2019-12-19 13:30:18 -0700 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2019-12-23 10:27:00 -0700 |
commit | 63ba8da3e12ab6a1a1a0118fbffceb3881b26a85 (patch) | |
tree | 44dfa82aa247cd930bc9570f3f90a55a70fed635 /libs/ardour/midi_patch_manager.cc | |
parent | ecdbd1df92a04c12f54493c475ee90a102c91390 (diff) |
basics of threaded MIDNAM loading
Diffstat (limited to 'libs/ardour/midi_patch_manager.cc')
-rw-r--r-- | libs/ardour/midi_patch_manager.cc | 44 |
1 files changed, 35 insertions, 9 deletions
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index 32948fcd0a..c0bdd28419 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -24,8 +24,10 @@ #include <glibmm/fileutils.h> -#include "pbd/file_utils.h" #include "pbd/error.h" +#include "pbd/file_utils.h" +#include "pbd/pthread_utils.h" +#include "pbd/unwind.h" #include "ardour/midi_patch_manager.h" @@ -42,8 +44,9 @@ using namespace PBD; MidiPatchManager* MidiPatchManager::_manager = 0; MidiPatchManager::MidiPatchManager () + : no_patch_changed_messages (false) { - add_search_path(midi_patch_search_path ()); + add_search_path (midi_patch_search_path ()); } void @@ -64,8 +67,6 @@ MidiPatchManager::add_search_path (const Searchpath& search_path) continue; } - add_midnam_files_from_directory (*i); - _search_path.add_directory (*i); } } @@ -112,10 +113,7 @@ MidiPatchManager::add_midnam_files_from_directory(const std::string& directory_p vector<std::string> result; find_files_matching_pattern (result, directory_path, "*.midnam"); - info << string_compose( - P_("Loading %1 MIDI patch from %2", "Loading %1 MIDI patches from %2", result.size()), - result.size(), directory_path) - << endmsg; + info << string_compose (P_("Loading %1 MIDI patch from %2", "Loading %1 MIDI patches from %2", result.size()), result.size(), directory_path) << endmsg; for (vector<std::string>::const_iterator i = result.begin(); i != result.end(); ++i) { load_midi_name_document (*i); @@ -212,9 +210,10 @@ MidiPatchManager::add_midi_name_document (boost::shared_ptr<MIDINameDocument> do assert(_master_devices_by_model.count(device->first) == 1); } - if (added) { + if (added && !no_patch_changed_messages) { PatchesChanged(); /* EMIT SIGNAL */ } + return added; } @@ -254,3 +253,30 @@ MidiPatchManager::remove_midi_name_document (const std::string& file_path, bool } return removed; } + +void* +MidiPatchManager::_midnam_load (void* arg) +{ + MidiPatchManager* mpm = (MidiPatchManager *) arg; + mpm->load_midnams (); + return 0; +} + +void +MidiPatchManager::load_midnams () +{ + { + PBD::Unwinder<bool> npc (no_patch_changed_messages, true); + for (Searchpath::const_iterator i = _search_path.begin(); i != _search_path.end(); ++i) { + add_midnam_files_from_directory (*i); + } + } + + PatchesChanged (); /* EMIT SIGNAL */ +} + +void +MidiPatchManager::load_midnams_in_thread () +{ + pthread_create_and_store (X_("midnam"), &_midnam_load_thread, _midnam_load, this); +} |