lock processor list and reconfigure processors after moving meter or control outs around in the list

git-svn-id: svn://localhost/ardour2/branches/3.0@6121 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2009-11-18 15:04:59 +00:00
parent b7cfd2849e
commit 964e3ee825

View file

@ -621,7 +621,7 @@ Route::muted() const
return _mute_master->muted (); return _mute_master->muted ();
} }
#if 0 #if 1
static void static void
dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs) dump_processors(const string& name, const list<boost::shared_ptr<Processor> >& procs)
{ {
@ -1399,9 +1399,13 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
list< pair<ChanCount,ChanCount> > configuration; list< pair<ChanCount,ChanCount> > configuration;
uint32_t index = 0; uint32_t index = 0;
cerr << _name << " CONFIGURE PROCESSORS\n";
dump_processors (_name, _processors);
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) { for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++index) {
if ((*p)->can_support_io_configuration(in, out)) { if ((*p)->can_support_io_configuration(in, out)) {
cerr << "\t" << (*p)->name() << " in = " << in << " out = " << out << endl;
configuration.push_back(make_pair(in, out)); configuration.push_back(make_pair(in, out));
in = out; in = out;
} else { } else {
@ -2616,9 +2620,14 @@ Route::flush_processors ()
void void
Route::set_meter_point (MeterPoint p, void *src) Route::set_meter_point (MeterPoint p, void *src)
{ {
if (_meter_point != p) { if (_meter_point == p) {
_meter_point = p; return;
}
{
Glib::RWLock::WriterLock lm (_processor_lock);
ProcessorList as_it_was (_processors);
// Move meter in the processors list // Move meter in the processors list
ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter); ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _meter);
_processors.erase(loc); _processors.erase(loc);
@ -2633,13 +2642,23 @@ Route::set_meter_point (MeterPoint p, void *src)
loc = _processors.end(); loc = _processors.end();
break; break;
} }
_processors.insert(loc, _meter); _processors.insert(loc, _meter);
meter_change (src); /* EMIT SIGNAL */ if (configure_processors_unlocked (0)) {
processors_changed (); /* EMIT SIGNAL */ _processors = as_it_was;
_session.set_dirty (); configure_processors_unlocked (0); // it worked before we tried to add it ...
return;
}
} }
_meter_point = p;
meter_change (src); /* EMIT SIGNAL */
processors_changed (); /* EMIT SIGNAL */
_session.set_dirty ();
} }
void void
Route::put_control_outs_at (Placement p) Route::put_control_outs_at (Placement p)
{ {
@ -2647,25 +2666,35 @@ Route::put_control_outs_at (Placement p)
return; return;
} }
// Move meter in the processors list {
ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs); Glib::RWLock::WriterLock lm (_processor_lock);
_processors.erase(loc); ProcessorList as_it_was (_processors);
// Move meter in the processors list
switch (p) { ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs);
case PreFader: _processors.erase(loc);
loc = find(_processors.begin(), _processors.end(), _amp);
if (loc != _processors.begin()) { switch (p) {
--loc; case PreFader:
loc = find(_processors.begin(), _processors.end(), _amp);
if (loc != _processors.begin()) {
--loc;
}
break;
case PostFader:
loc = find(_processors.begin(), _processors.end(), _amp);
assert (loc != _processors.end());
loc++;
break;
} }
break;
case PostFader: _processors.insert(loc, _control_outs);
loc = find(_processors.begin(), _processors.end(), _amp);
assert (loc != _processors.end());
loc++;
break;
}
_processors.insert(loc, _control_outs); if (configure_processors_unlocked (0)) {
_processors = as_it_was;
configure_processors_unlocked (0); // it worked before we tried to add it ...
return;
}
}
processors_changed (); /* EMIT SIGNAL */ processors_changed (); /* EMIT SIGNAL */
_session.set_dirty (); _session.set_dirty ();