always store source names as relative paths; always add directories of embedded files...
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 9 Nov 2010 17:24:17 +0000 (17:24 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 9 Nov 2010 17:24:17 +0000 (17:24 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7984 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_audio_import.cc
libs/ardour/ardour/session.h
libs/ardour/audiofilesource.cc
libs/ardour/file_source.cc
libs/ardour/session.cc
libs/ardour/sndfilesource.cc

index 852958b79846a917ef595e19c5e9d3879a85ba49..506248a6c7d95283a9d7ba1f0dc5985c31888564 100644 (file)
@@ -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)),
index d0fe89ee52a19f0c5207c15080559e81114c7134..03e33a6446e17284ea5ec30ca344fb9bcd81e147 100644 (file)
@@ -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
index 9f24814d49e52f585da5f130fd20cf37150a18d1..12c2c6ad17ea83f83f659f2c541a666651e62dba 100644 (file)
@@ -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. */
index 95ab3e9f3dca3c83cc77de12ad65d12077e415db..7eac1a23ea2a10fa52845b109ad99536154f6aa2 100644 (file)
@@ -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;
                 }
         }
         
index f870fd9b1105109b64b8b24606b55dbd1528b08d..55b5a4baeef6f62bb450100cc27f9be7f46fedb9 100644 (file)
@@ -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;
+        }
+}
index a8811cc9ff878ff8857b95a3f79e595dacbf1c90..9508391d07b0ee5febe691456c347875772e1cf8 100644 (file)
@@ -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