fix invalid mapping detection
[ardour.git] / libs / ardour / import.cc
index 1303c85511bf9bb93aebab7a63f1787e0925f9e2..0656cdca6fd1ce32466dc6d3e5cbb58d18364d03 100644 (file)
@@ -34,7 +34,7 @@
 #include <sndfile.h>
 #include <samplerate.h>
 
-#include <glib/gstdio.h>
+#include "pbd/gstdio_compat.h"
 #include <glibmm.h>
 
 #include <boost/scoped_array.hpp>
@@ -234,6 +234,9 @@ write_audio_data_to_new_files (ImportableSource* source, ImportStatus& status,
        const framecnt_t nframes = ResampledImportableSource::blocksize;
        boost::shared_ptr<AudioFileSource> afs;
        uint32_t channels = source->channels();
+       if (channels == 0) {
+               return;
+       }
 
        boost::scoped_array<float> data(new float[nframes * channels]);
        vector<boost::shared_array<Sample> > channel_data;
@@ -351,7 +354,9 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status,
 
                        boost::shared_ptr<SMFSource> smfs = boost::dynamic_pointer_cast<SMFSource> (*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;
@@ -381,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<double>(0,
-                                                             (double)t / (double)source->ppqn(),
-                                                             size,
-                                                             buf));
+                               smfs->append_event_beats(
+                                       source_lock,
+                                       Evoral::Event<Evoral::Beats>(
+                                               0,
+                                               Evoral::Beats::ticks_at_rate(t, source->ppqn()),
+                                               size,
+                                               buf));
 
                                if (status.progress < 0.99) {
                                        status.progress += 0.01;
@@ -400,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) {
@@ -481,7 +488,7 @@ Session::import_files (ImportStatus& status)
                                return;
                        }
                }
-               
+
                if (channels == 0) {
                        error << _("Import: file contains no channels.") << endmsg;
                        continue;
@@ -546,7 +553,7 @@ Session::import_files (ImportStatus& status)
                                        Analyser::queue_source_for_analysis (boost::static_pointer_cast<Source>(*x), false);
                                }
                        }
-                       
+
                        /* imported, copied files cannot be written or removed
                         */
 
@@ -584,7 +591,7 @@ Session::import_files (ImportStatus& status)
                } catch (...) {
                        error << _("Failed to remove some files after failed/cancelled import operation") << endmsg;
                }
-                               
+
        }
 
        status.done = true;