diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-04-02 21:59:14 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-04-02 21:59:14 +0000 |
commit | 05d88018128bbcfd8e7510e9a9f0b99a1ff6f5d1 (patch) | |
tree | dd38769d808846f14faa3ab858a9623c80a17a1d /libs/ardour/import.cc | |
parent | 9ca4623451eb6a6ae9690b9990fbc61e2c99d95c (diff) |
fix import of multi-track SMF files with some tracks containing only meta-events; correctly push error to log window when MIDI import fails; remove debug msg
git-svn-id: svn://localhost/ardour2/branches/3.0@9271 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/import.cc')
-rw-r--r-- | libs/ardour/import.cc | 124 |
1 files changed, 71 insertions, 53 deletions
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index deba3efb05..5dbc146291 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -373,71 +373,88 @@ write_midi_data_to_new_files (Evoral::SMF* source, ImportStatus& status, vector<boost::shared_ptr<Source> >& newfiles) { uint32_t buf_size = 4; - uint8_t* buf = (uint8_t*)malloc(buf_size); + uint8_t* buf = (uint8_t*) malloc (buf_size); status.progress = 0.0f; - try { - - for (unsigned i = 1; i <= source->num_tracks(); ++i) { - boost::shared_ptr<SMFSource> smfs = boost::dynamic_pointer_cast<SMFSource>(newfiles[i-1]); - smfs->drop_model(); + assert (newfiles.size() == source->num_tracks()); - source->seek_to_track(i); + try { + vector<boost::shared_ptr<Source> >::iterator s = newfiles.begin(); + + for (unsigned i = 1; i <= source->num_tracks(); ++i) { - uint64_t t = 0; - uint32_t delta_t = 0; - uint32_t size = 0; - bool first = true; + boost::shared_ptr<SMFSource> smfs = boost::dynamic_pointer_cast<SMFSource> (*s); - while (!status.cancel) { - gint ignored; // imported files either don't have NoteID's or - // we ignore them. - - size = buf_size; + smfs->drop_model (); + source->seek_to_track (i); - int ret = source->read_event(&delta_t, &size, &buf, &ignored); - if (size > buf_size) - buf_size = size; - - if (ret < 0) { // EOT - break; - } - - t += delta_t; - - if (ret == 0) { // Meta - continue; - } + uint64_t t = 0; + uint32_t delta_t = 0; + uint32_t size = 0; + bool first = true; - if (first) { - smfs->mark_streaming_write_started (); - first = false; + while (!status.cancel) { + gint note_id_ignored; // imported files either don't have NoteID's or we ignore them. + + size = buf_size; + + int ret = source->read_event (&delta_t, &size, &buf, ¬e_id_ignored); + + if (size > buf_size) { + buf_size = size; + } + + if (ret < 0) { // EOT + break; + } + + t += delta_t; + + if (ret == 0) { // Meta + continue; + } + + if (first) { + smfs->mark_streaming_write_started (); + first = false; + } + + 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; + } } - - 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; - } - - const framepos_t pos = 0; - const double length_beats = ceil(t / (double)source->ppqn()); - BeatsFramesConverter converter(smfs->session().tempo_map(), pos); - smfs->update_length(pos, converter.to(length_beats)); - smfs->mark_streaming_write_completed (); - - if (status.cancel) { - break; - } - } + + if (!first) { + + /* we wrote something */ + + const framepos_t pos = 0; + const double length_beats = ceil(t / (double)source->ppqn()); + BeatsFramesConverter converter(smfs->session().tempo_map(), pos); + smfs->update_length(pos, converter.to(length_beats)); + smfs->mark_streaming_write_completed (); + + if (status.cancel) { + break; + } + } + + ++s; // next source + } } catch (...) { - error << "Corrupt MIDI file " << source->file_path() << endl; + error << "Corrupt MIDI file " << source->file_path() << endmsg; } + + if (buf) { + free (buf); + } } static void @@ -498,6 +515,7 @@ Session::import_audiofiles (ImportStatus& status) Sources newfiles; framepos_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); |