summaryrefslogtreecommitdiff
path: root/libs/ardour/session_state.cc
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2007-06-17 00:45:58 +0000
committerTim Mayberry <mojofunk@gmail.com>2007-06-17 00:45:58 +0000
commitee29fcacfb750e8880ccafc88fff360e2331950e (patch)
treed57727ff086206d649626686622a9838004c53e0 /libs/ardour/session_state.cc
parent0346cdc2810b5bca69e9754fa3865e2eb3035807 (diff)
Replace Session::discover_best_sound/midi_dir with Session::get_best_session_directory_for_new_source
git-svn-id: svn://localhost/ardour2/trunk@1997 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/session_state.cc')
-rw-r--r--libs/ardour/session_state.cc232
1 files changed, 14 insertions, 218 deletions
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 29df9477b6..24a335a128 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -64,6 +64,7 @@
#include <ardour/configuration.h>
#include <ardour/session.h>
#include <ardour/session_directory.h>
+#include <ardour/session_utils.h>
#include <ardour/buffer.h>
#include <ardour/audio_diskstream.h>
#include <ardour/midi_diskstream.h>
@@ -1504,14 +1505,15 @@ Session::path_from_region_name (string name, string identifier)
{
char buf[PATH_MAX+1];
uint32_t n;
- string dir = discover_best_sound_dir ();
+ SessionDirectory sdir(get_best_session_directory_for_new_source());
+ string sound_dir = sdir.sound_path().to_string();
for (n = 0; n < 999999; ++n) {
if (identifier.length()) {
- snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 ".wav", dir.c_str(), name.c_str(),
+ snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 ".wav", sound_dir.c_str(), name.c_str(),
identifier.c_str(), n);
} else {
- snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 ".wav", dir.c_str(), name.c_str(), n);
+ snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 ".wav", sound_dir.c_str(), name.c_str(), n);
}
if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
@@ -1660,102 +1662,16 @@ Session::refresh_disk_space ()
#endif
}
-int
-Session::ensure_sound_dir (string path, string& result)
-{
- string dead;
- string peak;
-
- /* Ensure that the parent directory exists */
-
- if (g_mkdir_with_parents (path.c_str(), 0775)) {
- error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
- return -1;
- }
-
- /* Ensure that the sounds directory exists */
-
- result = path;
- result += '/';
- result += sound_dir_name;
-
- if (g_mkdir_with_parents (result.c_str(), 0775)) {
- error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
- return -1;
- }
-
- dead = path;
- dead += '/';
- dead += dead_sound_dir_name;
-
- if (g_mkdir_with_parents (dead.c_str(), 0775)) {
- error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
- return -1;
- }
-
- peak = path;
- peak += '/';
- peak += peak_dir_name;
-
- if (g_mkdir_with_parents (peak.c_str(), 0775)) {
- error << string_compose(_("cannot create peak file directory \"%1\"; ignored"), peak) << endmsg;
- return -1;
- }
-
- /* callers expect this to be terminated ... */
-
- result += '/';
- return 0;
-}
-
-int
-Session::ensure_midi_dir (string path, string& result)
-{
- string dead;
-
- /* Ensure that the parent directory exists */
-
- if (g_mkdir_with_parents (path.c_str(), 0775)) {
- error << string_compose(_("cannot create session directory \"%1\"; ignored"), path) << endmsg;
- return -1;
- }
-
- /* Ensure that the sounds directory exists */
-
- result = path;
- result += '/';
- result += midi_dir_name;
-
- if (g_mkdir_with_parents (result.c_str(), 0775)) {
- error << string_compose(_("cannot create sounds directory \"%1\"; ignored"), result) << endmsg;
- return -1;
- }
-
- dead = path;
- dead += '/';
- dead += dead_midi_dir_name;
-
- if (g_mkdir_with_parents (dead.c_str(), 0775)) {
- error << string_compose(_("cannot create dead sounds directory \"%1\"; ignored"), dead) << endmsg;
- return -1;
- }
-
- /* callers expect this to be terminated ... */
-
- result += '/';
- return 0;
-}
-
string
-Session::discover_best_sound_dir (bool destructive)
+Session::get_best_session_directory_for_new_source ()
{
vector<space_and_path>::iterator i;
- string result;
+ string result = _session_dir->root_path().to_string();
/* handle common case without system calls */
if (session_dirs.size() == 1) {
- return sound_dir();
+ return result;
}
/* OK, here's the algorithm we're following here:
@@ -1797,9 +1713,6 @@ Session::discover_best_sound_dir (bool destructive)
}
if (free_enough >= 2) {
-
- bool found_it = false;
-
/* use RR selection process, ensuring that the one
picked works OK.
*/
@@ -1812,19 +1725,15 @@ Session::discover_best_sound_dir (bool destructive)
}
if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
- if (ensure_sound_dir ((*i).path, result) == 0) {
+ if (create_session_directory ((*i).path)) {
+ result = (*i).path;
last_rr_session_dir = i;
- found_it = true;
- break;
+ return result;
}
}
} while (i != last_rr_session_dir);
- if (!found_it) {
- result = sound_dir();
- }
-
} else {
/* pick FS with the most freespace (and that
@@ -1838,125 +1747,12 @@ Session::discover_best_sound_dir (bool destructive)
sort (sorted.begin(), sorted.end(), cmp);
for (i = sorted.begin(); i != sorted.end(); ++i) {
- if (ensure_sound_dir ((*i).path, result) == 0) {
+ if (create_session_directory ((*i).path)) {
+ result = (*i).path;
last_rr_session_dir = i;
- break;
+ return result;
}
}
-
- /* if the above fails, fall back to the most simplistic solution */
-
- if (i == sorted.end()) {
- return sound_dir();
- }
- }
-
- return result;
-}
-
-string
-Session::discover_best_midi_dir ()
-{
- vector<space_and_path>::iterator i;
- string result;
-
- /* handle common case without system calls */
-
- if (session_dirs.size() == 1) {
- return midi_dir();
- }
-
- /* OK, here's the algorithm we're following here:
-
- We want to select which directory to use for
- the next file source to be created. Ideally,
- we'd like to use a round-robin process so as to
- get maximum performance benefits from splitting
- the files across multiple disks.
-
- However, in situations without much diskspace, an
- RR approach may end up filling up a filesystem
- with new files while others still have space.
- Its therefore important to pay some attention to
- the freespace in the filesystem holding each
- directory as well. However, if we did that by
- itself, we'd keep creating new files in the file
- system with the most space until it was as full
- as all others, thus negating any performance
- benefits of this RAID-1 like approach.
-
- So, we use a user-configurable space threshold. If
- there are at least 2 filesystems with more than this
- much space available, we use RR selection between them.
- If not, then we pick the filesystem with the most space.
-
- This gets a good balance between the two
- approaches.
- */
-
- refresh_disk_space ();
-
- int free_enough = 0;
-
- for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
- if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
- free_enough++;
- }
- }
-
- if (free_enough >= 2) {
-
- bool found_it = false;
-
- /* use RR selection process, ensuring that the one
- picked works OK.
- */
-
- i = last_rr_session_dir;
-
- do {
- if (++i == session_dirs.end()) {
- i = session_dirs.begin();
- }
-
- if ((*i).blocks * 4096 >= Config->get_disk_choice_space_threshold()) {
- if (ensure_midi_dir ((*i).path, result) == 0) {
- last_rr_session_dir = i;
- found_it = true;
- break;
- }
- }
-
- } while (i != last_rr_session_dir);
-
- if (!found_it) {
- result = midi_dir();
- }
-
- } else {
-
- /* pick FS with the most freespace (and that
- seems to actually work ...)
- */
-
- vector<space_and_path> sorted;
- space_and_path_ascending_cmp cmp;
-
- sorted = session_dirs;
- sort (sorted.begin(), sorted.end(), cmp);
-
- for (i = sorted.begin(); i != sorted.end(); ++i) {
- if (ensure_midi_dir ((*i).path, result) == 0) {
- last_rr_session_dir = i;
- break;
- }
- }
-
- /* if the above fails, fall back to the most simplistic solution */
-
- if (i == sorted.end()) {
- return midi_dir();
- }
}
return result;