more MTC debugging
[ardour.git] / libs / ardour / location.cc
index 7b9e706c36bc9de7b07e93344dbb00f0141bd9a1..7e3330ecd9476128d9f54158b57dbe997c05391b 100644 (file)
@@ -23,7 +23,8 @@
 #include <unistd.h>
 #include <cerrno>
 #include <ctime>
-#include <sigc++/bind.h>
+#include <list>
+
 
 #include "pbd/stl_delete.h"
 #include "pbd/xml++.h"
@@ -39,7 +40,6 @@
 
 using namespace std;
 using namespace ARDOUR;
-using namespace sigc;
 using namespace PBD;
 
 Location::Location (const Location& other)
@@ -347,7 +347,7 @@ Location::get_state (void)
 }
 
 int
-Location::set_state (const XMLNode& node, int version)
+Location::set_state (const XMLNode& node, int /*version*/)
 {
        const XMLProperty *prop;
 
@@ -674,7 +674,7 @@ Locations::get_state ()
 }
 
 int
-Locations::set_state (const XMLNode& node, int version)
+Locations::set_state (const XMLNode& node, int /*version*/)
 {
        XMLNodeList nlist;
        XMLNodeConstIterator niter;
@@ -786,84 +786,67 @@ Locations::first_location_after (nframes64_t frame, bool include_special_ranges)
        return 0;
 }
 
-nframes64_t
-Locations::first_mark_before (nframes64_t frame, bool include_special_ranges)
+/** Look for the `marks' (either locations which are marks, or start/end points of range markers) either
+ *  side of a frame.
+ *  @param frame Frame to look for.
+ *  @param before Filled in with the position of the last `mark' before `frame' (or max_frames if none exists)
+ *  @param after Filled in with the position of the last `mark' after `frame' (or max_frames if none exists)
+ */
+void
+Locations::marks_either_side (nframes64_t const frame, nframes64_t& before, nframes64_t& after) const
 {
+       before = after = max_frames;
+       
        LocationList locs;
 
        {
-        Glib::Mutex::Lock lm (lock);
+               Glib::Mutex::Lock lm (lock);
                locs = locations;
        }
 
-       LocationStartLaterComparison cmp;
-       locs.sort (cmp);
-
-       /* locs is now sorted latest..earliest */
+       std::list<nframes64_t> positions;
 
-       for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
-               if (!include_special_ranges && ((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
+       for (LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
+               if (((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
                        continue;
                }
+
                if (!(*i)->is_hidden()) {
-                       if ((*i)->is_mark()) {
-                               /* MARK: start == end */
-                               if ((*i)->start() < frame) {
-                                       return (*i)->start();
-                               }
+                       if ((*i)->is_mark ()) {
+                               positions.push_back ((*i)->start ());
                        } else {
-                               /* RANGE: start != end, compare start and end */
-                               if ((*i)->end() < frame) {
-                                       return (*i)->end();
-                               }
-                               if ((*i)->start () < frame) {
-                                       return (*i)->start();
-                               }
+                               positions.push_back ((*i)->start ());
+                               positions.push_back ((*i)->end ());
                        }
                }
        }
 
-       return 0;
-}
+       if (positions.empty ()) {
+               return;
+       }
 
-nframes64_t
-Locations::first_mark_after (nframes64_t frame, bool include_special_ranges)
-{
-       LocationList locs;
+       positions.sort ();
 
-       {
-        Glib::Mutex::Lock lm (lock);
-               locs = locations;
+       std::list<nframes64_t>::iterator i = positions.begin ();
+       while (i != positions.end () && *i < frame) {
+               ++i;
        }
 
-       LocationStartEarlierComparison cmp;
-       locs.sort (cmp);
+       if (i == positions.end ()) {
+               /* run out of marks */
+               before = positions.back ();
+               return;
+       }
 
-       /* locs is now sorted earliest..latest */
+       after = *i;
 
-       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 */
-                               if ((*i)->start() > frame) {
-                                       return (*i)->start();
-                               }
-                       } else {
-                               /* RANGE, start != end, compare start and end */
-                               if ((*i)->start() > frame ) {
-                                       return (*i)->start ();
-                               }
-                               if ((*i)->end() > frame) {
-                                       return (*i)->end ();
-                               }
-                       }
-               }
+       if (i == positions.begin ()) {
+               /* none before */
+               return;
        }
-
-       return max_frames;
+       
+       --i;
+       before = *i;
 }
 
 Location*