X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Flocation.cc;h=7e3330ecd9476128d9f54158b57dbe997c05391b;hb=4ceac6311669d58390be0ebcc35401c25c148dde;hp=7b9e706c36bc9de7b07e93344dbb00f0141bd9a1;hpb=8713667ec1a6cc9ba56c07f763e5a422cc47fbef;p=ardour.git diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 7b9e706c36..7e3330ecd9 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -23,7 +23,8 @@ #include #include #include -#include +#include + #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 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::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*