diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2007-06-17 00:45:58 +0000 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2007-06-17 00:45:58 +0000 |
commit | ee29fcacfb750e8880ccafc88fff360e2331950e (patch) | |
tree | d57727ff086206d649626686622a9838004c53e0 /libs/ardour/session_state.cc | |
parent | 0346cdc2810b5bca69e9754fa3865e2eb3035807 (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.cc | 232 |
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; |