X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_audio_import.cc;h=6200a6f98ff42f6fbb0b8f3dce3fe72345535057;hb=000281e4d039436f022d09f989d08babe0d5f2de;hp=9b781d2d9b51caed76766842b9cec3a4c1e9109f;hpb=e54d71ec3debd5fd20936bdc3613577f816bb55c;p=ardour.git diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 9b781d2d9b..6200a6f98f 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -84,7 +84,7 @@ Editor::add_external_audio_action (ImportMode mode_hint) msg.run (); return; } - + if (sfbrowser == 0) { sfbrowser = new SoundFileOmega (*this, _("Add Existing Media"), _session, 0, true, mode_hint); } else { @@ -98,7 +98,8 @@ void Editor::external_audio_dialog () { vector paths; - uint32_t track_cnt; + uint32_t audio_track_cnt; + uint32_t midi_track_cnt; if (_session == 0) { MessageDialog msg (_("You can't import or embed an audiofile until you have a session loaded.")); @@ -106,22 +107,32 @@ Editor::external_audio_dialog () return; } - track_cnt = 0; + audio_track_cnt = 0; + midi_track_cnt = 0; for (TrackSelection::iterator x = selection->tracks.begin(); x != selection->tracks.end(); ++x) { AudioTimeAxisView* atv = dynamic_cast(*x); - if (!atv) { - continue; - } else if (atv->is_audio_track()) { - track_cnt++; + if (atv) { + if (atv->is_audio_track()) { + audio_track_cnt++; + } + + } else { + MidiTimeAxisView* mtv = dynamic_cast(*x); + + if (mtv) { + if (mtv->is_midi_track()) { + midi_track_cnt++; + } + } } } if (sfbrowser == 0) { - sfbrowser = new SoundFileOmega (*this, _("Add Existing Media"), _session, track_cnt, true); + sfbrowser = new SoundFileOmega (*this, _("Add Existing Media"), _session, audio_track_cnt, midi_track_cnt, true); } else { - sfbrowser->reset (track_cnt); + sfbrowser->reset (audio_track_cnt, midi_track_cnt); } sfbrowser->show_all (); @@ -155,7 +166,7 @@ Editor::external_audio_dialog () for (vector::iterator x = upaths.begin(); x != upaths.end(); ++x) { paths.push_back (*x); } - + ImportPosition pos = sfbrowser->get_position (); ImportMode mode = sfbrowser->get_mode (); ImportDisposition chns = sfbrowser->get_channel_disposition (); @@ -370,7 +381,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { const int check = check_whether_and_how_to_import (*a, true); - + switch (check) { case 2: // user said skip @@ -388,36 +399,36 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode } /* have to reset this for every file we handle */ - + if (use_timestamp) { pos = -1; } ipw.show (); - + switch (chns) { case Editing::ImportDistinctFiles: - + to_import.clear (); to_import.push_back (*a); - + if (mode == Editing::ImportToTrack) { track = get_nth_selected_audio_track (nth++); } - + ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0); break; - + case Editing::ImportDistinctChannels: - + to_import.clear (); to_import.push_back (*a); - + ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0); break; - + case Editing::ImportSerializeFiles: - + to_import.clear (); to_import.push_back (*a); @@ -447,11 +458,17 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, vector to_embed; bool multi = paths.size() > 1; int nth = 0; + bool use_timestamp = (pos == -1); switch (chns) { case Editing::ImportDistinctFiles: for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { + /* have to reset this for every file we handle */ + if (use_timestamp) { + pos = -1; + } + to_embed.clear (); to_embed.push_back (*a); @@ -468,6 +485,11 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, case Editing::ImportDistinctChannels: for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { + /* have to reset this for every file we handle */ + if (use_timestamp) { + pos = -1; + } + to_embed.clear (); to_embed.push_back (*a); @@ -486,6 +508,11 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, case Editing::ImportSerializeFiles: for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { + /* have to reset this for every file we handle */ + if (use_timestamp) { + pos = -1; + } + to_embed.clear (); to_embed.push_back (*a); @@ -521,7 +548,7 @@ Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quali import_status.target_regions = target_regions; import_status.track = track; import_status.replace = replace; - + set_canvas_cursor (_cursors->wait); gdk_flush (); @@ -719,8 +746,8 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, region_name = bump_name_once (region_name, '.'); } - PropertyList plist; - + PropertyList plist; + plist.add (ARDOUR::Properties::start, 0); plist.add (ARDOUR::Properties::length, sources[0]->length (pos)); plist.add (ARDOUR::Properties::name, region_name); @@ -750,12 +777,28 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, just_one.clear (); just_one.push_back (*x); - region_name = region_name_from_path ((*x)->path(), false, false, sources.size(), n); + boost::shared_ptr fs = boost::dynamic_pointer_cast (*x); + + if (fs) { + region_name = region_name_from_path (fs->path(), false, false, sources.size(), n); + } else{ + region_name = (*x)->name(); + } + + PropertyList plist; + + /* Fudge region length to ensure it is non-zero; make it 1 beat at 120bpm + for want of a better idea. It can't be too small, otherwise if this + is a MIDI region the conversion from frames -> beats -> frames will + round it back down to 0 again. + */ + framecnt_t len = (*x)->length (pos); + if (len == 0) { + len = (60 / 120) * _session->frame_rate (); + } - PropertyList plist; - plist.add (ARDOUR::Properties::start, 0); - plist.add (ARDOUR::Properties::length, (*x)->length (pos)); + plist.add (ARDOUR::Properties::length, len); plist.add (ARDOUR::Properties::name, region_name); plist.add (ARDOUR::Properties::layer, 0); plist.add (ARDOUR::Properties::whole_file, true); @@ -790,19 +833,19 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, int n = 0; framepos_t rlen = 0; - for (vector >::iterator r = regions.begin(); r != regions.end(); ++r, ++n) { + for (vector >::iterator r = regions.begin(); r != regions.end(); ++r, ++n) { boost::shared_ptr ar = boost::dynamic_pointer_cast (*r); - + if (use_timestamp) { if (ar) { - + /* get timestamp for this region */ - + const boost::shared_ptr s (ar->sources().front()); const boost::shared_ptr as = boost::dynamic_pointer_cast (s); - + assert (as); - + if (as->natural_position() != 0) { pos = as->natural_position(); } else if (target_tracks == 1) { @@ -821,15 +864,15 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, pos = get_preferred_edit_position (); } } - + finish_bringing_in_material (*r, input_chan, output_chan, pos, mode, track); rlen = (*r)->length(); - + if (target_tracks != 1) { track.reset (); - } else { + } else { if (!use_timestamp || !ar) { /* line each one up right after the other */ pos += (*r)->length(); @@ -903,7 +946,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr region, uint32_t existing_track = mt.front(); } - + existing_track->set_name (region->name()); }