diff options
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/file_source.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/smf_source.h | 9 | ||||
-rw-r--r-- | libs/ardour/plugin_insert.cc | 4 | ||||
-rw-r--r-- | libs/ardour/smf_source.cc | 44 | ||||
-rw-r--r-- | libs/ardour/source_factory.cc | 2 |
5 files changed, 59 insertions, 3 deletions
diff --git a/libs/ardour/ardour/file_source.h b/libs/ardour/ardour/file_source.h index 37a7e67d2e..c0e4fba0de 100644 --- a/libs/ardour/ardour/file_source.h +++ b/libs/ardour/ardour/file_source.h @@ -85,6 +85,9 @@ public: void existence_check (); virtual void prevent_deletion (); + void existence_check (); + virtual void prevent_deletion (); + protected: FileSource (Session& session, DataType type, const std::string& path, diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index 9d85f94352..44d965a4f6 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 LIBARDOUR_API 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); @@ -75,6 +77,9 @@ public: void ensure_disk_file (); static bool safe_midi_file_extension (const std::string& path); + static bool valid_midi_file (const std::string& path); + + void prevent_deletion (); void prevent_deletion (); diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 27cae70b62..5279a36962 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -1203,6 +1203,10 @@ PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Param _logarithmic = desc.logarithmic; _sr_dependent = desc.sr_dependent; _toggled = desc.toggled; + + if (desc.toggled) { + set_flags(Controllable::Toggle); + } } /** @param val `user' value */ diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 812e06c27b..f6168f9d9b 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -35,6 +35,7 @@ #include <glibmm/fileutils.h> #include "evoral/Control.hpp" +#include "evoral/evoral/SMF.hpp" #include "ardour/event_type_map.h" #include "ardour/midi_model.h" @@ -49,6 +50,7 @@ using namespace ARDOUR; using namespace Glib; using namespace PBD; +using namespace Evoral; /** Constructor used for new internal-to-session files. File cannot exist. */ SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags) @@ -83,6 +85,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) @@ -465,6 +500,15 @@ SMFSource::mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::Musical } bool +SMFSource::valid_midi_file (const string& file) +{ + if (safe_midi_file_extension (file) ) { + return (SMF::test (file) ); + } + return false; +} + +bool SMFSource::safe_midi_file_extension (const string& file) { static regex_t compiled_pattern; 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"); |