X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Futils.cc;h=18194678ed0284743d1dddc806b2b65d888b9699;hb=4e1f451520975868659f4c00d00883f5f1cd5805;hp=6b5ea2cef664d5950f657ff423370306087ddefd;hpb=45d3ec1437cf661533bc7750c623865def4424df;p=ardour.git diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index 6b5ea2cef6..18194678ed 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2003 Paul Davis + Copyright (C) 2000-2003 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,10 +17,14 @@ */ +#define __STDC_FORMAT_MACROS 1 +#include + #include /* for sprintf */ +#include #include #include -#include +#include #include #include #include @@ -46,49 +50,7 @@ using namespace std; using namespace PBD; using Glib::ustring; -void -elapsed_time_to_str (char *buf, uint32_t seconds) - -{ - uint32_t days; - uint32_t hours; - uint32_t minutes; - uint32_t s; - - s = seconds; - days = s / (3600 * 24); - s -= (days * 3600 * 24); - hours = s / 3600; - s -= (hours * 3600); - minutes = s / 60; - s -= minutes * 60; - - if (days) { - snprintf (buf, sizeof (buf), "%" PRIu32 " day%s %" PRIu32 " hour%s", - days, - days > 1 ? "s" : "", - hours, - hours > 1 ? "s" : ""); - } else if (hours) { - snprintf (buf, sizeof (buf), "%" PRIu32 " hour%s %" PRIu32 " minute%s", - hours, - hours > 1 ? "s" : "", - minutes, - minutes > 1 ? "s" : ""); - } else if (minutes) { - snprintf (buf, sizeof (buf), "%" PRIu32 " minute%s", - minutes, - minutes > 1 ? "s" : ""); - } else if (s) { - snprintf (buf, sizeof (buf), "%" PRIu32 " second%s", - seconds, - seconds > 1 ? "s" : ""); - } else { - snprintf (buf, sizeof (buf), "no time"); - } -} - -ustring +ustring legalize_for_path (ustring str) { ustring::size_type pos; @@ -105,25 +67,45 @@ legalize_for_path (ustring str) return legal; } -#if 0 -string -legalize_for_path (string str) + +string bump_name_once(std::string name) { - string::size_type pos; - string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=: "; - string legal; + string::size_type period; + string newname; - legal = str; - pos = 0; + if ((period = name.find_last_of ('.')) == string::npos) { + newname = name; + newname += ".1"; + } else { + int isnumber = 1; + const char *last_element = name.c_str() + period + 1; + for (size_t i = 0; i < strlen(last_element); i++) { + if (!isdigit(last_element[i])) { + isnumber = 0; + break; + } + } - while ((pos = legal.find_first_not_of (legal_chars, pos)) != string::npos) { - legal.replace (pos, 1, "_"); - pos += 1; + errno = 0; + long int version = strtol (name.c_str()+period+1, (char **)NULL, 10); + + if (isnumber == 0 || errno != 0) { + // last_element is not a number, or is too large + newname = name; + newname += ".1"; + } else { + char buf[32]; + + snprintf (buf, sizeof(buf), "%ld", version+1); + + newname = name.substr (0, period+1); + newname += buf; + } } - return legal; + return newname; + } -#endif ostream& operator<< (ostream& o, const BBT_Time& bbt) @@ -158,7 +140,7 @@ cmp_nocase (const string& s, const string& s2) { string::const_iterator p = s.begin(); string::const_iterator p2 = s2.begin(); - + while (p != s.end() && p2 != s2.end()) { if (toupper(*p) != toupper(*p2)) { return (toupper(*p) < toupper(*p2)) ? -1 : 1; @@ -166,34 +148,8 @@ cmp_nocase (const string& s, const string& s2) ++p; ++p2; } - - return (s2.size() == s.size()) ? 0 : (s.size() < s2.size()) ? -1 : 1; -} -int -tokenize_fullpath (string fullpath, string& path, string& name) -{ - string::size_type m = fullpath.find_last_of("/"); - - if (m == string::npos) { - path = fullpath; - name = fullpath; - return 1; - } - - // does it look like just a directory? - if (m == fullpath.length()-1) { - return -1; - } - path = fullpath.substr(0, m+1); - - string::size_type n = fullpath.find(".ardour", m); - // no .ardour? - if (n == string::npos) { - return -1; - } - name = fullpath.substr(m+1, n - m - 1); - return 1; + return (s2.size() == s.size()) ? 0 : (s.size() < s2.size()) ? -1 : 1; } int @@ -208,33 +164,50 @@ touch_file (ustring path) } ustring -region_name_from_path (ustring path, bool strip_channels) +region_name_from_path (ustring path, bool strip_channels, bool add_channel_suffix, uint32_t total, uint32_t this_one) { path = PBD::basename_nosuffix (path); if (strip_channels) { /* remove any "?R", "?L" or "?[a-z]" channel identifier */ - + ustring::size_type len = path.length(); - - if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') && + + if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') && (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) { - + path = path.substr (0, path.length() - 2); } } + if (add_channel_suffix) { + + path += '%'; + + if (total > 2) { + path += (char) ('a' + this_one); + } else { + path += (char) (this_one == 0 ? 'L' : 'R'); + } + } + return path; -} +} bool path_is_paired (ustring path, ustring& pair_base) { ustring::size_type pos; + /* remove any leading path */ + + if ((pos = path.find_last_of ('/')) != string::npos) { + path = path.substr(pos+1); + } + /* remove filename suffixes etc. */ - + if ((pos = path.find_last_of ('.')) != string::npos) { path = path.substr (0, pos); } @@ -243,13 +216,13 @@ path_is_paired (ustring path, ustring& pair_base) /* look for possible channel identifier: "?R", "%R", ".L" etc. */ - if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') && + if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') && (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) { - + pair_base = path.substr (0, len-2); return true; - } + } return false; } @@ -280,20 +253,20 @@ path_expand (ustring path) wordfree (&expansion); return ret; -#else +#else return path; #endif } #if defined(HAVE_COREAUDIO) || defined(HAVE_AUDIOUNITS) -string +string CFStringRefToStdString(CFStringRef stringRef) { - CFIndex size = - CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) , + CFIndex size = + CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) , kCFStringEncodingUTF8); char *buf = new char[size]; - + std::string result; if(CFStringGetCString(stringRef, buf, size, kCFStringEncodingUTF8)) { @@ -309,14 +282,14 @@ compute_equal_power_fades (nframes_t nframes, float* in, float* out) { double step; - step = 1.0/nframes; + step = 1.0/(nframes-1); in[0] = 0.0f; - + for (nframes_t i = 1; i < nframes - 1; ++i) { in[i] = in[i-1] + step; } - + in[nframes-1] = 1.0; const float pan_law_attenuation = -3.0f; @@ -337,6 +310,8 @@ string_to_edit_mode (string str) return Splice; } else if (str == _("Slide Edit")) { return Slide; + } else if (str == _("Lock Edit")) { + return Lock; } fatal << string_compose (_("programming error: unknown edit mode string \"%1\""), str) << endmsg; /*NOTREACHED*/ @@ -350,6 +325,9 @@ edit_mode_to_string (EditMode mode) case Slide: return _("Slide Edit"); + case Lock: + return _("Lock Edit"); + default: case Splice: return _("Splice Edit"); @@ -362,11 +340,15 @@ string_to_slave_source (string str) if (str == _("Internal")) { return None; } - + if (str == _("MTC")) { return MTC; } + if (str == _("MIDI Clock")) { + return MIDIClock; + } + if (str == _("JACK")) { return JACK; } @@ -385,11 +367,14 @@ slave_source_to_string (SlaveSource src) case MTC: return _("MTC"); - + + case MIDIClock: + return _("MIDI Clock"); + default: case None: return _("Internal"); - + } } @@ -471,7 +456,7 @@ meter_hold_to_float (MeterHold hold) } } -AutoState +AutoState ARDOUR::string_to_auto_state (std::string str) { if (str == X_("Off")) { @@ -489,7 +474,7 @@ ARDOUR::string_to_auto_state (std::string str) return Touch; } -string +string ARDOUR::auto_state_to_string (AutoState as) { /* to be used only for XML serialization, no i18n done */ @@ -513,7 +498,7 @@ ARDOUR::auto_state_to_string (AutoState as) return ""; } -AutoStyle +AutoStyle ARDOUR::string_to_auto_style (std::string str) { if (str == X_("Absolute")) { @@ -527,7 +512,7 @@ ARDOUR::string_to_auto_style (std::string str) return Trim; } -string +string ARDOUR::auto_style_to_string (AutoStyle as) { /* to be used only for XML serialization, no i18n done */