assert (_end >= 0);
}
+bool
+Location::operator== (const Location& other)
+{
+ if (_name != other._name ||
+ _start != other._start ||
+ _end != other._end ||
+ _bbt_start != other._bbt_start ||
+ _bbt_end != other._bbt_end ||
+ _flags != other._flags ||
+ _position_lock_style != other._position_lock_style) {
+ return false;
+ }
+ return true;
+}
+
Location*
Location::operator= (const Location& other)
{
int
Location::set_start (framepos_t s, bool force, bool allow_bbt_recompute)
{
+ if (s < 0) {
+ return -1;
+ }
+
if (_locked) {
return -1;
}
int
Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute)
{
+ if (e < 0) {
+ return -1;
+ }
+
if (_locked) {
return -1;
}
}
if (e != _end) {
+
framepos_t const old = _end;
_end = e;
int
Location::set (framepos_t start, framepos_t end, bool allow_bbt_recompute)
{
+ if (start < 0 || end < 0) {
+ return -1;
+ }
+
/* check validity */
if (((is_auto_punch() || is_auto_loop()) && start >= end) || (!is_mark() && start > end)) {
return -1;
int
Location::move_to (framepos_t pos)
{
+ if (pos < 0) {
+ return -1;
+ }
+
if (_locked) {
return -1;
}
int ret;
if (want_lock) {
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
ret = set_current_unlocked (loc);
} else {
ret = set_current_unlocked (loc);
Locations::clear ()
{
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
Locations::clear_markers ()
{
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
LocationList::iterator tmp;
for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
Locations::clear_ranges ()
{
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
LocationList::iterator tmp;
for (LocationList::iterator i = locations.begin(); i != locations.end(); ) {
assert (loc);
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
locations.push_back (loc);
if (make_current) {
}
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
for (i = locations.begin(); i != locations.end(); ++i) {
if ((*i) == loc) {
{
XMLNode *node = new XMLNode ("Locations");
LocationList::iterator iter;
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
for (iter = locations.begin(); iter != locations.end(); ++iter) {
node->add_child_nocopy ((*iter)->get_state ());
}
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
XMLNodeConstIterator niter;
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
return 0;
}
+
+typedef std::pair<framepos_t,Location*> LocationPair;
+
struct LocationStartEarlierComparison
{
- bool operator() (Location *a, Location *b) {
- return a->start() < b->start();
+ bool operator() (LocationPair a, LocationPair b) {
+ return a.first < b.first;
}
};
struct LocationStartLaterComparison
{
- bool operator() (Location *a, Location *b) {
- return a->start() > b->start();
+ bool operator() (LocationPair a, LocationPair b) {
+ return a.first > b.first;
}
};
-Location *
-Locations::first_location_before (framepos_t frame, bool include_special_ranges)
+framepos_t
+Locations::first_mark_before (framepos_t frame, bool include_special_ranges)
{
- LocationList locs;
-
- {
- Glib::Mutex::Lock lm (lock);
- locs = locations;
+ Glib::Threads::Mutex::Lock lm (lock);
+ vector<LocationPair> locs;
+
+ for (LocationList::iterator i = locations.begin(); i != locations.end(); ++i) {
+ locs.push_back (make_pair ((*i)->start(), (*i)));
+ if (!(*i)->is_mark()) {
+ locs.push_back (make_pair ((*i)->end(), (*i)));
+ }
}
LocationStartLaterComparison cmp;
- locs.sort (cmp);
+ sort (locs.begin(), locs.end(), cmp);
- /* locs is now sorted latest..earliest */
+ /* locs is sorted in ascending order */
- for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
- if (!include_special_ranges && ((*i)->is_auto_loop() || (*i)->is_auto_punch())) {
+ for (vector<LocationPair>::iterator i = locs.begin(); i != locs.end(); ++i) {
+ if ((*i).second->is_hidden()) {
+ continue;
+ }
+ if (!include_special_ranges && ((*i).second->is_auto_loop() || (*i).second->is_auto_punch())) {
continue;
}
- if (!(*i)->is_hidden() && (*i)->start() < frame) {
- return (*i);
+ if ((*i).first < frame) {
+ return (*i).first;
}
}
- return 0;
+ return -1;
}
-Location *
-Locations::first_location_after (framepos_t frame, bool include_special_ranges)
+framepos_t
+Locations::first_mark_after (framepos_t frame, bool include_special_ranges)
{
- LocationList locs;
+ Glib::Threads::Mutex::Lock lm (lock);
+ vector<LocationPair> locs;
- {
- Glib::Mutex::Lock lm (lock);
- locs = locations;
+ for (LocationList::iterator i = locations.begin(); i != locations.end(); ++i) {
+ locs.push_back (make_pair ((*i)->start(), (*i)));
+ if (!(*i)->is_mark()) {
+ locs.push_back (make_pair ((*i)->end(), (*i)));
+ }
}
LocationStartEarlierComparison cmp;
- locs.sort (cmp);
+ sort (locs.begin(), locs.end(), cmp);
+
+ /* locs is sorted in reverse order */
- /* 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())) {
+ for (vector<LocationPair>::iterator i = locs.begin(); i != locs.end(); ++i) {
+ if ((*i).second->is_hidden()) {
+ continue;
+ }
+ if (!include_special_ranges && ((*i).second->is_auto_loop() || (*i).second->is_auto_punch())) {
continue;
}
- if (!(*i)->is_hidden() && (*i)->start() > frame) {
- return (*i);
+ if ((*i).first > frame) {
+ return (*i).first;
}
}
- return 0;
+ return -1;
}
/** Look for the `marks' (either locations which are marks, or start/end points of range markers) either
LocationList locs;
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
locs = locations;
}
Locations::num_range_markers () const
{
uint32_t cnt = 0;
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
if ((*i)->is_range_marker()) {
++cnt;
void
Locations::find_all_between (framepos_t start, framepos_t end, LocationList& ll, Location::Flags flags)
{
- Glib::Mutex::Lock lm (lock);
+ Glib::Threads::Mutex::Lock lm (lock);
for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
if ((flags == 0 || (*i)->matches (flags)) &&