X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Flocation.cc;h=b2af52284e91bfa232e575cbcd69addc23fec91d;hb=7ff370e79895d7eb293e7214689b791bd98415fb;hp=87a27e5c3d5069032edf2904118945aac1156b13;hpb=dcbab98be7edb7f0c2cbbeaaf22443e4a56fce41;p=ardour.git diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 87a27e5c3d..b2af52284e 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -36,6 +36,7 @@ using namespace std; using namespace ARDOUR; using namespace sigc; +using namespace PBD; Location::Location (const Location& other) : _name (other._name), @@ -371,7 +372,7 @@ Locations::set_current (Location *loc, bool want_lock) int ret; if (want_lock) { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); ret = set_current_unlocked (loc); } else { ret = set_current_unlocked (loc); @@ -399,7 +400,7 @@ void Locations::clear () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { tmp = i; @@ -424,7 +425,7 @@ void Locations::clear_markers () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -448,7 +449,7 @@ void Locations::clear_ranges () { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); LocationList::iterator tmp; for (LocationList::iterator i = locations.begin(); i != locations.end(); ) { @@ -477,7 +478,7 @@ void Locations::add (Location *loc, bool make_current) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); locations.push_back (loc); if (make_current) { @@ -507,7 +508,7 @@ Locations::remove (Location *loc) } { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (i = locations.begin(); i != locations.end(); ++i) { if ((*i) == loc) { @@ -547,7 +548,7 @@ Locations::get_state () { XMLNode *node = new XMLNode ("Locations"); LocationList::iterator iter; - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (iter = locations.begin(); iter != locations.end(); ++iter) { node->add_child_nocopy ((*iter)->get_state ()); @@ -570,7 +571,7 @@ Locations::set_state (const XMLNode& node) nlist = node.children(); { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (niter = nlist.begin(); niter != nlist.end(); ++niter) { Location *loc = new Location; @@ -614,7 +615,7 @@ Locations::first_location_before (jack_nframes_t frame) LocationList locs; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); locs = locations; } @@ -638,7 +639,7 @@ Locations::first_location_after (jack_nframes_t frame) LocationList locs; { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); locs = locations; } @@ -656,6 +657,80 @@ Locations::first_location_after (jack_nframes_t frame) return 0; } +jack_nframes_t +Locations::first_mark_before (jack_nframes_t frame) +{ + LocationList locs; + + { + Glib::Mutex::Lock lm (lock); + locs = locations; + } + + LocationStartLaterComparison cmp; + locs.sort (cmp); + + /* locs is now sorted latest..earliest */ + + for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) { + if (!(*i)->is_hidden()) { + if ((*i)->is_mark()) { + /* MARK: start == end */ + if ((*i)->start() < frame) { + return (*i)->start(); + } + } else { + /* RANGE: start != end, compare start and end */ + if ((*i)->end() < frame) { + return (*i)->end(); + } + if ((*i)->start () < frame) { + return (*i)->start(); + } + } + } + } + + return 0; +} + +jack_nframes_t +Locations::first_mark_after (jack_nframes_t frame) +{ + LocationList locs; + + { + Glib::Mutex::Lock lm (lock); + locs = locations; + } + + LocationStartEarlierComparison cmp; + locs.sort (cmp); + + /* locs is now sorted earliest..latest */ + + for (LocationList::iterator i = locs.begin(); i != locs.end(); ++i) { + 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 (); + } + } + } + } + + return max_frames; +} + Location* Locations::end_location () const { @@ -718,7 +793,7 @@ Change Locations::restore_state (StateManager::State& state) { { - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); State* lstate = dynamic_cast (&state); locations = lstate->locations; @@ -743,7 +818,7 @@ uint32_t Locations::num_range_markers () const { uint32_t cnt = 0; - LockMonitor lm (lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (lock); for (LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) { if ((*i)->is_range_marker()) { ++cnt;