Use ARDOUR::user_config_directory in ARDOUR::user_template_directory
[ardour.git] / libs / ardour / location.cc
index e09a59d42f607ddb99ba8683225681e1ce7bcdfc..3d04c66824009351d9113624ffdbe65b5f56c1b6 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <algorithm>
@@ -28,6 +27,7 @@
 
 #include <pbd/stl_delete.h>
 #include <pbd/xml++.h>
+#include <pbd/enumwriter.h>
 
 #include <ardour/location.h>
 #include <ardour/session.h>
@@ -35,6 +35,8 @@
 
 #include "i18n.h"
 
+#define SUFFIX_MAX 32
+
 using namespace std;
 using namespace ARDOUR;
 using namespace sigc;
@@ -217,12 +219,12 @@ Location::set_flag_internal (bool yn, Flags flag)
 {
        if (yn) {
                if (!(_flags & flag)) {
-                       _flags |= flag;
+                       _flags = Flags (_flags | flag);
                        return true;
                }
        } else {
                if (_flags & flag) {
-                       _flags &= ~flag;
+                       _flags = Flags (_flags & ~flag);
                        return true;
                }
        }
@@ -273,8 +275,7 @@ Location::get_state (void)
        node->add_property ("start", buf);
        snprintf (buf, sizeof (buf), "%u", end());
        node->add_property ("end", buf);
-       snprintf (buf, sizeof (buf), "%" PRIu32, (uint32_t) _flags);
-       node->add_property ("flags", buf);
+       node->add_property ("flags", enum_2_string (_flags));
 
        return *node;
 }
@@ -327,14 +328,12 @@ Location::set_state (const XMLNode& node)
                
        _end = atoi (prop->value().c_str());
                
-       _flags = 0;
-               
        if ((prop = node.property ("flags")) == 0) {
                  error << _("XML node for Location has no flags information") << endmsg; 
                  return -1;
        }
                
-       _flags = Flags (atoi (prop->value().c_str()));
+       _flags = Flags (string_2_enum (prop->value(), _flags));
 
        for (cd_iter = cd_list.begin(); cd_iter != cd_list.end(); ++cd_iter) {
                  
@@ -403,6 +402,40 @@ Locations::set_current (Location *loc, bool want_lock)
        return ret;
 }
 
+int
+Locations::next_available_name(string& result,string base)
+{
+       LocationList::iterator i;
+       Location* location;
+       string temp;
+       string::size_type l;
+       int suffix;
+       char buf[32];
+       bool available[SUFFIX_MAX+1];
+
+       result = base;
+       for (int k=1; k<SUFFIX_MAX; k++) {
+               available[k] = true;
+       }
+       l = base.length();
+       for (i = locations.begin(); i != locations.end(); ++i) {
+               location =* i;
+               temp = location->name();
+               if (l && !temp.find(base,0)) {
+                       suffix = atoi(temp.substr(l,3));
+                       if (suffix) available[suffix] = false;
+               }
+       }
+       for (int k=1; k<=SUFFIX_MAX; k++) {
+               if (available[k]) { 
+                       snprintf (buf, 31, "%d", k);
+                       result += buf;
+                       return 1;
+               }
+       }
+       return 0;
+}
+
 int
 Locations::set_current_unlocked (Location *loc)
 {
@@ -628,7 +661,7 @@ struct LocationStartLaterComparison
 };
 
 Location *
-Locations::first_location_before (nframes_t frame)
+Locations::first_location_before (nframes_t frame, bool include_special_ranges)
 {
        LocationList locs;
 
@@ -643,6 +676,9 @@ Locations::first_location_before (nframes_t frame)
        /* locs is now sorted latest..earliest */
        
        for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
+               if (!include_special_ranges && ((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
+                       continue;
+               }
                if (!(*i)->is_hidden() && (*i)->start() < frame) {
                        return (*i);
                }
@@ -652,7 +688,7 @@ Locations::first_location_before (nframes_t frame)
 }
 
 Location *
-Locations::first_location_after (nframes_t frame)
+Locations::first_location_after (nframes_t frame, bool include_special_ranges)
 {
        LocationList locs;
 
@@ -667,6 +703,9 @@ Locations::first_location_after (nframes_t frame)
        /* locs is now sorted earliest..latest */
        
        for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
+               if (!include_special_ranges && ((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
+                       continue;
+               }
                if (!(*i)->is_hidden() && (*i)->start() > frame) {
                        return (*i);
                }
@@ -676,7 +715,7 @@ Locations::first_location_after (nframes_t frame)
 }
 
 nframes_t
-Locations::first_mark_before (nframes_t frame)
+Locations::first_mark_before (nframes_t frame, bool include_special_ranges)
 {
        LocationList locs;
 
@@ -691,6 +730,9 @@ Locations::first_mark_before (nframes_t frame)
        /* locs is now sorted latest..earliest */
        
        for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
+               if (!include_special_ranges && ((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
+                       continue;
+               }
                if (!(*i)->is_hidden()) {
                        if ((*i)->is_mark()) {
                                /* MARK: start == end */
@@ -713,7 +755,7 @@ Locations::first_mark_before (nframes_t frame)
 }
 
 nframes_t
-Locations::first_mark_after (nframes_t frame)
+Locations::first_mark_after (nframes_t frame, bool include_special_ranges)
 {
        LocationList locs;
 
@@ -728,6 +770,9 @@ Locations::first_mark_after (nframes_t frame)
        /* locs is now sorted earliest..latest */
        
        for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
+               if (!include_special_ranges && ((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
+                       continue;
+               }
                if (!(*i)->is_hidden()) {
                        if ((*i)->is_mark()) {
                                /* MARK, start == end so just compare start */