Add method to find a section location by position
This commit is contained in:
parent
5c888f2b90
commit
101744b812
|
@ -29,6 +29,7 @@
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
@ -246,6 +247,7 @@ class LIBARDOUR_API Locations : public SessionHandleRef, public PBD::StatefulDes
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef std::list<Location *> LocationList;
|
typedef std::list<Location *> LocationList;
|
||||||
|
typedef std::pair<Temporal::timepos_t, Location*> LocationPair;
|
||||||
|
|
||||||
Locations (Session &);
|
Locations (Session &);
|
||||||
~Locations ();
|
~Locations ();
|
||||||
|
@ -299,6 +301,7 @@ public:
|
||||||
timepos_t first_mark_after (timepos_t const &, bool include_special_ranges = false);
|
timepos_t first_mark_after (timepos_t const &, bool include_special_ranges = false);
|
||||||
|
|
||||||
Location* next_section (Location*, timepos_t&, timepos_t&) const;
|
Location* next_section (Location*, timepos_t&, timepos_t&) const;
|
||||||
|
Location* section_at (timepos_t const&, timepos_t&, timepos_t&) const;
|
||||||
|
|
||||||
void marks_either_side (timepos_t const &, timepos_t &, timepos_t &) const;
|
void marks_either_side (timepos_t const &, timepos_t &, timepos_t &) const;
|
||||||
|
|
||||||
|
@ -343,6 +346,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void sorted_section_locations (std::vector<LocationPair>&) const;
|
||||||
|
|
||||||
LocationList locations;
|
LocationList locations;
|
||||||
Location* current_location;
|
Location* current_location;
|
||||||
mutable Glib::Threads::RWLock _lock;
|
mutable Glib::Threads::RWLock _lock;
|
||||||
|
|
|
@ -1370,18 +1370,16 @@ Locations::set_state (const XMLNode& node, int version)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef std::pair<timepos_t,Location*> LocationPair;
|
|
||||||
|
|
||||||
struct LocationStartEarlierComparison
|
struct LocationStartEarlierComparison
|
||||||
{
|
{
|
||||||
bool operator() (LocationPair a, LocationPair b) {
|
bool operator() (Locations::LocationPair a, Locations::LocationPair b) {
|
||||||
return a.first < b.first;
|
return a.first < b.first;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LocationStartLaterComparison
|
struct LocationStartLaterComparison
|
||||||
{
|
{
|
||||||
bool operator() (LocationPair a, LocationPair b) {
|
bool operator() (Locations::LocationPair a, Locations::LocationPair b) {
|
||||||
return a.first > b.first;
|
return a.first > b.first;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1568,10 +1566,9 @@ Locations::marks_either_side (timepos_t const & pos, timepos_t& before, timepos_
|
||||||
before = *i;
|
before = *i;
|
||||||
}
|
}
|
||||||
|
|
||||||
Location*
|
void
|
||||||
Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
Locations::sorted_section_locations (vector<LocationPair>& locs) const
|
||||||
{
|
{
|
||||||
vector<LocationPair> locs;
|
|
||||||
{
|
{
|
||||||
Glib::Threads::RWLock::ReaderLock lm (_lock);
|
Glib::Threads::RWLock::ReaderLock lm (_lock);
|
||||||
|
|
||||||
|
@ -1586,6 +1583,13 @@ Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
||||||
|
|
||||||
LocationStartEarlierComparison cmp;
|
LocationStartEarlierComparison cmp;
|
||||||
sort (locs.begin(), locs.end(), cmp);
|
sort (locs.begin(), locs.end(), cmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
Location*
|
||||||
|
Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
||||||
|
{
|
||||||
|
vector<LocationPair> locs;
|
||||||
|
sorted_section_locations (locs);
|
||||||
|
|
||||||
if (locs.size () < 2) {
|
if (locs.size () < 2) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1619,6 +1623,30 @@ Locations::next_section (Location* l, timepos_t& start, timepos_t& end) const
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Location*
|
||||||
|
Locations::section_at (timepos_t const& when, timepos_t& start, timepos_t& end) const
|
||||||
|
{
|
||||||
|
vector<LocationPair> locs;
|
||||||
|
sorted_section_locations (locs);
|
||||||
|
|
||||||
|
if (locs.size () < 2) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Location* rv = NULL;
|
||||||
|
for (auto const& i: locs) {
|
||||||
|
if (when >= i.first) {
|
||||||
|
start = i.first;
|
||||||
|
rv = i.second;
|
||||||
|
} else {
|
||||||
|
end = i.first;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
Location*
|
Location*
|
||||||
Locations::session_range_location () const
|
Locations::session_range_location () const
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user