#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));
}
static bool
-create_mono_sources_for_writing (const string& origin,
- const vector<string>& new_paths,
+create_mono_sources_for_writing (const vector<string>& new_paths,
Session& sess, uint samplerate,
vector<boost::shared_ptr<Source> >& newfiles,
framepos_t timeline_position)
source = SourceFactory::createWritable (type, sess,
i->c_str(),
- origin,
false, // destructive
samplerate);
}
first = false;
}
- smfs->append_event_unlocked_beats(Evoral::Event<double>(0,
- (double)t / (double)source->ppqn(),
- size,
- buf));
+ smfs->append_event_unlocked_beats(
+ Evoral::Event<double>(0,
+ (double)t / (double)source->ppqn(),
+ size,
+ buf));
if (status.progress < 0.99) {
status.progress += 0.01;
}
} catch (...) {
- error << string_compose (_("MIDI file %1 was not readable (no reason available"), source->file_path()) << endmsg;
+ error << string_compose (_("MIDI file %1 was not readable (no reason available)"), source->file_path()) << endmsg;
}
if (buf) {
// 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;
fatal << "THIS IS NOT IMPLEMENTED YET, IT SHOULD NEVER GET CALLED!!! DYING!" << endmsg;
status.cancel = !map_existing_mono_sources (new_paths, *this, frame_rate(), newfiles, this);
} else {
- status.cancel = !create_mono_sources_for_writing (*p, new_paths, *this, frame_rate(), newfiles, natural_position);
+ status.cancel = !create_mono_sources_for_writing (new_paths, *this, frame_rate(), newfiles, natural_position);
}
// copy on cancel/failure so that any files that were created will be removed below
/* 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) {
+ /* Only audio files should be marked as
+ immutable - we may need to rewrite MIDI
+ files at any time.
+ */
+ if (boost::dynamic_pointer_cast<AudioFileSource> (fs)) {
+ fs->mark_immutable ();
+ } else {
+ fs->mark_immutable_except_write ();
+ }
+ 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;