summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/directory_names.h3
-rw-r--r--libs/ardour/ardour/file_source.h3
-rw-r--r--libs/ardour/ardour/playlist.h3
-rw-r--r--libs/ardour/ardour/region.h1
-rw-r--r--libs/ardour/ardour/region_factory.h1
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/ardour/session_directory.h11
-rw-r--r--libs/ardour/ardour/session_playlists.h1
-rw-r--r--libs/ardour/directory_names.cc3
-rw-r--r--libs/ardour/file_source.cc12
-rw-r--r--libs/ardour/playlist.cc31
-rw-r--r--libs/ardour/region.cc23
-rw-r--r--libs/ardour/region_factory.cc12
-rw-r--r--libs/ardour/session_directory.cc21
-rw-r--r--libs/ardour/session_playlists.cc22
-rw-r--r--libs/ardour/session_state.cc221
16 files changed, 260 insertions, 110 deletions
diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h
index a5fd6dc754..0d330cd5a5 100644
--- a/libs/ardour/ardour/directory_names.h
+++ b/libs/ardour/ardour/directory_names.h
@@ -11,8 +11,7 @@ extern const char* const old_sound_dir_name;
extern const char* const sound_dir_name;
extern const char* const midi_dir_name;
extern const char* const midi_patch_dir_name;
-extern const char* const dead_sound_dir_name;
-extern const char* const dead_midi_dir_name;
+extern const char* const dead_dir_name;
extern const char* const interchange_dir_name;
extern const char* const peak_dir_name;
extern const char* const export_dir_name;
diff --git a/libs/ardour/ardour/file_source.h b/libs/ardour/ardour/file_source.h
index e114f82816..23b8b8f8c8 100644
--- a/libs/ardour/ardour/file_source.h
+++ b/libs/ardour/ardour/file_source.h
@@ -50,6 +50,9 @@ public:
int unstubify ();
void stubify ();
+ bool is_stub () const;
+
+ static bool is_stub_path (const std::string& path);
virtual bool safe_file_extension (const std::string& path) const = 0;
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index a9bbd9346b..e21199e642 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -159,6 +159,7 @@ public:
bool region_is_shuffle_constrained (boost::shared_ptr<Region>);
bool has_region_at (framepos_t const) const;
+ bool uses_source (boost::shared_ptr<const Source> src) const;
framepos_t find_next_transient (framepos_t position, int dir);
@@ -204,6 +205,8 @@ public:
virtual bool destroy_region (boost::shared_ptr<Region>) = 0;
+ void sync_all_regions_with_regions ();
+
/* special case function used by UI selection objects, which have playlists that actually own the regions
within them.
*/
diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h
index 1b88ff1d69..17ea1362d8 100644
--- a/libs/ardour/ardour/region.h
+++ b/libs/ardour/ardour/region.h
@@ -176,6 +176,7 @@ class Region
bool region_list_equivalent (boost::shared_ptr<const Region>) const;
bool source_equivalent (boost::shared_ptr<const Region>) const;
bool uses_source (boost::shared_ptr<const Source>) const;
+ bool uses_source_path (const std::string&) const;
std::string source_string () const;
diff --git a/libs/ardour/ardour/region_factory.h b/libs/ardour/ardour/region_factory.h
index b47ba71cc9..647e1fe7d8 100644
--- a/libs/ardour/ardour/region_factory.h
+++ b/libs/ardour/ardour/region_factory.h
@@ -80,6 +80,7 @@ public:
static boost::shared_ptr<Region> create (SourceList& srcs, const XMLNode&);
static void get_regions_using_source (boost::shared_ptr<Source>, std::set<boost::shared_ptr<Region> >& );
+ static void remove_regions_using_source (boost::shared_ptr<Source>);
static void map_remove (boost::shared_ptr<Region>);
static void map_remove_with_equivalents (boost::shared_ptr<Region>);
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index a66b3352fc..bf3df2f0a8 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -173,7 +173,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
std::string sound_dir (bool with_path = true) const;
std::string peak_dir () const;
- std::string dead_sound_dir () const;
+ std::string dead_dir () const;
std::string automation_dir () const;
std::string analysis_dir() const;
std::string plugins_dir() const;
diff --git a/libs/ardour/ardour/session_directory.h b/libs/ardour/ardour/session_directory.h
index bcde4bdf2c..b7de1c8f0f 100644
--- a/libs/ardour/ardour/session_directory.h
+++ b/libs/ardour/ardour/session_directory.h
@@ -90,18 +90,11 @@ public:
const PBD::sys::path peak_path () const;
/**
- * @return The absolute path to the directory that audio
- * files are moved to when they are no longer part of the
- * session.
- */
- const PBD::sys::path dead_sound_path () const;
-
- /**
- * @return The absolute path to the directory that midi
+ * @return The absolute path to the directory that source
* files are moved to when they are no longer part of the
* session.
*/
- const PBD::sys::path dead_midi_path () const;
+ const PBD::sys::path dead_path () const;
/**
* @return The absolute path to the directory that audio
diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h
index 0a20c7b905..fe47d171ad 100644
--- a/libs/ardour/ardour/session_playlists.h
+++ b/libs/ardour/ardour/session_playlists.h
@@ -57,6 +57,7 @@ public:
void unassigned (std::list<boost::shared_ptr<Playlist> > & list);
void destroy_region (boost::shared_ptr<Region>);
boost::shared_ptr<Crossfade> find_crossfade (const PBD::ID &);
+ void sync_all_regions_with_regions ();
private:
friend class Session;
diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc
index 18d43f7ec8..247dd04978 100644
--- a/libs/ardour/directory_names.cc
+++ b/libs/ardour/directory_names.cc
@@ -9,8 +9,7 @@ const char* const sound_dir_name = X_("audiofiles");
const char* const midi_dir_name = X_("midifiles");
const char* const midi_patch_dir_name = X_("patchfiles");
const char* const peak_dir_name = X_("peaks");
-const char* const dead_sound_dir_name = X_("dead_sounds");
-const char* const dead_midi_dir_name = X_("dead_midi");
+const char* const dead_dir_name = X_("dead");
const char* const interchange_dir_name = X_("interchange");
const char* const export_dir_name = X_("export");
const char* const templates_dir_name = X_("templates");
diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc
index ae7fbdc38c..bf68e2ec15 100644
--- a/libs/ardour/file_source.cc
+++ b/libs/ardour/file_source.cc
@@ -537,6 +537,18 @@ FileSource::set_within_session_from_path (const std::string& path)
_within_session = _session.path_is_within_session (path);
}
+bool
+FileSource::is_stub_path (const std::string& path)
+{
+ return path.find (stub_dir_name) != string::npos;
+}
+
+bool
+FileSource::is_stub () const
+{
+ return is_stub_path (_path);
+}
+
int
FileSource::unstubify ()
{
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index cb764e7f40..393cc284fb 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -827,12 +827,8 @@ Playlist::add_region_internal (boost::shared_ptr<Region> region, framepos_t posi
regions.insert (upper_bound (regions.begin(), regions.end(), region, cmp), region);
all_regions.insert (region);
- cerr << "Playlist: region added at " << position << endl;
-
possibly_splice_unlocked (position, region->length(), region);
- cerr << "Playlist: post-splice, region @ " << region->position() << endl;
-
if (!holding_state ()) {
/* layers get assigned from XML state, and are not reset during undo/redo */
relayer ();
@@ -1309,7 +1305,6 @@ Playlist::paste (boost::shared_ptr<Playlist> other, framepos_t position, float t
*/
copy_of_region->set_layer (copy_of_region->layer() + top_layer);
- cerr << "DEBUG: add new region at " << pos << endl;
add_region_internal (copy_of_region, (*i)->position() + pos);
}
pos += shift;
@@ -1704,6 +1699,18 @@ Playlist::drop_regions ()
}
void
+Playlist::sync_all_regions_with_regions ()
+{
+ RegionLock rl (this);
+
+ all_regions.clear ();
+
+ for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
+ all_regions.insert (*i);
+ }
+}
+
+void
Playlist::clear (bool with_signals)
{
{
@@ -2757,6 +2764,20 @@ Playlist::nudge_after (framepos_t start, framecnt_t distance, bool forwards)
}
+bool
+Playlist::uses_source (boost::shared_ptr<const Source> src) const
+{
+ RegionLock rlock (const_cast<Playlist*> (this));
+
+ for (set<boost::shared_ptr<Region> >::iterator r = all_regions.begin(); r != all_regions.end(); ++r) {
+ if ((*r)->uses_source (src)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
boost::shared_ptr<Region>
Playlist::find_region (const ID& id) const
{
diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc
index 873e265225..ff9d31fd2d 100644
--- a/libs/ardour/region.cc
+++ b/libs/ardour/region.cc
@@ -29,14 +29,15 @@
#include "pbd/enumwriter.h"
#include "ardour/debug.h"
-#include "ardour/region.h"
+#include "ardour/file_source.h"
+#include "ardour/filter.h"
#include "ardour/playlist.h"
+#include "ardour/profile.h"
+#include "ardour/region.h"
+#include "ardour/region_factory.h"
#include "ardour/session.h"
#include "ardour/source.h"
#include "ardour/tempo.h"
-#include "ardour/region_factory.h"
-#include "ardour/filter.h"
-#include "ardour/profile.h"
#include "ardour/utils.h"
#include "i18n.h"
@@ -1474,6 +1475,20 @@ Region::uses_source (boost::shared_ptr<const Source> source) const
return false;
}
+bool
+Region::uses_source_path (const std::string& path) const
+{
+ for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+ boost::shared_ptr<const FileSource> fs = boost::dynamic_pointer_cast<const FileSource> (*i);
+ if (fs) {
+ if (fs->path() == path) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
framecnt_t
Region::source_length(uint32_t n) const
{
diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc
index 1fd81f9a4b..eba237d0d2 100644
--- a/libs/ardour/region_factory.cc
+++ b/libs/ardour/region_factory.cc
@@ -549,3 +549,15 @@ RegionFactory::get_regions_using_source (boost::shared_ptr<Source> s, std::set<b
}
}
}
+
+void
+RegionFactory::remove_regions_using_source (boost::shared_ptr<Source> src)
+{
+ Glib::Mutex::Lock lm (region_map_lock);
+
+ for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+ if (i->second->uses_source (src)) {
+ region_map.erase (i);
+ }
+ }
+}
diff --git a/libs/ardour/session_directory.cc b/libs/ardour/session_directory.cc
index a848ceee4b..1948a5a9b9 100644
--- a/libs/ardour/session_directory.cc
+++ b/libs/ardour/session_directory.cc
@@ -135,15 +135,9 @@ SessionDirectory::peak_path () const
}
const path
-SessionDirectory::dead_sound_path () const
+SessionDirectory::dead_path () const
{
- return m_root_path / dead_sound_dir_name;
-}
-
-const path
-SessionDirectory::dead_midi_path () const
-{
- return m_root_path / dead_midi_dir_name;
+ return m_root_path / dead_dir_name;
}
const path
@@ -157,12 +151,11 @@ SessionDirectory::sub_directories () const
{
vector<path> tmp_paths;
- tmp_paths.push_back ( sound_path () );
- tmp_paths.push_back ( midi_path () );
- tmp_paths.push_back ( peak_path () );
- tmp_paths.push_back ( dead_sound_path () );
- tmp_paths.push_back ( dead_midi_path () );
- tmp_paths.push_back ( export_path () );
+ tmp_paths.push_back (sound_path ());
+ tmp_paths.push_back (midi_path ());
+ tmp_paths.push_back (peak_path ());
+ tmp_paths.push_back (dead_path ());
+ tmp_paths.push_back (export_path ());
return tmp_paths;
}
diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc
index 66b4b53b67..1e5a276ad4 100644
--- a/libs/ardour/session_playlists.cc
+++ b/libs/ardour/session_playlists.cc
@@ -26,6 +26,7 @@
#include "ardour/region.h"
#include "ardour/playlist_factory.h"
#include "ardour/session.h"
+#include "ardour/source.h"
#include "i18n.h"
using namespace std;
@@ -246,18 +247,25 @@ uint32_t
SessionPlaylists::source_use_count (boost::shared_ptr<const Source> src) const
{
uint32_t count = 0;
+
for (List::const_iterator p = playlists.begin(); p != playlists.end(); ++p) {
- for (Playlist::RegionList::const_iterator r = (*p)->region_list().begin();
- r != (*p)->region_list().end(); ++r) {
- if ((*r)->uses_source(src)) {
- ++count;
- break;
- }
- }
+ if ((*p)->uses_source (src)) {
+ ++count;
+ break;
+ }
}
return count;
}
+void
+SessionPlaylists::sync_all_regions_with_regions ()
+{
+ Glib::Mutex::Lock lm (lock);
+
+ for (List::const_iterator p = playlists.begin(); p != playlists.end(); ++p) {
+ (*p)->sync_all_regions_with_regions ();
+ }
+}
void
SessionPlaylists::update_after_tempo_map_change ()
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 5333c9165c..82ee766b23 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -56,6 +56,7 @@
#include "midi++/manager.h"
#include "pbd/boost_debug.h"
+#include "pbd/basename.h"
#include "pbd/controllable_descriptor.h"
#include "pbd/enumwriter.h"
#include "pbd/error.h"
@@ -146,7 +147,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_path = string(buf);
- if (_path[_path.length()-1] != '/') {
+ if (_path[_path.length()-1] != G_DIR_SEPARATOR) {
_path += G_DIR_SEPARATOR;
}
@@ -487,7 +488,7 @@ Session::ensure_subdirs ()
return -1;
}
- dir = session_directory().dead_sound_path().to_string();
+ dir = session_directory().dead_path().to_string();
if (g_mkdir_with_parents (dir.c_str(), 0755) < 0) {
error << string_compose(_("Session: cannot create session dead sounds folder \"%1\" (%2)"), dir, strerror (errno)) << endmsg;
@@ -2415,18 +2416,46 @@ Session::commit_reversible_command (Command *cmd)
}
static bool
-accept_all_non_peak_files (const string& path, void */*arg*/)
+accept_all_non_stub_audio_files (const string& path, void */*arg*/)
+{
+ if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) {
+ return false;
+ }
+
+ if (FileSource::is_stub_path (path)) {
+ return false;
+ }
+
+ if (!AudioFileSource::safe_audio_file_extension (path)) {
+ return false;
+ }
+
+ return true;
+}
+
+static bool
+accept_all_non_stub_midi_files (const string& path, void */*arg*/)
{
if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) {
return false;
}
- return (path.length() > 5 && path.find (peakfile_suffix) != (path.length() - 5));
+ if (FileSource::is_stub_path (path)) {
+ return false;
+ }
+
+ return ((path.length() > 4 && path.find (".mid") != (path.length() - 4)) ||
+ (path.length() > 4 && path.find (".smf") != (path.length() - 4)) ||
+ (path.length() > 5 && path.find (".midi") != (path.length() - 5)));
}
static bool
accept_all_state_files (const string& path, void */*arg*/)
{
+ if (!Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR)) {
+ return false;
+ }
+
return (path.length() > 7 && path.find (".ardour") == (path.length() - 7));
}
@@ -2572,10 +2601,12 @@ Session::cleanup_sources (CleanupReport& rep)
vector<boost::shared_ptr<Source> > dead_sources;
PathScanner scanner;
- string sound_path;
+ string audio_path;
+ string midi_path;
vector<space_and_path>::iterator i;
vector<space_and_path>::iterator nexti;
- vector<string*>* soundfiles;
+ vector<string*>* candidates;
+ vector<string*>* candidates2;
vector<string> unused;
set<string> all_sources;
bool used;
@@ -2584,14 +2615,19 @@ Session::cleanup_sources (CleanupReport& rep)
_state_of_the_state = (StateOfTheState) (_state_of_the_state | InCleanup);
- /* step 1: consider deleting all unused playlists */
+ /* consider deleting all unused playlists */
if (playlists->maybe_delete_unused (boost::bind (Session::ask_about_playlist_deletion, _1))) {
ret = 0;
goto out;
}
- /* step 2: find all un-used sources */
+ /* sync the "all regions" property of each playlist with its current state
+ */
+
+ playlists->sync_all_regions_with_regions ();
+
+ /* find all un-used sources */
rep.paths.clear ();
rep.space = 0;
@@ -2615,7 +2651,7 @@ Session::cleanup_sources (CleanupReport& rep)
i = tmp;
}
- /* build a list of all the possible sound directories for the session */
+ /* build a list of all the possible audio directories for the session */
for (i = session_dirs.begin(); i != session_dirs.end(); ) {
@@ -2623,25 +2659,49 @@ Session::cleanup_sources (CleanupReport& rep)
++nexti;
SessionDirectory sdir ((*i).path);
- sound_path += sdir.sound_path().to_string();
+ audio_path += sdir.sound_path().to_string();
if (nexti != session_dirs.end()) {
- sound_path += ':';
+ audio_path += ':';
}
i = nexti;
}
- /* now do the same thing for the files that ended up in the sounds dir(s)
- but are not referenced as sources in any snapshot.
- */
- soundfiles = scanner (sound_path, accept_all_non_peak_files, (void *) 0, false, true);
+ /* build a list of all the possible midi directories for the session */
- if (soundfiles == 0) {
- return 0;
+ for (i = session_dirs.begin(); i != session_dirs.end(); ) {
+
+ nexti = i;
+ ++nexti;
+
+ SessionDirectory sdir ((*i).path);
+ midi_path += sdir.midi_path().to_string();
+
+ if (nexti != session_dirs.end()) {
+ midi_path += ':';
+ }
+
+ i = nexti;
}
+ candidates = scanner (audio_path, accept_all_non_stub_audio_files, (void *) 0, true, true);
+ candidates2 = scanner (midi_path, accept_all_non_stub_midi_files, (void *) 0, true, true);
+
+ /* merge them */
+
+ if (candidates) {
+ if (candidates2) {
+ for (vector<string*>::iterator i = candidates2->begin(); i != candidates2->end(); ++i) {
+ candidates->push_back (*i);
+ }
+ delete candidates2;
+ }
+ } else {
+ candidates = candidates2; // might still be null
+ }
+
/* find all sources, but don't use this snapshot because the
state file on disk still references sources we may have already
dropped.
@@ -2652,61 +2712,82 @@ Session::cleanup_sources (CleanupReport& rep)
/* add our current source list
*/
- for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
+ for (SourceMap::iterator i = sources.begin(); i != sources.end(); ) {
boost::shared_ptr<FileSource> fs;
+ SourceMap::iterator tmp = i;
+ ++tmp;
if ((fs = boost::dynamic_pointer_cast<FileSource> (i->second)) != 0) {
- all_sources.insert (fs->path());
+ if (!fs->is_stub()) {
+ if (playlists->source_use_count (fs) != 0) {
+ all_sources.insert (fs->path());
+ } else {
+
+ /* we might not remove this source from disk, because it may be used
+ by other snapshots, but its not being used in this version
+ so lets get rid of it now, along with any representative regions
+ in the region list.
+ */
+
+ cerr << "Source " << i->second->name() << "ID " << i->second->id() << " not used, remove from source list and also all regions\n";
+
+ RegionFactory::remove_regions_using_source (i->second);
+ sources.erase (i);
+ }
+ }
}
+
+ i = tmp;
}
char tmppath1[PATH_MAX+1];
char tmppath2[PATH_MAX+1];
- for (vector<string*>::iterator x = soundfiles->begin(); x != soundfiles->end(); ++x) {
-
- used = false;
- spath = **x;
-
- for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
+ if (candidates) {
+ for (vector<string*>::iterator x = candidates->begin(); x != candidates->end(); ++x) {
+
+ used = false;
+ spath = **x;
+
+ for (set<string>::iterator i = all_sources.begin(); i != all_sources.end(); ++i) {
+
+ if (realpath(spath.c_str(), tmppath1) == 0) {
+ error << string_compose (_("Cannot expand path %1 (%2)"),
+ spath, strerror (errno)) << endmsg;
+ continue;
+ }
+
+ if (realpath((*i).c_str(), tmppath2) == 0) {
+ error << string_compose (_("Cannot expand path %1 (%2)"),
+ (*i), strerror (errno)) << endmsg;
+ continue;
+ }
- if (realpath(spath.c_str(), tmppath1) == 0) {
- error << string_compose (_("Cannot expand path %1 (%2)"),
- spath, strerror (errno)) << endmsg;
- continue;
+ if (strcmp(tmppath1, tmppath2) == 0) {
+ used = true;
+ break;
+ }
}
-
- if (realpath((*i).c_str(), tmppath2) == 0) {
- error << string_compose (_("Cannot expand path %1 (%2)"),
- (*i), strerror (errno)) << endmsg;
- continue;
+
+ if (!used) {
+ unused.push_back (spath);
}
- if (strcmp(tmppath1, tmppath2) == 0) {
- used = true;
- break;
- }
- }
+ delete *x;
+ }
- if (!used) {
- unused.push_back (spath);
- }
- }
+ delete candidates;
+ }
- /* now try to move all unused files into the "dead_sounds" directory(ies) */
+ /* now try to move all unused files into the "dead" directory(ies) */
for (vector<string>::iterator x = unused.begin(); x != unused.end(); ++x) {
struct stat statbuf;
- rep.paths.push_back (*x);
- if (stat ((*x).c_str(), &statbuf) == 0) {
- rep.space += statbuf.st_size;
- }
-
string newpath;
/* don't move the file across filesystems, just
- stick it in the `dead_sound_dir_name' directory
+ stick it in the `dead_dir_name' directory
on whichever filesystem it was already on.
*/
@@ -2721,16 +2802,16 @@ Session::cleanup_sources (CleanupReport& rep)
/* new school, go up 4 levels */
- newpath = Glib::path_get_dirname (*x); // "audiofiles"
+ newpath = Glib::path_get_dirname (*x); // "audiofiles" or "midifiles"
newpath = Glib::path_get_dirname (newpath); // "session-name"
newpath = Glib::path_get_dirname (newpath); // "interchange"
newpath = Glib::path_get_dirname (newpath); // "session-dir"
}
- newpath = Glib::build_filename (newpath, dead_sound_dir_name);
+ newpath = Glib::build_filename (newpath, dead_dir_name);
if (g_mkdir_with_parents (newpath.c_str(), 0755) < 0) {
- error << string_compose(_("Session: cannot create session peakfile folder \"%1\" (%2)"), newpath, strerror (errno)) << endmsg;
+ error << string_compose(_("Session: cannot create dead file folder \"%1\" (%2)"), newpath, strerror (errno)) << endmsg;
return -1;
}
@@ -2747,7 +2828,7 @@ Session::cleanup_sources (CleanupReport& rep)
snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
newpath_v = buf;
- while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
+ while (Glib::file_test (newpath_v.c_str(), Glib::FILE_TEST_EXISTS) && version < 999) {
snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
newpath_v = buf;
}
@@ -2766,8 +2847,10 @@ Session::cleanup_sources (CleanupReport& rep)
}
+ stat ((*x).c_str(), &statbuf);
+
if (::rename ((*x).c_str(), newpath.c_str()) != 0) {
- error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
+ error << string_compose (_("cannot rename unused file source from %1 to %2 (%3)"),
(*x), newpath, strerror (errno))
<< endmsg;
goto out;
@@ -2776,22 +2859,27 @@ Session::cleanup_sources (CleanupReport& rep)
/* see if there an easy to find peakfile for this file, and remove it.
*/
- string peakpath = (*x).substr (0, (*x).find_last_of ('.'));
- peakpath += peakfile_suffix;
-
- if (access (peakpath.c_str(), W_OK) == 0) {
+ string base = basename_nosuffix (*x);
+ base += "%A"; /* this is what we add for the channel suffix of all native files,
+ or for the first channel of embedded files. it will miss
+ some peakfiles for other channels
+ */
+ string peakpath = peak_path (base);
+
+ if (Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
if (::unlink (peakpath.c_str()) != 0) {
error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
- peakpath, _path, strerror (errno))
+ peakpath, _path, strerror (errno))
<< endmsg;
/* try to back out */
rename (newpath.c_str(), _path.c_str());
goto out;
}
}
- }
- ret = 0;
+ rep.paths.push_back (*x);
+ rep.space += statbuf.st_size;
+ }
/* dump the history list */
@@ -2802,6 +2890,7 @@ Session::cleanup_sources (CleanupReport& rep)
*/
save_state ("");
+ ret = 0;
out:
_state_of_the_state = (StateOfTheState) (_state_of_the_state & ~InCleanup);
@@ -2815,17 +2904,17 @@ Session::cleanup_trash_sources (CleanupReport& rep)
// FIXME: needs adaptation for MIDI
vector<space_and_path>::iterator i;
- string dead_sound_dir;
+ string dead_dir;
rep.paths.clear ();
rep.space = 0;
for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
- dead_sound_dir = (*i).path;
- dead_sound_dir += dead_sound_dir_name;
+ dead_dir = (*i).path;
+ dead_dir += dead_dir_name;
- clear_directory (dead_sound_dir, &rep.space, &rep.paths);
+ clear_directory (dead_dir, &rep.space, &rep.paths);
}
return 0;