25 #define isnan_local(val) (bool)_isnan((double)val)
27 #define isnan_local std::isnan
78 : _parameter(other._parameter)
80 , _interpolation(other._interpolation)
104 : _parameter(other._parameter)
106 , _interpolation(other._interpolation)
123 if (!section->empty()) {
138 for (EventList::iterator x =
_events.begin(); x !=
_events.end(); ++x) {
160 if (
this != &other) {
179 Glib::Threads::RWLock::WriterLock lm (
_lock);
217 Glib::Threads::RWLock::WriterLock lm (
_lock);
229 Glib::Threads::RWLock::WriterLock lm (
_lock);
236 Glib::Threads::RWLock::WriterLock lm (
_lock);
240 double factor = when /
_events.back()->when;
249 (*i)->when *= factor;
268 bool changed =
false;
271 Glib::Threads::RWLock::WriterLock lm (
_lock);
291 double area = fabs ((prevprev->
when * (prev->
value - cur->
value)) +
295 if (area < thinning_factor) {
331 Glib::Threads::RWLock::WriterLock lm (
_lock);
341 Glib::Threads::RWLock::WriterLock lm (
_lock);
354 Glib::Threads::RWLock::WriterLock lm (
_lock);
376 thin (thinning_factor);
390 if (yn && add_point) {
409 }
else if ((*most_recent_insert_iterator)->when == when) {
431 this, eval_value, (*most_recent_insert_iterator)->when));
487 if ((*most_recent_insert_iterator)->when - when > 64) {
494 new ControlEvent (when + 1, (*most_recent_insert_iterator)->value));
497 (*most_recent_insert_iterator)->value));
510 if (
_events.back()->value == value) {
512 EventList::iterator b =
_events.end();
520 if ((*b)->value == value) {
534 while (iter !=
_events.end()) {
535 if ((*iter)->when < when) {
540 }
else if ((*iter)->when >= when) {
556 string_compose (
"@%1 add %2 at %3 guards = %4 write pass = %5 (new? %6) at end? %7\n",
560 Glib::Threads::RWLock::WriterLock lm (
_lock);
564 if (
_events.empty() && with_default) {
626 }
else if ((*most_recent_insert_iterator)->when == when) {
628 if ((*most_recent_insert_iterator)->value != value) {
635 (*most_recent_insert_iterator)->value = value;
642 if (
_events.back()->when == when) {
675 Glib::Threads::RWLock::WriterLock lm (
_lock);
689 Glib::Threads::RWLock::WriterLock lm (
_lock);
702 Glib::Threads::RWLock::WriterLock lm (
_lock);
705 while (i !=
end() && ((*i)->when != when || (*i)->value != value)) {
728 Glib::Threads::RWLock::WriterLock lm (
_lock);
750 if ((s = lower_bound (events.begin(), events.end(), &cp,
time_comparator)) != events.end()) {
767 Glib::Threads::RWLock::WriterLock lm (
_lock);
773 while (before !=
_events.end()) {
774 (*before)->when += distance;
788 Glib::Threads::RWLock::WriterLock lm (
_lock);
791 if ((*i)->when >= pos) {
792 (*i)->when += frames;
811 Glib::Threads::RWLock::WriterLock lm (
_lock);
813 (*iter)->when = when;
814 (*iter)->value = val;
832 std::pair<ControlList::iterator,ControlList::iterator>
835 Glib::Threads::RWLock::ReaderLock lm (
_lock);
838 std::pair<iterator,iterator> ret;
845 if (ret.first ==
_events.end()) {
846 if ((*i)->when >= xval) {
856 if ((*i)->when > xval) {
881 Glib::Threads::RWLock::WriterLock lm (
_lock);
911 Glib::Threads::RWLock::WriterLock lm (
_lock);
920 if (last_coordinate ==
_events.back()->when) {
924 if (last_coordinate >
_events.back()->when) {
934 }
else if (++foo ==
_events.end()) {
954 if (
_events.back()->value == (*penultimate)->value) {
955 _events.back()->when = last_coordinate;
966 last_val = max ((
double)
_min_yval, last_val);
967 last_val = min ((
double)
_max_yval, last_val);
983 while (i !=
_events.rend() && sz > 2) {
989 if ((*i)->when < last_coordinate) {
999 _events.back()->when = last_coordinate;
1000 _events.back()->value = last_val;
1014 Glib::Threads::RWLock::WriterLock lm (
_lock);
1016 double first_legal_value;
1017 double first_legal_coordinate;
1022 }
else if (overall_length ==
_events.back()->when) {
1027 if (overall_length >
_events.back()->when) {
1034 for (np = 0, i =
_events.begin(); i !=
_events.end(); ++i, ++np) {
1035 (*i)->when +=
shift;
1053 if (
_events.front()->value == (*second)->value) {
1066 first_legal_coordinate =
_events.back()->when - overall_length;
1068 first_legal_value = max (
_min_yval, first_legal_value);
1069 first_legal_value = min (
_max_yval, first_legal_value);
1081 if ((*i)->when > first_legal_coordinate) {
1096 (*i)->when -= first_legal_coordinate;
1114 pair<EventList::iterator,EventList::iterator> range;
1121 for (npoints = 0; npoints < 4; ++npoints, ++length_check_iter) {
1122 if (length_check_iter ==
_events.end()) {
1132 return _events.front()->value;
1135 if (x >=
_events.back()->when) {
1137 }
else if (x <=
_events.front()->when) {
1138 return _events.front()->value;
1142 lval =
_events.front()->value;
1151 fraction = (double) (x - lpos) / (double) (upos - lpos);
1152 return lval + (fraction * (uval - lval));
1155 if (x >=
_events.back()->when) {
1157 }
else if (x <=
_events.front()->when) {
1158 return _events.front()->value;
1184 if (i ==
_events.begin() || (*i)->when == x)
1187 return (*(--i))->value;
1204 if (range.first == range.second) {
1210 if (range.first !=
_events.begin()) {
1212 lpos = (*range.first)->when;
1213 lval = (*range.first)->value;
1217 return _events.front()->value;
1220 if (range.second ==
_events.end()) {
1225 upos = (*range.second)->when;
1226 uval = (*range.second)->value;
1232 fraction = (double) (x - lpos) / (double) (upos - lpos);
1233 return lval + (fraction * (uval - lval));
1239 return (*range.first)->value;
1279 Glib::Threads::RWLock::ReaderLock lm(
_lock, Glib::Threads::TRY_LOCK);
1321 const bool past_start = (inclusive ? first->
when >= start : first->
when >
start);
1362 }
else if (
_events.end() == ++length_check_iter) {
1391 if (inclusive && first->
when == start) {
1398 }
else if (next->
when < start || (!inclusive && next->
when == start)) {
1404 if (next->
when > start) {
1416 const double slope = (next->
value - first->
value) / (
double)(next->
when - first->
when);
1427 x = first->
when + (y - first->
value) / (
double)slope;
1429 while ((inclusive && x < start) || (x <= start && y != next->
value)) {
1436 x = first->
when + (y - first->
value) / (
double)slope;
1443 assert( (y >= first->
value && y <= next->value)
1444 || (y <= first->value && y >= next->
value) );
1447 const bool past_start = (inclusive ? x >= start : x >
start);
1452 assert(inclusive ? x >= start : x > start);
1483 Glib::Threads::RWLock::WriterLock lm (
_lock);
1514 if ((*s)->when != start) {
1519 if (start >
_events.front()->when) {
1536 nal->_events.push_back (
new ControlEvent ((*x)->when - start, (*x)->value));
1546 if (e ==
_events.end() || (*e)->when !=
end) {
1551 if (op == 0 && (e !=
_events.end() && end < (*e)->when)) {
1555 if (op != 2 && (e !=
_events.end() && end < (*e)->when)) {
1556 nal->_events.push_back (
new ControlEvent (end - start, end_value));
1599 Glib::Threads::RWLock::WriterLock lm (
_lock);
1608 double value = (*i)->value;
1612 value -= src_desc.
lower;
1618 end = (*i)->when + pos;
1626 while (where !=
_events.end()) {
1628 if ((*where)->when <= end) {
1653 typedef list< RangeMove<double> > RangeMoveList;
1656 Glib::Threads::RWLock::WriterLock lm (
_lock);
1662 bool things_erased =
false;
1663 for (RangeMoveList::const_iterator i = movements.begin (); i != movements.end (); ++i) {
1666 things_erased =
true;
1670 things_erased =
true;
1675 if (!things_erased) {
1680 for (RangeMoveList::const_iterator i = movements.begin (); i != movements.end (); ++i) {
1682 const double limit = i->from + i->length;
1683 const double dx = i->to - i->from;
1684 while (j != old_events.end () && (*j)->when <= limit) {
1685 if ((*j)->when >= i->from) {
1726 EventList::const_iterator i =
_events.begin ();
1727 EventList::const_iterator j = other.
_events.begin ();
1729 while (i !=
_events.end() && (*i)->when == (*j)->when && (*i)->value == (*j)->value) {
1752 for (EventList::iterator x =
_events.begin(); x !=
_events.end(); ++x) {
1753 o << (*x)->value <<
" @ " << (uint64_t) (*x)->when << endl;
const ParameterDescriptor & descriptor() const
bool operator()(ControlEvent *a, ControlEvent *b)
boost::shared_ptr< ControlList > cut_copy_clear(double, double, int op)
float lower
Minimum value (in Hz, for frequencies)
float normal
Default value.
void write_pass_finished(double when, double thinning_factor=0.0)
bool rt_safe_earliest_event_discrete_unlocked(double start, double &x, double &y, bool inclusive) const
Glib::Threads::RWLock _lock
void x_scale(double factor)
std::list< ControlEvent * > EventList
bool in_write_pass() const
ControlList::const_iterator first
bool rt_safe_earliest_event_linear_unlocked(double start, double &x, double &y, bool inclusive) const
void build_search_cache_if_necessary(double start) const
void set_interpolation(InterpolationStyle)
void start_write_pass(double time)
void unlocked_invalidate_insert_iterator()
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
void add_guard_point(double when)
PBD::Signal0< void > Dirty
virtual void maybe_signal_changed()
bool did_write_during_pass
bool maybe_insert_straight_line(double when, double value)
void modify(iterator, double, double)
bool erase_range_internal(double start, double end, EventList &)
void dump(std::ostream &)
bool operator!=(ControlList const &) const
ParameterDescriptor _desc
float upper
Maximum value (in Hz, for frequencies)
void thin(double thinning_factor)
virtual boost::shared_ptr< ControlList > create(const Parameter &id, const ParameterDescriptor &desc)
bool event_time_less_than(ControlEvent *a, ControlEvent *b)
virtual void editor_add(double when, double value)
void copy_events(const ControlList &)
#define DEBUG_TRACE(bits, str)
void fast_simple_add(double when, double value)
boost::shared_ptr< ControlList > cut(double, double)
PBD::Signal1< void, InterpolationStyle > InterpolationChanged
const Parameter & parameter() const
double unlocked_eval(double x) const
bool _changed_when_thawed
void set_in_write_pass(bool, bool add_point=false, double when=0.0)
iterator most_recent_insert_iterator
void truncate_start(double length)
double multipoint_eval(double x) const
SearchCache _search_cache
std::pair< ControlList::const_iterator, ControlList::const_iterator > range
void shift(double before, double distance)
boost::shared_ptr< ControlList > copy(double, double)
bool operator==(const ControlList &)
bool rt_safe_earliest_event_unlocked(double start, double &x, double &y, bool start_inclusive=false) const
LIBEVORAL_API uint64_t ControlList
bool toggled
True iff parameter is boolean.
void _x_scale(double factor)
bool move_ranges(std::list< RangeMove< double > > const &)
bool paste(const ControlList &, double position, float times)
EventList::const_iterator const_iterator
void maybe_add_insert_guard(double when)
EventList::reverse_iterator reverse_iterator
ControlList(const Parameter &id, const ParameterDescriptor &desc)
void erase_range(double start, double end)
void slide(iterator before, double distance)
iterator erase_from_iterator_to(iterator iter, double when)
bool rt_safe_earliest_event(double start, double &x, double &y, bool start_inclusive=false) const
LookupCache _lookup_cache
virtual void add(double when, double value, bool with_guards=true, bool with_default=true)
void truncate_end(double length)
ControlList & operator=(const ControlList &)
void invalidate_insert_iterator()
static bool time_comparator(const ControlEvent *a, const ControlEvent *b)
std::pair< ControlList::iterator, ControlList::iterator > control_points_adjacent(double when)
EventList::iterator iterator
std::string string_compose(const std::string &fmt, const T1 &o1)
InterpolationStyle _interpolation