diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-11-09 17:24:17 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-11-09 17:24:17 +0000 |
commit | 7ae1a99d067aa3e1510902e3e20575165cb58b5c (patch) | |
tree | 361997b5e285bd94fb5f613b2d7630fbb83ee731 | |
parent | 5c6ba165f684fbd45be33c83d41083567d4dd88f (diff) |
always store source names as relative paths; always add directories of embedded files to search path; never use hardlinks for embedding anymore
git-svn-id: svn://localhost/ardour2/branches/3.0@7984 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/editor_audio_import.cc | 43 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 1 | ||||
-rw-r--r-- | libs/ardour/audiofilesource.cc | 2 | ||||
-rw-r--r-- | libs/ardour/file_source.cc | 105 | ||||
-rw-r--r-- | libs/ardour/session.cc | 38 | ||||
-rw-r--r-- | libs/ardour/sndfilesource.cc | 2 |
6 files changed, 97 insertions, 94 deletions
diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 852958b798..506248a6c7 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -606,7 +606,6 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile, string linked_path; SoundFileInfo finfo; int ret = 0; - string path_to_use; set_canvas_cursor (wait_cursor); gdk_flush (); @@ -614,48 +613,10 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile, for (vector<string>::iterator p = paths.begin(); p != paths.end(); ++p) { string path = *p; - - if (Config->get_try_link_for_embed()) { - - /* lets see if we can link it into the session */ - - sys::path tmp = _session->session_directory().sound_path() / Glib::path_get_basename(path); - linked_path = tmp.to_string(); - - path_to_use = linked_path; - - if (link (path.c_str(), linked_path.c_str()) == 0) { - - /* there are many reasons why link(2) might have failed. - but if it succeeds, we now have a link in the - session sound dir that will protect against - unlinking of the original path. nice. - */ - - path = linked_path; - path_to_use = Glib::path_get_basename (path); - - } else { - - /* one possible reason is that its already linked */ - - if (errno == EEXIST) { - struct stat sb; - - if (stat (linked_path.c_str(), &sb) == 0) { - if (sb.st_nlink > 1) { // its a hard link, assume its the one we want - path = linked_path; - path_to_use = Glib::path_get_basename (path); - } - } - } - } - } + string error_msg; /* note that we temporarily truncated _id at the colon */ - string error_msg; - if (!AudioFileSource::get_soundfile_info (path, finfo, error_msg)) { error << string_compose(_("Editor: cannot open file \"%1\", (%2)"), path, error_msg ) << endmsg; goto out; @@ -732,7 +693,7 @@ Editor::embed_sndfiles (vector<string> paths, bool multifile, source = boost::dynamic_pointer_cast<AudioFileSource> ( SourceFactory::createReadable (DataType::AUDIO, *_session, - path_to_use, n, + path, n, (mode == ImportAsTapeTrack ? Source::Destructive : Source::Flag (0)), diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index d0fe89ee52..03e33a6446 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -786,6 +786,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi bool timecode_transmission_suspended () const; std::string source_search_path(DataType) const; + void ensure_search_path_includes (const std::string& path, DataType type); /* handlers can return an integer value: 0: config.set_audio_search_path() or config.set_midi_search_path() was used diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc index 9f24814d49..12c2c6ad17 100644 --- a/libs/ardour/audiofilesource.cc +++ b/libs/ardour/audiofilesource.cc @@ -100,7 +100,7 @@ AudioFileSource::AudioFileSource (Session& s, const string& path, Source::Flag f if (init (_path, true)) { throw failed_constructor (); } - + cerr << "audiofile source created with path " << path << endl; } /** Constructor used for new internal-to-session files. */ diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc index 95ab3e9f3d..7eac1a23ea 100644 --- a/libs/ardour/file_source.cc +++ b/libs/ardour/file_source.cc @@ -104,9 +104,11 @@ FileSource::init (const string& pathstr, bool must_exist) set_within_session_from_path (pathstr); - if (_within_session) { - _name = Glib::path_get_basename (_name); - } + if (!within_session()) { + _session.ensure_search_path_includes (Glib::path_get_dirname (pathstr), _type); + } + + _name = Glib::path_get_basename (pathstr); if (_file_is_new && must_exist) { return -1; @@ -211,64 +213,63 @@ bool FileSource::find (Session& s, DataType type, const string& path, bool must_exist, bool& isnew, uint16_t& chan, string& found_path) { - string search_path = s.source_search_path (type); - - string pathstr = path; bool ret = false; - - cerr << "Searching along " << search_path << endl; + string keeppath; isnew = false; - - vector<string> dirs; - vector<string> hits; - int cnt; - string fullpath; - string keeppath; - - if (search_path.length() == 0) { - error << _("FileSource: search path not set") << endmsg; - goto out; - } - - split (search_path, dirs, ':'); - - cnt = 0; - hits.clear (); - - for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { - - cerr << "Searching in " << *i << " for " << pathstr << endl; - - fullpath = Glib::build_filename (*i, pathstr); - - if (Glib::file_test (fullpath, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) { - keeppath = fullpath; - hits.push_back (fullpath); - ++cnt; - } - } - if (cnt > 1) { - - int which = FileSource::AmbiguousFileName (pathstr, search_path, hits).get_value_or (-1); + if (!Glib::path_is_absolute (path)) { + vector<string> dirs; + vector<string> hits; + int cnt; + string fullpath; - if (which < 0) { + string search_path = s.source_search_path (type); + + if (search_path.length() == 0) { + error << _("FileSource: search path not set") << endmsg; goto out; - } else { - keeppath = hits[which]; } + + split (search_path, dirs, ':'); - } else if (cnt == 0) { + cnt = 0; + hits.clear (); - if (must_exist) { - error << string_compose( - _("Filesource: cannot find required file (%1): while searching %2"), - pathstr, search_path) << endmsg; - goto out; - } else { - isnew = true; + for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { + + fullpath = Glib::build_filename (*i, path); + + if (Glib::file_test (fullpath, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_REGULAR)) { + keeppath = fullpath; + hits.push_back (fullpath); + ++cnt; + } } + + if (cnt > 1) { + + int which = FileSource::AmbiguousFileName (path, search_path, hits).get_value_or (-1); + + if (which < 0) { + goto out; + } else { + keeppath = hits[which]; + } + + } else if (cnt == 0) { + + if (must_exist) { + error << string_compose( + _("Filesource: cannot find required file (%1): while searching %2"), + path, search_path) << endmsg; + goto out; + } else { + isnew = true; + } + } + } else { + keeppath = path; } /* Current find() is unable to parse relative path names to yet non-existant @@ -278,7 +279,7 @@ FileSource::find (Session& s, DataType type, const string& path, bool must_exist if (must_exist) { error << "FileSource::find(), keeppath = \"\", but the file must exist" << endl; } else { - keeppath = pathstr; + keeppath = path; } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index f870fd9b11..55b5a4baee 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4117,3 +4117,41 @@ Session::source_search_path (DataType type) const return search_path; } +void +Session::ensure_search_path_includes (const string& path, DataType type) +{ + string search_path; + vector<string> dirs; + + switch (type) { + case DataType::AUDIO: + search_path = config.get_audio_search_path (); + break; + case DataType::MIDI: + search_path = config.get_midi_search_path (); + break; + } + + split (search_path, dirs, ':'); + + for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) { + if (*i == path) { + return; + } + } + + if (!search_path.empty()) { + search_path += ':'; + } + + search_path += path; + + switch (type) { + case DataType::AUDIO: + config.set_audio_search_path (search_path); + break; + case DataType::MIDI: + config.set_midi_search_path (search_path); + break; + } +} diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc index a8811cc9ff..9508391d07 100644 --- a/libs/ardour/sndfilesource.cc +++ b/libs/ardour/sndfilesource.cc @@ -217,6 +217,8 @@ SndFileSource::open () so we don't want to see this message. */ + cerr << "failed to open " << _path << " with name " << _name << endl; + error << string_compose(_("SndFileSource: cannot open file \"%1\" for %2 (%3)"), _path, (writable() ? "read+write" : "reading"), errbuf) << endmsg; #endif |