X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fimport.cc;h=d06496f684dab7701a00b09ef9b7f9e6b8dc7832;hb=9775c5c9f1b81340f3177ede038f02faed71c887;hp=36dc48e65194c8e789b425429b43a8faa101c5d4;hpb=aa4343a18c043450e00e08701676d166b6a66830;p=ardour.git diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 36dc48e651..d06496f684 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -47,7 +47,6 @@ #include "ardour/analyser.h" #include "ardour/ardour.h" -#include "ardour/audio_diskstream.h" #include "ardour/audioengine.h" #include "ardour/audioregion.h" #include "ardour/import_status.h" @@ -74,7 +73,7 @@ using namespace ARDOUR; using namespace PBD; static boost::shared_ptr -open_importable_source (const string& path, framecnt_t samplerate, ARDOUR::SrcQuality quality) +open_importable_source (const string& path, samplecnt_t samplerate, ARDOUR::SrcQuality quality) { /* try libsndfile first, because it can get BWF info from .wav, which ExtAudioFile cannot. We don't necessarily need that information in an ImportableSource, but it keeps the @@ -118,7 +117,9 @@ open_importable_source (const string& path, framecnt_t samplerate, ARDOUR::SrcQu } vector -Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& import_file_path, uint32_t channels) +Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& import_file_path, uint32_t channels, + vector const & smf_track_names) + { vector new_paths; const string basename = basename_nosuffix (import_file_path); @@ -129,13 +130,19 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo string filepath; switch (type) { - case DataType::MIDI: - if (channels > 1) { - string mchn_name = string_compose ("%1-t%2", basename, n); - filepath = new_midi_source_path (mchn_name); + case DataType::MIDI: + assert (smf_track_names.empty() || smf_track_names.size() == channels); + if (channels > 1) { + string mchn_name; + if (smf_track_names.empty() || smf_track_names[n].empty()) { + mchn_name = string_compose ("%1-t%2", basename, n); } else { - filepath = new_midi_source_path (basename); + mchn_name = string_compose ("%1-%2", basename, smf_track_names[n]); } + filepath = new_midi_source_path (mchn_name); + } else { + filepath = new_midi_source_path (basename); + } break; case DataType::AUDIO: filepath = new_audio_source_path (basename, channels, n, false, false); @@ -176,7 +183,7 @@ static bool create_mono_sources_for_writing (const vector& new_paths, Session& sess, uint32_t samplerate, vector >& newfiles, - framepos_t timeline_position) + samplepos_t timeline_position) { for (vector::const_iterator i = new_paths.begin(); i != new_paths.end(); ++i) { @@ -231,7 +238,7 @@ static void write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, vector >& newfiles) { - const framecnt_t nframes = ResampledImportableSource::blocksize; + const samplecnt_t nframes = ResampledImportableSource::blocksize; boost::shared_ptr afs; uint32_t channels = source->channels(); if (channels == 0) { @@ -265,7 +272,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, uint32_t read_count = 0; while (!status.cancel) { - framecnt_t const nread = source->read (data.get(), nframes * channels); + samplecnt_t const nread = source->read (data.get(), nframes * channels); if (nread == 0) { break; } @@ -286,11 +293,11 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, progress_base = 0.5; } - framecnt_t read_count = 0; + samplecnt_t read_count = 0; while (!status.cancel) { - framecnt_t nread, nfread; + samplecnt_t nread, nfread; uint32_t x; uint32_t chn; @@ -317,7 +324,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, for (chn = 0; chn < channels; ++chn) { - framecnt_t n; + samplecnt_t n; for (x = chn, n = 0; n < nfread; x += channels, ++n) { channel_data[chn][n] = (Sample) data[x]; } @@ -417,9 +424,9 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, smfs->append_event_beats( source_lock, - Evoral::Event( - 0, - Evoral::Beats::ticks_at_rate(t, source->ppqn()), + Evoral::Event( + Evoral::MIDI_EVENT, + Temporal::Beats::ticks_at_rate(t, source->ppqn()), size, buf)); @@ -432,9 +439,9 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, /* we wrote something */ - const framepos_t pos = 0; - const Evoral::Beats length_beats = Evoral::Beats::ticks_at_rate(t, source->ppqn()); - BeatsFramesConverter converter(smfs->session().tempo_map(), pos); + const samplepos_t pos = 0; + const Temporal::Beats length_beats = Temporal::Beats::ticks_at_rate(t, source->ppqn()); + BeatsSamplesConverter converter(smfs->session().tempo_map(), pos); smfs->update_length(pos + converter.to(length_beats.round_up_to_beat())); smfs->mark_streaming_write_completed (source_lock); @@ -484,6 +491,7 @@ Session::import_files (ImportStatus& status) boost::shared_ptr afs; boost::shared_ptr smfs; uint32_t channels = 0; + vector smf_names; status.sources.clear (); @@ -497,7 +505,7 @@ Session::import_files (ImportStatus& status) if (type == DataType::AUDIO) { try { - source = open_importable_source (*p, frame_rate(), status.quality); + source = open_importable_source (*p, sample_rate(), status.quality); channels = source->channels(); } catch (const failed_constructor& err) { error << string_compose(_("Import: cannot open input sound file \"%1\""), (*p)) << endmsg; @@ -508,12 +516,25 @@ Session::import_files (ImportStatus& status) } else { try { smf_reader = std::auto_ptr(new Evoral::SMF()); - smf_reader->open(*p); + + if (smf_reader->open(*p)) { + throw Evoral::SMF::FileError (*p); + } if (smf_reader->is_type0 () && status.split_midi_channels) { channels = smf_reader->channels().size(); } else { channels = smf_reader->num_tracks(); + switch (status.midi_track_name_source) { + case SMFTrackNumber: + break; + case SMFTrackName: + smf_reader->track_names (smf_names); + break; + case SMFInstrumentName: + smf_reader->instrument_names (smf_names); + break; + } } } catch (...) { error << _("Import: error opening MIDI file") << endmsg; @@ -527,16 +548,16 @@ Session::import_files (ImportStatus& status) continue; } - vector new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels); + vector new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels, smf_names); Sources newfiles; - framepos_t natural_position = source ? source->natural_position() : 0; + samplepos_t natural_position = source ? source->natural_position() : 0; if (status.replace_existing_source) { 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); + status.cancel = !map_existing_mono_sources (new_paths, *this, sample_rate(), newfiles, this); } else { - status.cancel = !create_mono_sources_for_writing (new_paths, *this, frame_rate(), newfiles, natural_position); + status.cancel = !create_mono_sources_for_writing (new_paths, *this, sample_rate(), newfiles, natural_position); } // copy on cancel/failure so that any files that were created will be removed below @@ -554,7 +575,7 @@ Session::import_files (ImportStatus& status) if (source) { // audio status.doing_what = compose_status_message (*p, source->samplerate(), - frame_rate(), status.current, status.total); + sample_rate(), status.current, status.total); write_audio_data_to_new_files (source.get(), status, newfiles); } else if (smf_reader.get()) { // midi status.doing_what = string_compose(_("Loading MIDI file %1"), *p);