diff options
author | Ben Loftis <ben@harrisonconsoles.com> | 2018-07-14 12:46:49 -0500 |
---|---|---|
committer | Ben Loftis <ben@harrisonconsoles.com> | 2018-07-14 12:46:49 -0500 |
commit | ffc5d1474af146d26f2ac3fe5e637575784eb3af (patch) | |
tree | 0cd881186f83cb92afb0d52e6c4566774c9a2ea9 | |
parent | 108162c757e922a4b3478a767ede28b12f3923a8 (diff) |
auto-backup: libardour part. (from mixbus)
-rw-r--r-- | libs/ardour/ardour/directory_names.h | 1 | ||||
-rw-r--r-- | libs/ardour/ardour/session_directory.h | 6 | ||||
-rw-r--r-- | libs/ardour/directory_names.cc | 1 | ||||
-rw-r--r-- | libs/ardour/session_directory.cc | 7 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 28 |
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); |