From 63ba8da3e12ab6a1a1a0118fbffceb3881b26a85 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Dec 2019 13:30:18 -0700 Subject: [PATCH] basics of threaded MIDNAM loading --- libs/ardour/ardour/midi_patch_manager.h | 8 +++++ libs/ardour/midi_patch_manager.cc | 44 ++++++++++++++++++++----- libs/ardour/session_state.cc | 3 +- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/libs/ardour/ardour/midi_patch_manager.h b/libs/ardour/ardour/midi_patch_manager.h index ff8150ff17..b450fac2ea 100644 --- a/libs/ardour/ardour/midi_patch_manager.h +++ b/libs/ardour/ardour/midi_patch_manager.h @@ -146,6 +146,8 @@ public: const DeviceNamesByMaker& devices_by_manufacturer() const { return _devices_by_manufacturer; } + void load_midnams_in_thread (); + private: bool load_midi_name_document(const std::string& file_path); bool add_midi_name_document(boost::shared_ptr); @@ -161,6 +163,11 @@ private: MIDINameDocument::MasterDeviceNamesList _master_devices_by_model; DeviceNamesByMaker _devices_by_manufacturer; MasterDeviceNames::Models _all_models; + + bool no_patch_changed_messages; + pthread_t _midnam_load_thread; + static void* _midnam_load (void *); + void load_midnams (); }; } // namespace Name @@ -168,3 +175,4 @@ private: } // namespace MIDI #endif /* MIDI_PATCH_MANAGER_H_ */ + 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 -#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 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::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 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 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); +} diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index e2cda7dd05..41668052c3 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -397,9 +397,8 @@ Session::post_engine_init () ltc_tx_initialize(); - BootMessage (_("Loading MIDNAM Patch files")); - MIDI::Name::MidiPatchManager::instance().add_search_path (session_directory().midi_patch_path() ); + MIDI::Name::MidiPatchManager::instance().load_midnams_in_thread (); /* initial program change will be delivered later; see ::config_changed() */ _state_of_the_state = Clean; -- 2.30.2