REGISTER_CLASS_ENUM (Source, RemoveAtDestroy);
REGISTER_CLASS_ENUM (Source, NoPeakFile);
REGISTER_CLASS_ENUM (Source, Destructive);
+ REGISTER_CLASS_ENUM (Source, Empty);
REGISTER_BITS (_Source_Flag);
REGISTER_ENUM (FadeLinear);
return boost::shared_ptr<MidiSource>();
}
- const string path = new_midi_source_path (name);
+ /* MIDI files are small, just put them in the first location of the
+ session source search path.
+ */
+
+ const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
return boost::dynamic_pointer_cast<SMFSource> (
SourceFactory::createWritable (
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) {
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 ();
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) */
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&
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 ();
if (!_open) {
open_for_write ();
}
-
- /* Flush, which will definitely put something on disk */
- flush_midi ();
}
}