From 499e9a5ec6db2f0d9b4a7dc23e9c99b6858328d0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 28 Aug 2014 14:01:52 -0400 Subject: tentative fix for losing (empty) MIDI files. Incomplete because testing shows issues with some workflows --- libs/ardour/smf_source.cc | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'libs/ardour/smf_source.cc') diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 1cd456ee58..be141ef192 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -71,6 +71,8 @@ SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags) assert (!Glib::file_test (_path, Glib::FILE_TEST_EXISTS)); existence_check (); + _flags = Source::Flag (_flags | Empty); + /* file is not opened until write */ if (flags & Writable) { @@ -131,12 +133,23 @@ SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist) throw failed_constructor (); } - if (init (_path, true)) { + /* we expect the file to exist, but if no MIDI data was ever added + it will have been removed at last session close. so, we don't + require it to exist if it was marked Empty. + */ + + if (init (_path, !(_flags & Source::Empty))) { throw failed_constructor (); } - assert (Glib::file_test (_path, Glib::FILE_TEST_EXISTS)); - existence_check (); + if (!(_flags & Source::Empty)) { + assert (Glib::file_test (_path, Glib::FILE_TEST_EXISTS)); + existence_check (); + } else { + assert (_flags & Source::Writable); + /* file will be opened on write */ + return; + } if (open(_path)) { throw failed_constructor (); @@ -379,6 +392,7 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event& ev) Evoral::SMF::append_event_delta(delta_time_ticks, ev.size(), ev.buffer(), event_id); _last_ev_time_beats = ev.time(); + _flags = Source::Flag (_flags & ~Empty); } /** Append an event with a timestamp in frames (framepos_t) */ @@ -425,6 +439,7 @@ SMFSource::append_event_unlocked_frames (const Evoral::Event& ev, fr Evoral::SMF::append_event_delta(delta_time_ticks, ev.size(), ev.buffer(), event_id); _last_ev_time_frames = ev.time(); + _flags = Source::Flag (_flags & ~Empty); } XMLNode& @@ -667,10 +682,12 @@ SMFSource::destroy_model () void SMFSource::flush_midi () { - if (!writable() || (writable() && !_open)) { + if (!writable() || _length_beats == 0.0) { return; } + ensure_disk_file (); + Evoral::SMF::end_write (); /* data in the file means its no longer removable */ mark_nonremovable (); @@ -702,9 +719,6 @@ SMFSource::ensure_disk_file () if (!_open) { open_for_write (); } - - /* Flush, which will definitely put something on disk */ - flush_midi (); } } -- cgit v1.2.3