second (and hopefully) final part of changes to respond to header format changes...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 22 Jul 2010 14:52:05 +0000 (14:52 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 22 Jul 2010 14:52:05 +0000 (14:52 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7470 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/file_source.h
libs/ardour/ardour/utils.h
libs/ardour/audio_diskstream.cc
libs/ardour/session.cc
libs/ardour/utils.cc

index dfb1b43e58e43f779514330e859087838aa7580e..379d391c73e2e13531f4bd8919369fa5e0a1f17d 100644 (file)
@@ -61,6 +61,7 @@ public:
                        Glib::ustring& found_path);
 
         void inc_use_count ();
+       bool removable () const;
 
 protected:
        FileSource (Session& session, DataType type,
@@ -75,8 +76,6 @@ protected:
        virtual int move_dependents_to_trash() { return 0; }
        void set_within_session_from_path (const std::string&);
 
-       bool removable () const;
-
        Glib::ustring _path;
        Glib::ustring _take_id;
        bool          _file_is_new;
index b91a6500db87303021c5433cc46015eed5a4f69f..f3f9c4182c0afde8c38ea3ddae7576afa22e50aa 100644 (file)
@@ -105,6 +105,7 @@ ARDOUR::MeterFalloff meter_falloff_from_float (float);
 float meter_falloff_to_db_per_sec (float);
 
 const char* native_header_format_extension (ARDOUR::HeaderFormat, const ARDOUR::DataType& type);
+bool matching_unsuffixed_filename_exists_in (const std::string& dir, const std::string& name);
 
 #if defined(HAVE_COREAUDIO) || defined(HAVE_AUDIOUNITS)
 std::string CFStringRefToStdString(CFStringRef stringRef);
index 5a68f78e9691598511eb40820ce2ae99075aa2ba..0f485e73c8346e9ae1ba2cacf57e3c1843e5c247 100644 (file)
@@ -1931,11 +1931,22 @@ AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
        capturing_sources.clear ();
 
        for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
+
                if (!destructive()) {
 
                        if ((*chan)->write_source && mark_write_complete) {
                                (*chan)->write_source->mark_streaming_write_completed ();
                        }
+
+                        if ((*chan)->write_source) {
+                                if ((*chan)->write_source->removable()) {
+                                        (*chan)->write_source->mark_for_remove ();
+                                        (*chan)->write_source->drop_references ();
+                                        _session.remove_source ((*chan)->write_source);
+                                } 
+                                (*chan)->write_source.reset ();
+                        }
+
                        use_new_write_source (n);
 
                        if (record_enabled()) {
@@ -1943,6 +1954,7 @@ AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
                        }
 
                } else {
+
                        if ((*chan)->write_source == 0) {
                                use_new_write_source (n);
                        }
index e939ffc694fcca1bb4ba1456c386c5cf0d9d8f7d..8618580314d245dd2036692b1d41c4ad1df16452 100644 (file)
@@ -2746,17 +2746,18 @@ Session::change_source_path_by_name (string path, string oldname, string newname
 
                        snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
 
-                        string p = Glib::build_filename (dir, buf);
-
-                       if (!Glib::file_test (p, Glib::FILE_TEST_EXISTS)) {
-                               path = p;
+                        if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
+                                path = Glib::build_filename (dir, buf);
                                break;
                        }
+
                        path = "";
                }
 
-               if (path == "") {
-                       error << "FATAL ERROR! Could not find a " << endl;
+               if (path.empty()) {
+                       fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
+                                                 newname) << endl;
+                        /*NOTREACHED*/
                }
        }
 
@@ -2800,7 +2801,6 @@ Session::peak_path (Glib::ustring base) const
 string
 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
 {
-       string spath;
        uint32_t cnt;
        char buf[PATH_MAX+1];
        const uint32_t limit = 10000;
@@ -2818,55 +2818,60 @@ Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t cha
 
                for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
 
-                       SessionDirectory sdir((*i).path);
-
-                       spath = sdir.sound_path().to_string();
-
                        if (destructive) {
 
                                if (nchan < 2) {
-                                       snprintf (buf, sizeof(buf), "%s/T%04d-%s%s",
-                                                  spath.c_str(), cnt, legalized.c_str(), ext.c_str());
+                                       snprintf (buf, sizeof(buf), "T%04d-%s%s",
+                                                  cnt, legalized.c_str(), ext.c_str());
                                } else if (nchan == 2) {
                                        if (chan == 0) {
-                                               snprintf (buf, sizeof(buf), "%s/T%04d-%s%%L%s",
-                                                          spath.c_str(), cnt, legalized.c_str(), ext.c_str());
+                                               snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
+                                                          cnt, legalized.c_str(), ext.c_str());
                                        } else {
-                                               snprintf (buf, sizeof(buf), "%s/T%04d-%s%%R%s",
-                                                          spath.c_str(), cnt, legalized.c_str(), ext.c_str());
+                                               snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
+                                                          cnt, legalized.c_str(), ext.c_str());
                                        }
                                } else if (nchan < 26) {
-                                       snprintf (buf, sizeof(buf), "%s/T%04d-%s%%%c%s",
-                                                  spath.c_str(), cnt, legalized.c_str(), 'a' + chan, ext.c_str());
+                                       snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
+                                                  cnt, legalized.c_str(), 'a' + chan, ext.c_str());
                                } else {
-                                       snprintf (buf, sizeof(buf), "%s/T%04d-%s%s",
-                                                  spath.c_str(), cnt, legalized.c_str(), ext.c_str());
+                                       snprintf (buf, sizeof(buf), "T%04d-%s%s",
+                                                  cnt, legalized.c_str(), ext.c_str());
                                }
 
                        } else {
 
-                               spath += '/';
-                               spath += legalized;
-
                                if (nchan < 2) {
-                                       snprintf (buf, sizeof(buf), "%s-%u%s", spath.c_str(), cnt, ext.c_str());
+                                       snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
                                } else if (nchan == 2) {
                                        if (chan == 0) {
-                                               snprintf (buf, sizeof(buf), "%s-%u%%L%s", spath.c_str(), cnt, ext.c_str());
+                                               snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
                                        } else {
-                                               snprintf (buf, sizeof(buf), "%s-%u%%R%s", spath.c_str(), cnt, ext.c_str());
+                                               snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
                                        }
                                } else if (nchan < 26) {
-                                       snprintf (buf, sizeof(buf), "%s-%u%%%c%s", spath.c_str(), cnt, 'a' + chan, ext.c_str());
+                                       snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
                                } else {
-                                       snprintf (buf, sizeof(buf), "%s-%u%s", spath.c_str(), cnt, ext.c_str());
+                                       snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
                                }
                        }
 
-                       if (sys::exists(buf)) {
-                               existing++;
-                       }
+                       SessionDirectory sdir((*i).path);
+
+                       string spath = sdir.sound_path().to_string();
+                       string spath_stubs = sdir.sound_stub_path().to_string();
 
+                        /* note that we search *without* the extension so that
+                           we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf" 
+                           in the event that this new name is required for
+                           a file format change.
+                        */
+
+                        if (matching_unsuffixed_filename_exists_in (spath, buf) ||
+                            matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
+                                existing++;
+                                break;
+                        }
                }
 
                if (existing == 0) {
@@ -2881,8 +2886,8 @@ Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t cha
                        throw failed_constructor();
                }
        }
-
-       return Glib::path_get_basename(buf);
+        
+       return Glib::path_get_basename (buf);
 }
 
 /** Create a new within-session audio source */
@@ -3398,7 +3403,12 @@ Session::reset_native_file_format ()
        for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
                boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
                if (tr) {
+                        /* don't save state as we do this, there's no point
+                         */
+
+                        _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
                        tr->reset_write_sources (false);
+                        _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
                }
        }
 }
index abdba63803f8270dfbaa4ca5e24a53991360ee6a..66835dc1b2ed6805c7e64aa6665bf0fc3317e5a9 100644 (file)
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <fcntl.h>
-#include <unistd.h>
+#include <dirent.h>
+#include <errno.h>
+
+#include <glibmm/miscutils.h>
 
 #ifdef HAVE_WORDEXP
 #include <wordexp.h>
@@ -538,6 +541,51 @@ native_header_format_extension (HeaderFormat hf, const DataType& type)
         return ".wav";
 }
 
+bool
+matching_unsuffixed_filename_exists_in (const string& dir, const string& path)
+{
+        string bws = basename_nosuffix (path);
+       struct dirent* dentry;
+       struct stat statbuf;
+       DIR* dead;
+        bool ret = false;
+
+        if ((dead = ::opendir (dir.c_str())) == 0) {
+                error << string_compose (_("cannot open directory %1 (%2)"), dir, strerror (errno)) << endl;
+                return false;
+        }
+        
+        while ((dentry = ::readdir (dead)) != 0) {
+                
+                /* avoid '.' and '..' */
+                
+                if ((dentry->d_name[0] == '.' && dentry->d_name[1] == '\0') ||
+                    (dentry->d_name[2] == '\0' && dentry->d_name[0] == '.' && dentry->d_name[1] == '.')) {
+                        continue;
+                }
+        
+                string fullpath = Glib::build_filename (dir, dentry->d_name);
+
+                if (::stat (fullpath.c_str(), &statbuf)) {
+                        continue;
+                }
+                
+                if (!S_ISREG (statbuf.st_mode)) {
+                        continue;
+                }
+
+                string bws2 = basename_nosuffix (dentry->d_name);
+                
+                if (bws2 == bws) {
+                        ret = true;
+                        break;
+                }
+        }
+
+        ::closedir (dead);
+        return ret;
+}
+
 extern "C" {
        void c_stacktrace() { stacktrace (cerr); }
 }