summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorBen Loftis <ben@harrisonconsoles.com>2018-07-14 12:46:49 -0500
committerBen Loftis <ben@harrisonconsoles.com>2018-07-14 12:46:49 -0500
commitffc5d1474af146d26f2ac3fe5e637575784eb3af (patch)
tree0cd881186f83cb92afb0d52e6c4566774c9a2ea9 /libs/ardour
parent108162c757e922a4b3478a767ede28b12f3923a8 (diff)
auto-backup: libardour part. (from mixbus)
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/directory_names.h1
-rw-r--r--libs/ardour/ardour/session_directory.h6
-rw-r--r--libs/ardour/directory_names.cc1
-rw-r--r--libs/ardour/session_directory.cc7
-rw-r--r--libs/ardour/session_state.cc28
5 files changed, 43 insertions, 0 deletions
diff --git a/libs/ardour/ardour/directory_names.h b/libs/ardour/ardour/directory_names.h
index a671ee0b2e..69096e51ea 100644
--- a/libs/ardour/ardour/directory_names.h
+++ b/libs/ardour/ardour/directory_names.h
@@ -35,6 +35,7 @@ namespace ARDOUR {
LIBARDOUR_API extern const char* const interchange_dir_name;
LIBARDOUR_API extern const char* const peak_dir_name;
LIBARDOUR_API extern const char* const export_dir_name;
+ LIBARDOUR_API extern const char* const backup_dir_name;
LIBARDOUR_API extern const char* const export_formats_dir_name;
LIBARDOUR_API extern const char* const plugin_metadata_dir_name;
LIBARDOUR_API extern const char* const templates_dir_name;
diff --git a/libs/ardour/ardour/session_directory.h b/libs/ardour/ardour/session_directory.h
index 6f4126e0bb..75740090a4 100644
--- a/libs/ardour/ardour/session_directory.h
+++ b/libs/ardour/ardour/session_directory.h
@@ -108,6 +108,12 @@ public:
const std::string export_path () const;
/**
+ * @return The absolute path to the directory that backup
+ * session files are stored.
+ */
+ const std::string backup_path () const;
+
+ /**
* @return true if session directory and all the required
* subdirectories exist.
*/
diff --git a/libs/ardour/directory_names.cc b/libs/ardour/directory_names.cc
index 574929f3a1..9ace7934f8 100644
--- a/libs/ardour/directory_names.cc
+++ b/libs/ardour/directory_names.cc
@@ -32,6 +32,7 @@ const char* const peak_dir_name = X_("peaks");
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 backup_dir_name = X_("backup");
const char* const export_formats_dir_name = X_("export");
const char* const templates_dir_name = X_("templates");
const char* const plugin_metadata_dir_name = X_("plugin_metadata");
diff --git a/libs/ardour/session_directory.cc b/libs/ardour/session_directory.cc
index c52fe1aeb5..1f6b991f82 100644
--- a/libs/ardour/session_directory.cc
+++ b/libs/ardour/session_directory.cc
@@ -245,6 +245,12 @@ SessionDirectory::export_path () const
return Glib::build_filename (m_root_path, export_dir_name);
}
+const std::string
+SessionDirectory::backup_path () const
+{
+ return Glib::build_filename (m_root_path, backup_dir_name);
+}
+
const vector<std::string>
SessionDirectory::sub_directories () const
{
@@ -256,6 +262,7 @@ SessionDirectory::sub_directories () const
tmp_paths.push_back (peak_path ());
tmp_paths.push_back (dead_path ());
tmp_paths.push_back (export_path ());
+ tmp_paths.push_back (backup_path ());
return tmp_paths;
}
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index b27a292642..6eb06d8c35 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -749,6 +749,8 @@ Session::remove_state (string snapshot_name)
error << string_compose(_("Could not remove session file at path \"%1\" (%2)"),
xml_path, g_strerror (errno)) << endmsg;
}
+
+ StateSaved (snapshot_name); /* EMIT SIGNAL */
}
/** @param snapshot_name Name to save under, without .ardour / .pending prefix */
@@ -873,6 +875,32 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
}
}
+ //Mixbus auto-backup mechanism
+ if(Profile->get_mixbus()) {
+ if (pending) { //"pending" save means it's a backup, or some other non-user-initiated save; a good time to make a backup
+ // make a serialized safety backup
+ // (will make one periodically but only one per hour is left on disk)
+ // these backup files go into a separated folder
+ char timebuf[128];
+ time_t n;
+ struct tm local_time;
+ time (&n);
+ localtime_r (&n, &local_time);
+ strftime (timebuf, sizeof(timebuf), "%y-%m-%d.%H", &local_time);
+ std::string save_path(session_directory().backup_path());
+ save_path += G_DIR_SEPARATOR;
+ save_path += legalize_for_path(_current_snapshot_name);
+ save_path += "-";
+ save_path += timebuf;
+ save_path += statefile_suffix;
+ if ( !tree.write (save_path) )
+ error << string_compose(_("Could not save backup file at path \"%1\" (%2)"),
+ save_path, g_strerror (errno)) << endmsg;
+ }
+
+ StateSaved (snapshot_name); /* EMIT SIGNAL */
+ }
+
if (!pending && !for_archive) {
save_history (snapshot_name);