X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=libs%2Fardour%2Fimport.cc;h=fd5d3bf98a18c36da7cf5c29abe3c73d2cc0c2ff;hb=27d06075a7cdbfbedae95035977fc2622aeadbe6;hp=38a3da2fdcf52030ca78a2582c145611df5e2b60;hpb=c1cfa12d6e5136d2e3e5501e83ff74c5009a9e60;p=ardour.git diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 38a3da2fdc..fd5d3bf98a 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -34,7 +34,7 @@ #include #include -#include +#include "pbd/gstdio_compat.h" #include #include @@ -265,14 +265,14 @@ 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); + framecnt_t const nread = source->read (data.get(), nframes * channels); if (nread == 0) { break; } - peak = compute_peak (data.get(), nread, peak); + peak = compute_peak (data.get(), nread * channels, peak); - read_count += nread; + read_count += nread / channels; status.progress = 0.5 * read_count / (source->ratio() * source->length() * channels); } @@ -294,7 +294,7 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status, uint32_t x; uint32_t chn; - if ((nread = source->read (data.get(), nframes)) == 0) { + if ((nread = source->read (data.get(), nframes * channels)) == 0) { #ifdef PLATFORM_WINDOWS /* Flush the data once we've finished importing the file. Windows can */ /* cache the data for very long periods of time (perhaps not writing */ @@ -354,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; @@ -384,14 +386,15 @@ 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( + smfs->append_event_beats( + source_lock, + Evoral::Event( 0, - Evoral::MusicalTime::ticks_at_rate(t, source->ppqn()), + Evoral::Beats::ticks_at_rate(t, source->ppqn()), size, buf)); @@ -404,24 +407,24 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, /* we wrote something */ - const framepos_t pos = 0; - const Evoral::MusicalTime length_beats = Evoral::MusicalTime::ticks_at_rate(t, source->ppqn()); - BeatsFramesConverter converter(smfs->session().tempo_map(), pos); + 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.round_up_to_beat())); - smfs->mark_streaming_write_completed (); + 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) { @@ -456,7 +459,7 @@ Session::import_files (ImportStatus& status) status.sources.clear (); - for (vector::iterator p = status.paths.begin(); + for (vector::const_iterator p = status.paths.begin(); p != status.paths.end() && !status.cancel; ++p) { @@ -485,7 +488,7 @@ Session::import_files (ImportStatus& status) return; } } - + if (channels == 0) { error << _("Import: file contains no channels.") << endmsg; continue; @@ -550,7 +553,7 @@ Session::import_files (ImportStatus& status) Analyser::queue_source_for_analysis (boost::static_pointer_cast(*x), false); } } - + /* imported, copied files cannot be written or removed */ @@ -588,7 +591,7 @@ Session::import_files (ImportStatus& status) } catch (...) { error << _("Failed to remove some files after failed/cancelled import operation") << endmsg; } - + } status.done = true;