X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_audio_import.cc;h=76f716f091e93c27bc193fe233a5b505645a1ed3;hb=31ef417cfe7f2b51914a2c508bffa14a88c4f75a;hp=712f0c4c87bb5df450a16d4163d0beead08bde4d;hpb=4dc63966f0872efe768dad61eb9b8785d06b92d1;p=ardour.git diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 712f0c4c87..76f716f091 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -58,7 +58,7 @@ #include "mouse_cursors.h" #include "editor_cursors.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -80,7 +80,7 @@ Editor::add_external_audio_action (ImportMode mode_hint) } if (sfbrowser == 0) { - sfbrowser = new SoundFileOmega (_("Add Existing Media"), _session, 0, true, mode_hint); + sfbrowser = new SoundFileOmega (_("Add Existing Media"), _session, 0, 0, true, mode_hint); } else { sfbrowser->set_mode (mode_hint); } @@ -261,11 +261,55 @@ Editor::get_nth_selected_midi_track (int nth) const return mtv->midi_track(); } +void +Editor::import_smf_tempo_map (Evoral::SMF const & smf) +{ + if (!_session) { + return; + } + + const size_t num_tempos = smf.num_tempos (); + + if (num_tempos == 0) { + return; + } + + const framecnt_t sample_rate = _session->frame_rate (); + TempoMap new_map (sample_rate); + bool have_meter = false; + + for (size_t n = 0; n < num_tempos; ++n) { + + Evoral::SMF::Tempo* t = smf.nth_tempo (n); + assert (t); + + Tempo tempo (60 * (1000000 / t->microseconds_per_quarter_note), 4.0); + new_map.add_tempo (tempo, (t->time_pulses/smf.ppqn()) / 4.0, 0, TempoSection::Constant, MusicTime); + + Meter meter (t->numerator, t->denominator); + Timecode::BBT_Time bbt; /* 1|1|0 which is correct for the no-meter case */ + if (have_meter) { + bbt = new_map.bbt_at_beat ((t->time_pulses/smf.ppqn())); + } + new_map.add_meter (meter, t->time_pulses, bbt, 0, MusicTime); + have_meter = true; + cerr << "@ " << t->time_pulses/smf.ppqn() << " (" + << t->time_seconds << ") Add T " << tempo << " M " << meter << endl; + } + + cerr << "NEW MAP:\n"; + new_map.dump (cerr); + + _session->tempo_map() = new_map; +} + void Editor::do_import (vector paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, + MidiTrackNameSource midi_track_name_source, + MidiTempoMapDisposition smf_tempo_disposition, framepos_t& pos, ARDOUR::PluginInfoPtr instrument) { @@ -274,10 +318,30 @@ Editor::do_import (vector paths, int nth = 0; bool use_timestamp = (pos == -1); + if (smf_tempo_disposition == SMFTempoUse) { + /* Find the first MIDI file with a tempo map, and import it + before we do anything else. + */ + + for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { + Evoral::SMF smf; + if (smf.open (*a)) { + continue; + } + if (smf.num_tempos() > 0) { + import_smf_tempo_map (smf); + smf.close (); + break; + } + smf.close (); + } + } + current_interthread_info = &import_status; import_status.current = 1; import_status.total = paths.size (); import_status.all_done = false; + import_status.midi_track_name_source = midi_track_name_source; ImportProgressWindow ipw (&import_status, _("Import"), _("Cancel Import")); @@ -484,6 +548,7 @@ Editor::import_sndfiles (vector paths, import_status.freeze = false; import_status.quality = quality; import_status.replace_existing_source = replace; + import_status.split_midi_channels = (disposition == Editing::ImportDistinctChannels); import_status.mode = mode; import_status.pos = pos; @@ -507,7 +572,10 @@ Editor::import_sndfiles (vector paths, gtk_main_iteration (); } - import_status.done = true; + // wait for thread to terminate + while (!import_status.done) { + gtk_main_iteration (); + } int result = -1; @@ -707,7 +775,7 @@ Editor::add_sources (vector paths, if (use_timestamp && boost::dynamic_pointer_cast(r)) { boost::dynamic_pointer_cast(r)->special_set_position(sources[0]->natural_position()); - } + } regions.push_back (r); @@ -934,24 +1002,38 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, { if (!existing_track) { if (ar) { - list > at (_session->new_audio_track (in_chans, out_chans, Normal, 0, 1)); + list > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Normal)); if (at.empty()) { return -1; } + if (Config->get_strict_io ()) { + for (list >::iterator i = at.begin(); i != at.end(); ++i) { + (*i)->set_strict_io (true); + } + } existing_track = at.front(); } else if (mr) { list > mt ( _session->new_midi_track (ChanCount (DataType::MIDI, 1), ChanCount (DataType::MIDI, 1), - instrument, - Normal, 0, 1)); + instrument, (Plugin::PresetRecord*) 0, + (RouteGroup*) 0, + 1, + string(), + PresentationInfo::max_order)); if (mt.empty()) { return -1; } + if (Config->get_strict_io ()) { + for (list >::iterator i = mt.begin(); i != mt.end(); ++i) { + (*i)->set_strict_io (true); + } + } + // TODO set strict_io from preferences existing_track = mt.front(); } @@ -976,7 +1058,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, return -1; } - list > at (_session->new_audio_track (in_chans, out_chans, Destructive)); + list > at (_session->new_audio_track (in_chans, out_chans, 0, 1, string(), PresentationInfo::max_order, Destructive)); if (!at.empty()) { boost::shared_ptr playlist = at.front()->playlist(); boost::shared_ptr copy (RegionFactory::create (region, true)); @@ -984,6 +1066,11 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, playlist->add_region (copy, pos); _session->add_command (new StatefulDiffCommand (playlist)); } + if (Config->get_strict_io ()) { + for (list >::iterator i = at.begin(); i != at.end(); ++i) { + (*i)->set_strict_io (true); + } + } break; } }