summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-11-09 17:24:17 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-11-09 17:24:17 +0000
commit7ae1a99d067aa3e1510902e3e20575165cb58b5c (patch)
tree361997b5e285bd94fb5f613b2d7630fbb83ee731 /libs/ardour
parent5c6ba165f684fbd45be33c83d41083567d4dd88f (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
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/session.h1
-rw-r--r--libs/ardour/audiofilesource.cc2
-rw-r--r--libs/ardour/file_source.cc105
-rw-r--r--libs/ardour/session.cc38
-rw-r--r--libs/ardour/sndfilesource.cc2
5 files changed, 95 insertions, 53 deletions
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