From 85d9fa3b25b00f36f9bcbf25af4a087775ee9671 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 19 Jan 2013 21:31:21 +0000 Subject: Gracefully handle errors parsing midnam documents instead of crashing. git-svn-id: svn://localhost/ardour2/branches/3.0@13904 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/midi_patch_manager.cc | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'libs/ardour/midi_patch_manager.cc') diff --git a/libs/ardour/midi_patch_manager.cc b/libs/ardour/midi_patch_manager.cc index 717f290944..4bced4e46d 100644 --- a/libs/ardour/midi_patch_manager.cc +++ b/libs/ardour/midi_patch_manager.cc @@ -30,6 +30,8 @@ #include "ardour/midi_patch_manager.h" #include "ardour/midi_patch_search_path.h" +#include "i18n.h" + using namespace std; using namespace ARDOUR; using namespace MIDI; @@ -109,22 +111,28 @@ MidiPatchManager::refresh() 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)); + boost::shared_ptr document; + try { + document = boost::shared_ptr(new MIDINameDocument(*i)); + } catch (...) { + error << "Error parsing MIDI patch file " << *i << endmsg; + continue; + } 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 + document->master_device_names_by_model().begin(); + device != document->master_device_names_by_model().end(); + ++device) { + if (_documents.find(device->first) != _documents.end()) { + warning << string_compose(_("Duplicate MIDI device `%1' in `%2' ignored"), + device->first, *i) + << endmsg; + continue; + } + + _documents[device->first] = document; _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); + _all_models.insert(device->first); } } -- cgit v1.2.3