#include "ardour/import_status.h"
#include "ardour/region_factory.h"
#include "ardour/resampled_source.h"
+#include "ardour/runtime_functions.h"
#include "ardour/session.h"
#include "ardour/session_directory.h"
#include "ardour/smf_source.h"
const DataType type = SMFSource::safe_midi_file_extension (import_file_path) ? DataType::MIDI : DataType::AUDIO;
std::string filepath = (type == DataType::MIDI)
- ? sdir.midi_path().to_string() : sdir.sound_path().to_string();
+ ? sdir.midi_path() : sdir.sound_path();
filepath = Glib::build_filename (filepath,
get_non_existent_filename (hf, type, allow_replacing, filepath, basename, n, channels));
const framepos_t pos = 0;
const double length_beats = ceil(t / (double)source->ppqn());
BeatsFramesConverter converter(smfs->session().tempo_map(), pos);
- smfs->update_length(pos, converter.to(length_beats));
+ smfs->update_length(pos + converter.to(length_beats));
smfs->mark_streaming_write_completed ();
if (status.cancel) {
static void
remove_file_source (boost::shared_ptr<Source> source)
{
- ::unlink (source->path().c_str());
+ boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
+
+ if (fs) {
+ ::unlink (fs->path().c_str());
+ }
}
// This function is still unable to cleanly update an existing source, even though
// is disabled at the GUI until the Source implementations are able to provide
// the necessary API.
void
-Session::import_audiofiles (ImportStatus& status)
+Session::import_files (ImportStatus& status)
{
typedef vector<boost::shared_ptr<Source> > Sources;
Sources all_new_sources;
/* flush the final length(s) to the header(s) */
for (Sources::iterator x = all_new_sources.begin(); x != all_new_sources.end(); ) {
+
if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(*x)) != 0) {
afs->update_header((*x)->natural_position(), *now, xnow);
afs->done_with_peakfile_writes ();
Analyser::queue_source_for_analysis (boost::static_pointer_cast<Source>(*x), false);
}
}
+
+ /* imported, copied files cannot be written or removed
+ */
+
+ boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource>(*x);
+ if (fs) {
+ fs->mark_immutable ();
+ fs->mark_nonremovable ();
+ }
/* don't create tracks for empty MIDI sources (channels) */
std::copy (all_new_sources.begin(), all_new_sources.end(), std::back_inserter(status.sources));
} else {
- // this can throw...but it seems very unlikely
- std::for_each (all_new_sources.begin(), all_new_sources.end(), remove_file_source);
+ try {
+ std::for_each (all_new_sources.begin(), all_new_sources.end(), remove_file_source);
+ } catch (...) {
+ error << _("Failed to remove some files after failed/cancelled import operation") << endmsg;
+ }
+
}
status.done = true;