multiple touches in a single automation pass now work; write mode works (with some interesting quirks); remove some debug output
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6963 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
5a33e0900c
commit
622e8c5b24
|
@ -1199,7 +1199,6 @@ AutomationLine::hide_selection ()
|
|||
void
|
||||
AutomationLine::list_changed ()
|
||||
{
|
||||
cerr << "AL " << &alist << " changed\n";
|
||||
queue_reset ();
|
||||
}
|
||||
|
||||
|
@ -1209,8 +1208,6 @@ AutomationLine::reset_callback (const AutomationList& events)
|
|||
ALPoints tmp_points;
|
||||
uint32_t npoints = events.size();
|
||||
|
||||
cerr << "Redraw with " << npoints << endl;
|
||||
|
||||
if (npoints == 0) {
|
||||
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
|
||||
delete *i;
|
||||
|
|
|
@ -182,6 +182,9 @@ class AutomationLine : public sigc::trackable, public PBD::StatefulThingWithGoin
|
|||
ArdourCanvas::Points line_points; /* coordinates for canvas line */
|
||||
vector<ControlPoint*> control_points; /* visible control points */
|
||||
|
||||
ArdourCanvas::Line* nascent_line; /* line */
|
||||
ArdourCanvas::Points nascent_line_points; /* coordinates for nascent canvas line */
|
||||
|
||||
struct ALPoint {
|
||||
double x;
|
||||
double y;
|
||||
|
|
|
@ -204,7 +204,7 @@ class AutomationList : public PBD::StatefulDestructible
|
|||
protected:
|
||||
|
||||
AutomationEventList events;
|
||||
AutomationEventList nascent_events;
|
||||
std::list<AutomationEventList*> nascent;
|
||||
mutable Glib::Mutex lock;
|
||||
int8_t _frozen;
|
||||
bool changed_when_thawed;
|
||||
|
|
|
@ -166,8 +166,11 @@ AutomationList::~AutomationList()
|
|||
delete (*x);
|
||||
}
|
||||
|
||||
for (AutomationEventList::iterator x = nascent_events.begin(); x != nascent_events.end(); ++x) {
|
||||
delete (*x);
|
||||
for (list<AutomationEventList*>::iterator n = nascent.begin(); n != nascent.end(); ++n) {
|
||||
for (AutomationEventList::iterator x = (*n)->begin(); x != (*n)->end(); ++x) {
|
||||
delete *x;
|
||||
}
|
||||
delete (*n);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -220,6 +223,12 @@ AutomationList::set_automation_state (AutoState s)
|
|||
{
|
||||
if (s != _state) {
|
||||
_state = s;
|
||||
|
||||
if (_state == Auto_Write) {
|
||||
Glib::Mutex::Lock lm (lock);
|
||||
nascent.push_back (new AutomationEventList);
|
||||
}
|
||||
|
||||
automation_state_changed (); /* EMIT SIGNAL */
|
||||
}
|
||||
}
|
||||
|
@ -238,7 +247,8 @@ AutomationList::start_touch ()
|
|||
{
|
||||
_touching = true;
|
||||
_new_touch = true;
|
||||
_touch_saved_point.when = -1.0;
|
||||
|
||||
nascent.push_back (new AutomationEventList);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -303,8 +313,15 @@ AutomationList::rt_add (double when, double value)
|
|||
return;
|
||||
}
|
||||
|
||||
assert (when > nascent_events.back()->when);
|
||||
nascent_events.push_back (point_factory (when, value));
|
||||
Glib::Mutex::Lock lm (lock, Glib::TRY_LOCK);
|
||||
|
||||
if (lm.locked()) {
|
||||
assert (!nascent.empty());
|
||||
if (!nascent.front()->empty()) {
|
||||
assert (when > nascent.front()->back()->when);
|
||||
}
|
||||
nascent.front()->push_back (point_factory (when, value));
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -313,76 +330,101 @@ AutomationList::merge_nascent ()
|
|||
{
|
||||
Glib::Mutex::Lock lm (lock);
|
||||
|
||||
if (nascent_events.empty()) {
|
||||
if (nascent.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
double lower = nascent_events.front()->when;
|
||||
bool preexisting = !events.empty();
|
||||
double clamp_time = nascent_events.back()->when + 1; // XXX FIX ME
|
||||
for (list<AutomationEventList*>::iterator n = nascent.begin(); n != nascent.end(); ++n) {
|
||||
AutomationEventList* nascent_events = *n;
|
||||
|
||||
if (!preexisting) {
|
||||
|
||||
events = nascent_events;
|
||||
|
||||
} else if (clamp_time < events.front()->when) {
|
||||
|
||||
/* all points in nascent are before the first existing point */
|
||||
|
||||
if (preexisting) {
|
||||
events.insert (events.begin(), point_factory (clamp_time, unlocked_eval (clamp_time)));
|
||||
if (nascent_events->empty()) {
|
||||
delete nascent_events;
|
||||
continue;
|
||||
}
|
||||
events.insert (events.begin(), nascent_events.begin(), nascent_events.end());
|
||||
|
||||
} else if (lower > events.back()->when) {
|
||||
|
||||
/* all points in nascent are after the last existing point */
|
||||
|
||||
events.insert (events.end(), nascent_events.begin(), nascent_events.end());
|
||||
|
||||
} else {
|
||||
|
||||
/* find the range that overaps with nascent events,
|
||||
and insert the contents of nascent events.
|
||||
*/
|
||||
double lower = nascent_events->front()->when;
|
||||
bool preexisting = !events.empty();
|
||||
double clamp_time = nascent_events->back()->when + 1; // XXX FIX ME
|
||||
|
||||
if (!preexisting) {
|
||||
|
||||
iterator i;
|
||||
iterator range_begin = events.end();
|
||||
iterator range_end = events.end();
|
||||
|
||||
for (i = events.begin(); i != events.end(); ++i) {
|
||||
events = *nascent_events;
|
||||
|
||||
if ((*i)->when >= lower) {
|
||||
} else if (clamp_time < events.front()->when) {
|
||||
|
||||
/* all points in nascent are before the first existing point */
|
||||
|
||||
if (preexisting) {
|
||||
events.insert (events.begin(), point_factory (clamp_time, unlocked_eval (clamp_time)));
|
||||
}
|
||||
events.insert (events.begin(), nascent_events->begin(), nascent_events->end());
|
||||
|
||||
} else if (lower > events.back()->when) {
|
||||
|
||||
/* all points in nascent are after the last existing point */
|
||||
|
||||
events.insert (events.end(), nascent_events->begin(), nascent_events->end());
|
||||
|
||||
} else {
|
||||
|
||||
/* find the range that overaps with nascent events,
|
||||
and insert the contents of nascent events.
|
||||
*/
|
||||
|
||||
iterator i;
|
||||
iterator range_begin = events.end();
|
||||
iterator range_end = events.end();
|
||||
|
||||
for (i = events.begin(); i != events.end(); ++i) {
|
||||
|
||||
if (range_begin == events.end()) {
|
||||
range_begin = i;
|
||||
}
|
||||
|
||||
if ((*i)->when > clamp_time) {
|
||||
range_end = i;
|
||||
break;
|
||||
if ((*i)->when >= lower) {
|
||||
|
||||
if (range_begin == events.end()) {
|
||||
range_begin = i;
|
||||
}
|
||||
|
||||
if ((*i)->when > clamp_time) {
|
||||
range_end = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert (range_begin != events.end());
|
||||
|
||||
double clamp_value;
|
||||
|
||||
if (preexisting) {
|
||||
clamp_value = unlocked_eval (clamp_time);
|
||||
|
||||
if (range_begin != events.begin()) {
|
||||
/* clamp point before */
|
||||
double preclamp_time = nascent_events->front()->when - 1;
|
||||
events.insert (range_begin, point_factory (preclamp_time, clamp_value));
|
||||
}
|
||||
}
|
||||
|
||||
events.insert (range_begin, nascent_events->begin(), nascent_events->end());
|
||||
|
||||
if (preexisting) {
|
||||
if (range_end != events.end()) {
|
||||
/* clamp point after */
|
||||
events.insert (range_begin, point_factory (clamp_time, clamp_value));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
events.erase (range_begin, range_end);
|
||||
}
|
||||
|
||||
assert (range_begin != events.end());
|
||||
|
||||
double clamp_value;
|
||||
|
||||
if (preexisting) {
|
||||
clamp_value = unlocked_eval (clamp_time);
|
||||
}
|
||||
|
||||
events.insert (range_begin, nascent_events.begin(), nascent_events.end());
|
||||
|
||||
if (preexisting) {
|
||||
events.insert (range_begin, point_factory (clamp_time, clamp_value));
|
||||
}
|
||||
|
||||
events.erase (range_begin, range_end);
|
||||
delete nascent_events;
|
||||
}
|
||||
|
||||
nascent_events.clear ();
|
||||
nascent.clear ();
|
||||
|
||||
if (_state == Auto_Write) {
|
||||
nascent.push_back (new AutomationEventList);
|
||||
}
|
||||
}
|
||||
|
||||
maybe_signal_changed ();
|
||||
|
|
Loading…
Reference in New Issue