From 027d0efc2d949d7d5b1bb83560d17ffca5ba60d5 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 5 Jul 2018 13:34:47 -0400 Subject: [PATCH] catch various libsmf errors rethrown as exceptions --- libs/ardour/smf_source.cc | 7 +++- libs/ardour/source_factory.cc | 62 ++++++++++++++++++++--------------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 1c994b6eb3..7da864161b 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -548,6 +548,7 @@ SMFSource::mark_midi_streaming_write_completed (const Lock& lm, Evoral::Sequence MidiSource::mark_midi_streaming_write_completed (lm, stuck_notes_option, when); if (!writable()) { + cerr << "not writable\n"; warning << string_compose ("attempt to write to unwritable SMF file %1", _path) << endmsg; return; } @@ -556,7 +557,11 @@ SMFSource::mark_midi_streaming_write_completed (const Lock& lm, Evoral::Sequence _model->set_edited(false); } - Evoral::SMF::end_write (_path); + try { + Evoral::SMF::end_write (_path); + } catch (std::exception & e) { + error << string_compose (_("Exception while writing %1, file may be corrupt/unusable"), _path) << endmsg; + } /* data in the file now, not removable */ diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index e211564408..8be55a8986 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -220,15 +220,18 @@ SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks) } } } else if (type == DataType::MIDI) { - boost::shared_ptr src (new SMFSource (s, node)); - Source::Lock lock(src->mutex()); - src->load_model (lock, true); + try { + boost::shared_ptr src (new SMFSource (s, node)); + Source::Lock lock(src->mutex()); + src->load_model (lock, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS - // boost_debug_shared_ptr_mark_interesting (src, "Source"); + // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif - src->check_for_analysis_data_on_disk (); - SourceCreated (src); - return src; + src->check_for_analysis_data_on_disk (); + SourceCreated (src); + return src; + } catch (...) { + } } return boost::shared_ptr(); @@ -289,18 +292,21 @@ SourceFactory::createExternal (DataType type, Session& s, const string& path, } else if (type == DataType::MIDI) { - boost::shared_ptr src (new SMFSource (s, path)); - Source::Lock lock(src->mutex()); - src->load_model (lock, true); + try { + boost::shared_ptr src (new SMFSource (s, path)); + Source::Lock lock(src->mutex()); + src->load_model (lock, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS - // boost_debug_shared_ptr_mark_interesting (src, "Source"); + // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif - if (announce) { - SourceCreated (src); - } + if (announce) { + SourceCreated (src); + } - return src; + return src; + } catch (...) { + } } @@ -339,22 +345,27 @@ SourceFactory::createWritable (DataType type, Session& s, const std::string& pat } else if (type == DataType::MIDI) { // XXX writable flags should belong to MidiSource too - boost::shared_ptr src (new SMFSource (s, path, SndFileSource::default_writable_flags)); - assert (src->writable ()); + try { + boost::shared_ptr src (new SMFSource (s, path, SndFileSource::default_writable_flags)); + + assert (src->writable ()); - Source::Lock lock(src->mutex()); - src->load_model (lock, true); + Source::Lock lock(src->mutex()); + src->load_model (lock, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS - // boost_debug_shared_ptr_mark_interesting (src, "Source"); + // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif - // no analysis data - this is a new file + // no analysis data - this is a new file - if (announce) { - SourceCreated (src); - } - return src; + if (announce) { + SourceCreated (src); + } + + return src; + } catch (...) { + } } return boost::shared_ptr (); @@ -455,4 +466,3 @@ SourceFactory::createFromPlaylist (DataType type, Session& s, boost::shared_ptr< return boost::shared_ptr(); } - -- 2.30.2