diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2020-01-05 17:51:18 -0700 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2020-01-05 17:58:54 -0700 |
commit | ece18d30834c79da70b73a2f801021343edfeb11 (patch) | |
tree | 68895e9bd6cdba29be0aa425dab401a02a4e78c3 /libs/ardour/midi_patch_manager.cc | |
parent | 5ff8e260ff156d4f4023f831eb054ce95df17d50 (diff) |
use glibmm threads for the midnam load thread, instead of raw pthreads (for portability)
Diffstat (limited to 'libs/ardour/midi_patch_manager.cc')
-rw-r--r-- | libs/ardour/midi_patch_manager.cc | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index 9a5f45029b..b208920603 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -45,10 +45,19 @@ MidiPatchManager* MidiPatchManager::_manager = 0; MidiPatchManager::MidiPatchManager () : no_patch_changed_messages (false) + , stop_thread (false) { add_search_path (midi_patch_search_path ()); } +MidiPatchManager::~MidiPatchManager () +{ + _manager = 0; + + stop_thread = true; + _midnam_load_thread->join (); +} + void MidiPatchManager::add_search_path (const Searchpath& search_path) { @@ -116,6 +125,9 @@ MidiPatchManager::add_midnam_files_from_directory(const std::string& directory_p 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) { + if (stop_thread) { + break; + } load_midi_name_document (*i); } } @@ -142,8 +154,8 @@ MidiPatchManager::remove_midnam_files_from_directory(const std::string& director find_files_matching_pattern (result, directory_path, "*.midnam"); info << string_compose( - P_("Unloading %1 MIDI patch from %2", "Unloading %1 MIDI patches from %2", result.size()), - result.size(), directory_path) + P_("Unloading %1 MIDI patch from %2", "Unloading %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) { @@ -181,7 +193,7 @@ MidiPatchManager::add_midi_name_document (boost::shared_ptr<MIDINameDocument> do { bool added = false; for (MIDINameDocument::MasterDeviceNamesList::const_iterator device = - document->master_device_names_by_model().begin(); + document->master_device_names_by_model().begin(); device != document->master_device_names_by_model().end(); ++device) { if (_documents.find(device->first) != _documents.end()) { @@ -202,7 +214,7 @@ MidiPatchManager::add_midi_name_document (boost::shared_ptr<MIDINameDocument> do _devices_by_manufacturer.insert(std::make_pair(manufacturer, empty)); } _devices_by_manufacturer[manufacturer].insert( - std::make_pair(device->first, device->second)); + std::make_pair(device->first, device->second)); added = true; // TODO: handle this gracefully. @@ -231,7 +243,7 @@ MidiPatchManager::remove_midi_name_document (const std::string& file_path, bool _documents.erase(i++); for (MIDINameDocument::MasterDeviceNamesList::const_iterator device = - document->master_device_names_by_model().begin(); + document->master_device_names_by_model().begin(); device != document->master_device_names_by_model().end(); ++device) { @@ -254,14 +266,6 @@ 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 () { @@ -278,14 +282,14 @@ MidiPatchManager::load_midnams () 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); + _midnam_load_thread = Glib::Threads::Thread::create (sigc::mem_fun (*this, &MidiPatchManager::load_midnams)); } void |