after cloning a MIDI region, mark the source file as non-removable. Fixes reports about missing MIDI files on the forums and IRC

This commit is contained in:
Paul Davis 2014-04-04 15:26:44 -04:00
parent 3e7fad52f5
commit fc691cb3ba
4 changed files with 20 additions and 2 deletions

View File

@ -82,6 +82,8 @@ public:
static PBD::Signal2<int,std::string,std::vector<std::string> > AmbiguousFileName;
virtual void prevent_deletion ();
protected:
FileSource (Session& session, DataType type,
const std::string& path,
@ -103,7 +105,6 @@ protected:
std::string _origin;
bool _open;
void prevent_deletion ();
};
} // namespace ARDOUR

View File

@ -69,6 +69,8 @@ public:
static bool safe_midi_file_extension (const std::string& path);
void prevent_deletion ();
protected:
void set_path (const std::string& newpath);

View File

@ -38,6 +38,7 @@
#include "ardour/midi_model.h"
#include "ardour/midi_state_tracker.h"
#include "ardour/midi_source.h"
#include "ardour/file_source.h"
#include "ardour/session.h"
#include "ardour/session_directory.h"
#include "ardour/source_factory.h"
@ -380,6 +381,10 @@ MidiSource::clone (const string& path, Evoral::MusicalTime begin, Evoral::Musica
} else {
newsrc->set_model (_model);
}
/* this file is not removable (but since it is MIDI, it is mutable) */
boost::dynamic_pointer_cast<FileSource> (newsrc)->prevent_deletion ();
return newsrc;
}

View File

@ -73,9 +73,10 @@ SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags)
return;
}
if (open(_path)) {
if (open (_path)) {
throw failed_constructor ();
}
_open = true;
}
@ -658,3 +659,12 @@ SMFSource::ensure_disk_file ()
}
}
void
SMFSource::prevent_deletion ()
{
/* Unlike the audio case, the MIDI file remains mutable (because we can
edit MIDI data)
*/
_flags = Flag (_flags & ~(Removable|RemovableIfEmpty|RemoveAtDestroy));
}