X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fimport.cc;h=90a15c9e78defd73ae21151d2bbcc754aa673812;hb=d263cf7ded76d510addd90b036befd4bb7eea9d1;hp=e86e500ed93ff6d12308e5c8db4b289a749c5aee;hpb=23e7cf10191270d70357ccf0ed9294f020c7b7ab;p=ardour.git diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index e86e500ed9..90a15c9e78 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -130,7 +130,12 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo switch (type) { case DataType::MIDI: - filepath = new_midi_source_path (basename); + if (channels > 1) { + string mchn_name = string_compose ("%1-t%2", basename, 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); @@ -229,6 +234,9 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, const framecnt_t nframes = ResampledImportableSource::blocksize; boost::shared_ptr afs; uint32_t channels = source->channels(); + if (channels == 0) { + return; + } boost::scoped_array data(new float[nframes * channels]); vector > channel_data; @@ -346,7 +354,9 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, boost::shared_ptr smfs = boost::dynamic_pointer_cast (*s); - smfs->drop_model (); + Glib::Threads::Mutex::Lock source_lock(smfs->mutex()); + + smfs->drop_model (source_lock); source->seek_to_track (i); uint64_t t = 0; @@ -376,15 +386,17 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, } if (first) { - smfs->mark_streaming_write_started (); + smfs->mark_streaming_write_started (source_lock); first = false; } - smfs->append_event_unlocked_beats( - Evoral::Event(0, - (double)t / (double)source->ppqn(), - size, - buf)); + smfs->append_event_beats( + source_lock, + Evoral::Event( + 0, + Evoral::Beats::ticks_at_rate(t, source->ppqn()), + size, + buf)); if (status.progress < 0.99) { status.progress += 0.01; @@ -395,24 +407,24 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, /* we wrote something */ - const framepos_t pos = 0; - const double length_beats = ceil(t / (double)source->ppqn()); + 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); - smfs->update_length(pos + converter.to(length_beats)); - smfs->mark_streaming_write_completed (); + smfs->update_length(pos + converter.to(length_beats.round_up_to_beat())); + smfs->mark_streaming_write_completed (source_lock); if (status.cancel) { break; } } else { - warning << string_compose (_("Track %1 of %2 contained no usable MIDI data"), i, source->file_path()) << endmsg; + info << string_compose (_("Track %1 of %2 contained no usable MIDI data"), i, source->num_tracks()) << endmsg; } ++s; // next source } - } catch (...) { - error << string_compose (_("MIDI file %1 was not readable (no reason available)"), source->file_path()) << endmsg; + } catch (exception& e) { + error << string_compose (_("MIDI file could not be written (best guess: %1)"), e.what()) << endmsg; } if (buf) { @@ -425,6 +437,8 @@ remove_file_source (boost::shared_ptr source) { boost::shared_ptr fs = boost::dynamic_pointer_cast (source); + fs->DropReferences (); + if (fs) { ::g_unlink (fs->path().c_str()); }