diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-04-28 10:37:17 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-04-28 10:37:17 -0400 |
commit | f5276a104c2d544cf537db9e9b8de9022de7ad56 (patch) | |
tree | f3beefb305a8364fd9603f32ef7129e6f4fe9768 /libs | |
parent | 16a8762dd494adb68756b8d549f349ed7bdccd9b (diff) |
add new SMFSource constructor to be used for existing-external files. Fixes #5919. Needs merging with CC
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/smf_source.h | 6 | ||||
-rw-r--r-- | libs/ardour/smf_source.cc | 33 | ||||
-rw-r--r-- | libs/ardour/source_factory.cc | 2 |
3 files changed, 38 insertions, 3 deletions
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index 2e6ebc0650..9c0a78f282 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -36,9 +36,11 @@ template<typename T> class MidiRingBuffer; /** Standard Midi File (Type 0) Source */ class SMFSource : public MidiSource, public FileSource, public Evoral::SMF { public: + /** Constructor for new internal-to-session files */ + SMFSource (Session& session, const std::string& path, Source::Flag flags); + /** Constructor for existing external-to-session files */ - SMFSource (Session& session, const std::string& path, - Source::Flag flags = Source::Flag(0)); + SMFSource (Session& session, const std::string& path); /** Constructor for existing in-session files */ SMFSource (Session& session, const XMLNode&, bool must_exist = false); diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 90e50e6f44..d52923c302 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -82,6 +82,39 @@ SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags) _open = true; } +/** Constructor used for external-to-session files. File must exist. */ +SMFSource::SMFSource (Session& s, const string& path) + : Source(s, DataType::MIDI, path, Source::Flag (0)) + , MidiSource(s, path, Source::Flag (0)) + , FileSource(s, DataType::MIDI, path, string(), Source::Flag (0)) + , Evoral::SMF() + , _last_ev_time_beats(0.0) + , _last_ev_time_frames(0) + , _smf_last_read_end (0) + , _smf_last_read_time (0) +{ + /* note that origin remains empty */ + + if (init (_path, false)) { + throw failed_constructor (); + } + + assert (Glib::file_test (_path, Glib::FILE_TEST_EXISTS)); + existence_check (); + + /* file is not opened until write */ + + if (_flags & Writable) { + return; + } + + if (open (_path)) { + throw failed_constructor (); + } + + _open = true; +} + /** Constructor used for existing internal-to-session files. */ SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist) : Source(s, node) diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index 0729f21592..391b205a94 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -272,7 +272,7 @@ SourceFactory::createExternal (DataType type, Session& s, const string& path, } else if (type == DataType::MIDI) { - boost::shared_ptr<SMFSource> src (new SMFSource (s, path, SMFSource::Flag(0))); + boost::shared_ptr<SMFSource> src (new SMFSource (s, path)); src->load_model (true, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS // boost_debug_shared_ptr_mark_interesting (src, "Source"); |