summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/session.h3
-rw-r--r--libs/ardour/import.cc38
2 files changed, 32 insertions, 9 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 367c5bd29d..b5c1ae938f 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -258,7 +258,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
*/
RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
- std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path, uint32_t channels);
+ std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path,
+ uint32_t channels, std::vector<std::string> const & smf_track_names);
int bring_all_sources_into_session (boost::function<void(uint32_t,uint32_t,std::string)> callback);
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc
index d441494ad7..431b1d75e7 100644
--- a/libs/ardour/import.cc
+++ b/libs/ardour/import.cc
@@ -118,7 +118,9 @@ open_importable_source (const string& path, framecnt_t samplerate, ARDOUR::SrcQu
}
vector<string>
-Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& import_file_path, uint32_t channels)
+Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& import_file_path, uint32_t channels,
+ vector<string> const & smf_track_names)
+
{
vector<string> new_paths;
const string basename = basename_nosuffix (import_file_path);
@@ -129,13 +131,19 @@ Session::get_paths_for_new_sources (bool /*allow_replacing*/, const string& impo
string filepath;
switch (type) {
- case DataType::MIDI:
- if (channels > 1) {
- string mchn_name = string_compose ("%1-t%2", basename, n);
- filepath = new_midi_source_path (mchn_name);
+ case DataType::MIDI:
+ assert (smf_track_names.empty() || smf_track_names.size() == channels);
+ if (channels > 1) {
+ string mchn_name;
+ if (smf_track_names.empty() || smf_track_names[n].empty()) {
+ mchn_name = string_compose ("%1-t%2", basename, n);
} else {
- filepath = new_midi_source_path (basename);
+ mchn_name = string_compose ("%1-%2", basename, smf_track_names[n]);
}
+ filepath = new_midi_source_path (mchn_name);
+ } else {
+ filepath = new_midi_source_path (basename);
+ }
break;
case DataType::AUDIO:
filepath = new_audio_source_path (basename, channels, n, false, false);
@@ -484,6 +492,7 @@ Session::import_files (ImportStatus& status)
boost::shared_ptr<AudioFileSource> afs;
boost::shared_ptr<SMFSource> smfs;
uint32_t channels = 0;
+ vector<string> smf_names;
status.sources.clear ();
@@ -508,12 +517,25 @@ Session::import_files (ImportStatus& status)
} else {
try {
smf_reader = std::auto_ptr<Evoral::SMF>(new Evoral::SMF());
- smf_reader->open(*p);
+
+ if (smf_reader->open(*p)) {
+ throw Evoral::SMF::FileError (*p);
+ }
if (smf_reader->is_type0 () && status.split_midi_channels) {
channels = smf_reader->channels().size();
} else {
channels = smf_reader->num_tracks();
+ switch (status.midi_track_name_source) {
+ case SMFTrackNumber:
+ break;
+ case SMFTrackName:
+ smf_reader->track_names (smf_names);
+ break;
+ case SMFInstrumentName:
+ smf_reader->instrument_names (smf_names);
+ break;
+ }
}
} catch (...) {
error << _("Import: error opening MIDI file") << endmsg;
@@ -527,7 +549,7 @@ Session::import_files (ImportStatus& status)
continue;
}
- vector<string> new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels);
+ vector<string> new_paths = get_paths_for_new_sources (status.replace_existing_source, *p, channels, smf_names);
Sources newfiles;
framepos_t natural_position = source ? source->natural_position() : 0;