Set playlist ID when importing to new tracks

This amends 730a0954 and b27bb586.
This also restores the original API for do_import()
and do_embed() as used by Lua scripts.

Note that this uses distinct IDs when importing both audio
and MIDI in the same DnD request.
This commit is contained in:
Robin Gareus 2021-07-08 05:24:02 +02:00
parent 2433b3059f
commit 2b066293fb
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
8 changed files with 54 additions and 54 deletions

View file

@ -4343,8 +4343,7 @@ Editor::restore_editing_space ()
bool bool
Editor::stamp_new_playlist (string &name, string &pgroup, bool copy) Editor::stamp_new_playlist (string &name, string &pgroup, bool copy)
{ {
string gid = Playlist::generate_pgroup_id(); pgroup = Playlist::generate_pgroup_id ();
pgroup = gid;
if (name.length()==0) { if (name.length()==0) {
name = _("Take.1"); name = _("Take.1");

View file

@ -456,7 +456,6 @@ public:
ARDOUR::MidiTrackNameSource mts, ARDOUR::MidiTrackNameSource mts,
ARDOUR::MidiTempoMapDisposition mtd, ARDOUR::MidiTempoMapDisposition mtd,
samplepos_t& pos, samplepos_t& pos,
std::string pgroup_id,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>(), boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>(),
bool with_markers = false bool with_markers = false
); );
@ -465,7 +464,6 @@ public:
Editing::ImportDisposition disposition, Editing::ImportDisposition disposition,
Editing::ImportMode mode, Editing::ImportMode mode,
samplepos_t& pos, samplepos_t& pos,
std::string pgroup_id,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>()); boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>());
void get_regionview_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions); void get_regionview_corresponding_to (boost::shared_ptr<ARDOUR::Region> region, std::vector<RegionView*>& regions);
@ -1395,6 +1393,7 @@ private:
int target_regions, int target_regions,
int target_tracks, int target_tracks,
boost::shared_ptr<ARDOUR::Track>& track, boost::shared_ptr<ARDOUR::Track>& track,
std::string const& pgroup_id,
bool replace, bool replace,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>()); boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>());
@ -1407,6 +1406,7 @@ private:
int target_regions, int target_regions,
int target_tracks, int target_tracks,
boost::shared_ptr<ARDOUR::Track>& track, boost::shared_ptr<ARDOUR::Track>& track,
std::string const& pgroup_id,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>()); boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>());
int add_sources (std::vector<std::string> paths, int add_sources (std::vector<std::string> paths,
@ -1417,6 +1417,7 @@ private:
int target_regions, int target_regions,
int target_tracks, int target_tracks,
boost::shared_ptr<ARDOUR::Track>& track, boost::shared_ptr<ARDOUR::Track>& track,
std::string const& pgroup_id,
bool add_channel_suffix, bool add_channel_suffix,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>()); boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>());
@ -1426,7 +1427,8 @@ private:
samplepos_t& pos, samplepos_t& pos,
Editing::ImportMode mode, Editing::ImportMode mode,
boost::shared_ptr<ARDOUR::Track>& existing_track, boost::shared_ptr<ARDOUR::Track>& existing_track,
const std::string& new_track_name, std::string const& new_track_name,
std::string const& pgroup_id,
boost::shared_ptr<ARDOUR::PluginInfo> instrument); boost::shared_ptr<ARDOUR::PluginInfo> instrument);
boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const; boost::shared_ptr<ARDOUR::AudioTrack> get_nth_selected_audio_track (int nth) const;

View file

@ -348,7 +348,6 @@ Editor::do_import (vector<string> paths,
MidiTrackNameSource midi_track_name_source, MidiTrackNameSource midi_track_name_source,
MidiTempoMapDisposition smf_tempo_disposition, MidiTempoMapDisposition smf_tempo_disposition,
samplepos_t& pos, samplepos_t& pos,
string pgroup_id,
ARDOUR::PluginInfoPtr instrument, ARDOUR::PluginInfoPtr instrument,
bool with_markers) bool with_markers)
{ {
@ -356,6 +355,7 @@ Editor::do_import (vector<string> paths,
vector<string> to_import; vector<string> to_import;
int nth = 0; int nth = 0;
bool use_timestamp = (pos == -1); bool use_timestamp = (pos == -1);
std::string const& pgroup_id = Playlist::generate_pgroup_id ();
/* XXX nutempo2: we will import markers using music (beat) time, which /* XXX nutempo2: we will import markers using music (beat) time, which
will make any imported tempo map irrelevant. Not doing that (in 6.7, will make any imported tempo map irrelevant. Not doing that (in 6.7,
@ -423,7 +423,7 @@ Editor::do_import (vector<string> paths,
if (!cancel) { if (!cancel) {
ipw.show (); ipw.show ();
import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, false, instrument); import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, pgroup_id, false, instrument);
import_status.clear(); import_status.clear();
} }
@ -469,7 +469,7 @@ Editor::do_import (vector<string> paths,
track = get_nth_selected_audio_track (nth++); track = get_nth_selected_audio_track (nth++);
} }
import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, replace, instrument); import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, pgroup_id, replace, instrument);
import_status.clear(); import_status.clear();
break; break;
@ -478,7 +478,7 @@ Editor::do_import (vector<string> paths,
to_import.clear (); to_import.clear ();
to_import.push_back (*a); to_import.push_back (*a);
import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, replace, instrument); import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, pgroup_id, replace, instrument);
import_status.clear(); import_status.clear();
break; break;
@ -487,7 +487,7 @@ Editor::do_import (vector<string> paths,
to_import.clear (); to_import.clear ();
to_import.push_back (*a); to_import.push_back (*a);
import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, replace, instrument); import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, pgroup_id, replace, instrument);
import_status.clear(); import_status.clear();
break; break;
@ -498,22 +498,15 @@ Editor::do_import (vector<string> paths,
} }
} }
#if 0 // @ben FIXME
/* track is only set if a mono file is imported to an existing track.
* track->playlist() crashes.
*
* I guess this should only be called when importing multi-channel
* files to newly created tracks. The new tracks should share
* a group ID. This can however not be done here.
*/
track->playlist()->set_pgroup_id (pgroup_id);
#endif
import_status.all_done = true; import_status.all_done = true;
} }
void void
Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode mode, samplepos_t& pos, string pgroup_id, ARDOUR::PluginInfoPtr instrument) Editor::do_embed (vector<string> paths,
ImportDisposition import_as,
ImportMode mode,
samplepos_t& pos,
ARDOUR::PluginInfoPtr instrument)
{ {
boost::shared_ptr<Track> track; boost::shared_ptr<Track> track;
bool check_sample_rate = true; bool check_sample_rate = true;
@ -521,6 +514,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode
bool multi = paths.size() > 1; bool multi = paths.size() > 1;
int nth = 0; int nth = 0;
bool use_timestamp = (pos == -1); bool use_timestamp = (pos == -1);
std::string const& pgroup_id = Playlist::generate_pgroup_id ();
switch (import_as) { switch (import_as) {
case Editing::ImportDistinctFiles: case Editing::ImportDistinctFiles:
@ -538,7 +532,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode
track = get_nth_selected_audio_track (nth++); track = get_nth_selected_audio_track (nth++);
} }
if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, -1, track, instrument) < -1) { if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, -1, track, pgroup_id, instrument) < -1) {
/* error, bail out */ /* error, bail out */
return; return;
} }
@ -556,7 +550,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode
to_embed.clear (); to_embed.clear ();
to_embed.push_back (*a); to_embed.push_back (*a);
if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, -1, -1, track, instrument) < -1) { if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, -1, -1, track, pgroup_id, instrument) < -1) {
/* error, bail out */ /* error, bail out */
return; return;
} }
@ -564,7 +558,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode
break; break;
case Editing::ImportMergeFiles: case Editing::ImportMergeFiles:
if (embed_sndfiles (paths, multi, check_sample_rate, import_as, mode, pos, 1, 1, track, instrument) < -1) { if (embed_sndfiles (paths, multi, check_sample_rate, import_as, mode, pos, 1, 1, track, pgroup_id, instrument) < -1) {
/* error, bail out */ /* error, bail out */
return; return;
} }
@ -581,7 +575,7 @@ Editor::do_embed (vector<string> paths, ImportDisposition import_as, ImportMode
to_embed.clear (); to_embed.clear ();
to_embed.push_back (*a); to_embed.push_back (*a);
if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, 1, track, instrument) < -1) { if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, 1, track, pgroup_id, instrument) < -1) {
/* error, bail out */ /* error, bail out */
return; return;
} }
@ -599,6 +593,7 @@ Editor::import_sndfiles (vector<string> paths,
int target_regions, int target_regions,
int target_tracks, int target_tracks,
boost::shared_ptr<Track>& track, boost::shared_ptr<Track>& track,
std::string const& pgroup_id,
bool replace, bool replace,
ARDOUR::PluginInfoPtr instrument) ARDOUR::PluginInfoPtr instrument)
{ {
@ -650,7 +645,7 @@ Editor::import_sndfiles (vector<string> paths,
import_status.mode, import_status.mode,
import_status.target_regions, import_status.target_regions,
import_status.target_tracks, import_status.target_tracks,
track, false, instrument track, pgroup_id, false, instrument
); );
/* update position from results */ /* update position from results */
@ -671,6 +666,7 @@ Editor::embed_sndfiles (vector<string> paths,
int target_regions, int target_regions,
int target_tracks, int target_tracks,
boost::shared_ptr<Track>& track, boost::shared_ptr<Track>& track,
std::string const& pgroup_id,
ARDOUR::PluginInfoPtr instrument) ARDOUR::PluginInfoPtr instrument)
{ {
boost::shared_ptr<AudioFileSource> source; boost::shared_ptr<AudioFileSource> source;
@ -787,7 +783,7 @@ Editor::embed_sndfiles (vector<string> paths,
} }
if (!sources.empty()) { if (!sources.empty()) {
return add_sources (paths, sources, pos, disposition, mode, target_regions, target_tracks, track, true, instrument); return add_sources (paths, sources, pos, disposition, mode, target_regions, target_tracks, track, pgroup_id, true, instrument);
} }
return 0; return 0;
@ -802,6 +798,7 @@ Editor::add_sources (vector<string> paths,
int target_regions, int target_regions,
int target_tracks, int target_tracks,
boost::shared_ptr<Track>& track, boost::shared_ptr<Track>& track,
std::string const& pgroup_id,
bool /*add_channel_suffix*/, bool /*add_channel_suffix*/,
ARDOUR::PluginInfoPtr instrument) ARDOUR::PluginInfoPtr instrument)
{ {
@ -998,7 +995,7 @@ Editor::add_sources (vector<string> paths,
} }
} }
finish_bringing_in_material (*r, input_chan, output_chan, pos, mode, track, track_names[n], instrument); finish_bringing_in_material (*r, input_chan, output_chan, pos, mode, track, track_names[n], pgroup_id, instrument);
rlen = (*r)->length(); rlen = (*r)->length();
@ -1030,7 +1027,8 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
samplepos_t& pos, samplepos_t& pos,
ImportMode mode, ImportMode mode,
boost::shared_ptr<Track>& existing_track, boost::shared_ptr<Track>& existing_track,
const string& new_track_name, string const& new_track_name,
string const& pgroup_id,
ARDOUR::PluginInfoPtr instrument) ARDOUR::PluginInfoPtr instrument)
{ {
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(region); boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(region);
@ -1083,10 +1081,11 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
if (at.empty()) { if (at.empty()) {
return -1; return -1;
} }
if (Config->get_strict_io ()) {
for (list<boost::shared_ptr<AudioTrack> >::iterator i = at.begin(); i != at.end(); ++i) { for (list<boost::shared_ptr<AudioTrack> >::iterator i = at.begin(); i != at.end(); ++i) {
if (Config->get_strict_io ()) {
(*i)->set_strict_io (true); (*i)->set_strict_io (true);
} }
(*i)->playlist()->set_pgroup_id (pgroup_id);
} }
existing_track = at.front(); existing_track = at.front();
@ -1105,7 +1104,13 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region,
return -1; return -1;
} }
// TODO set strict_io from preferences for (list<boost::shared_ptr<MidiTrack> >::iterator i = mt.begin(); i != mt.end(); ++i) {
if (Config->get_strict_io ()) {
(*i)->set_strict_io (true);
}
(*i)->playlist()->set_pgroup_id (pgroup_id);
}
existing_track = mt.front(); existing_track = mt.front();
} }

View file

@ -417,21 +417,19 @@ Editor::drop_paths_part_two (const vector<string>& paths, samplepos_t sample, do
} }
} }
string gid = Playlist::generate_pgroup_id();
std::pair<TimeAxisView*, int> const tvp = trackview_by_y_position (ypos, false); std::pair<TimeAxisView*, int> const tvp = trackview_by_y_position (ypos, false);
if (tvp.first == 0) { if (tvp.first == 0) {
/* drop onto canvas background: create new tracks */ /* drop onto canvas background: create new tracks */
InstrumentSelector is; // instantiation builds instrument-list and sets default. InstrumentSelector is; // instantiation builds instrument-list and sets default.
do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, SMFTrackName, SMFTempoIgnore, sample, gid, is.selected_instrument(), false); do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, SMFTrackName, SMFTempoIgnore, sample, is.selected_instrument(), false);
if (UIConfiguration::instance().get_only_copy_imported_files() || copy) { if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack,
SrcBest, SMFTrackName, SMFTempoIgnore, sample, gid); SrcBest, SMFTrackName, SMFTempoIgnore, sample);
} else { } else {
do_embed (audio_paths, Editing::ImportDistinctFiles, ImportAsTrack, sample, gid); do_embed (audio_paths, Editing::ImportDistinctFiles, ImportAsTrack, sample);
} }
} else if ((tv = dynamic_cast<RouteTimeAxisView*> (tvp.first)) != 0) { } else if ((tv = dynamic_cast<RouteTimeAxisView*> (tvp.first)) != 0) {
@ -443,13 +441,13 @@ Editor::drop_paths_part_two (const vector<string>& paths, samplepos_t sample, do
selection->set (tv); selection->set (tv);
do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack,
SrcBest, SMFTrackName, SMFTempoIgnore, sample, gid); SrcBest, SMFTrackName, SMFTempoIgnore, sample);
if (UIConfiguration::instance().get_only_copy_imported_files() || copy) { if (UIConfiguration::instance().get_only_copy_imported_files() || copy) {
do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack,
SrcBest, SMFTrackName, SMFTempoIgnore, sample, gid, boost::shared_ptr<PluginInfo>(), false); SrcBest, SMFTrackName, SMFTempoIgnore, sample, boost::shared_ptr<PluginInfo>(), false);
} else { } else {
do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, sample, gid); do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, sample);
} }
} }
} }

View file

@ -1026,17 +1026,15 @@ EditorRegions::drag_data_received (const RefPtr<Gdk::DragContext>& context,
return; return;
} }
string gid = Playlist::generate_pgroup_id();
if (_editor->convert_drop_to_paths (paths, context, x, y, data, info, dtime) == 0) { if (_editor->convert_drop_to_paths (paths, context, x, y, data, info, dtime) == 0) {
samplepos_t pos = 0; samplepos_t pos = 0;
bool copy = ((context->get_actions () & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY); bool copy = ((context->get_actions () & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY);
if (UIConfiguration::instance ().get_only_copy_imported_files () || copy) { if (UIConfiguration::instance ().get_only_copy_imported_files () || copy) {
_editor->do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsRegion, _editor->do_import (paths, Editing::ImportDistinctFiles, Editing::ImportAsRegion,
SrcBest, SMFTrackName, SMFTempoIgnore, pos, gid); SrcBest, SMFTrackName, SMFTempoIgnore, pos);
} else { } else {
_editor->do_embed (paths, Editing::ImportDistinctFiles, ImportAsRegion, pos, gid); _editor->do_embed (paths, Editing::ImportDistinctFiles, ImportAsRegion, pos);
} }
context->drag_finish (true, false, dtime); context->drag_finish (true, false, dtime);
} }

View file

@ -98,7 +98,8 @@ Editor::embed_audio_from_video (std::string path, samplepos_t n, bool lock_posit
ipw.show (); ipw.show ();
boost::shared_ptr<ARDOUR::Track> track; boost::shared_ptr<ARDOUR::Track> track;
bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); std::string const& gid = ARDOUR::Playlist::generate_pgroup_id ();
bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, gid, false) == 0);
if (ok && track) { if (ok && track) {
if (lock_position_to_video) { if (lock_position_to_video) {
boost::shared_ptr<ARDOUR::Playlist> pl = track->playlist(); boost::shared_ptr<ARDOUR::Playlist> pl = track->playlist();

View file

@ -261,11 +261,10 @@ public:
/** Import existing media */ /** Import existing media */
virtual void do_import (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality, virtual void do_import (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode, ARDOUR::SrcQuality,
ARDOUR::MidiTrackNameSource, ARDOUR::MidiTempoMapDisposition, samplepos_t&, std::string pgroup_id, ARDOUR::MidiTrackNameSource, ARDOUR::MidiTempoMapDisposition, samplepos_t&,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>(), boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>(),
bool with_markers = false) = 0; bool with_markers = false) = 0;
virtual void do_embed (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode, virtual void do_embed (std::vector<std::string> paths, Editing::ImportDisposition, Editing::ImportMode mode, samplepos_t&,
samplepos_t&, std::string pgroup_id,
boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>()) = 0; boost::shared_ptr<ARDOUR::PluginInfo> instrument = boost::shared_ptr<ARDOUR::PluginInfo>()) = 0;
/** Open main export dialog */ /** Open main export dialog */

View file

@ -2098,12 +2098,10 @@ SoundFileOmega::do_something (int action)
_import_active = true; _import_active = true;
string gid = Playlist::generate_pgroup_id();
if (copy_files_btn.get_active()) { if (copy_files_btn.get_active()) {
PublicEditor::instance().do_import (paths, chns, mode, quality, mts, mtd, where, gid, instrument, with_midi_markers); PublicEditor::instance().do_import (paths, chns, mode, quality, mts, mtd, where, instrument, with_midi_markers);
} else { } else {
PublicEditor::instance().do_embed (paths, chns, mode, where, gid, instrument); PublicEditor::instance().do_embed (paths, chns, mode, where, instrument);
} }
_import_active = false; _import_active = false;