13
0

use a lock to set/get AutomationList automation state

It isn't 100% clear that we should use the list's data lock, but it seems quite likely
that this is the correct design, because of the interlock between data being present
and automation state
This commit is contained in:
Paul Davis 2017-08-12 14:38:56 -04:00
parent 3ff352be79
commit 8402537493
2 changed files with 19 additions and 8 deletions

View File

@ -85,7 +85,7 @@ public:
bool paste (const ControlList&, double, DoubleBeatsFramesConverter const&);
void set_automation_state (AutoState);
AutoState automation_state() const { return _state; }
AutoState automation_state() const;
PBD::Signal1<void, AutoState> automation_state_changed;
bool automation_playback() const {

View File

@ -192,16 +192,28 @@ AutomationList::maybe_signal_changed ()
}
}
AutoState
AutomationList::automation_state() const
{
Glib::Threads::RWLock::ReaderLock lm (Evoral::ControlList::_lock);
return _state;
}
void
AutomationList::set_automation_state (AutoState s)
{
if (s == _state) {
return;
}
_state = s;
if (s == Write && _desc.toggled) {
snapshot_history (true);
{
Glib::Threads::RWLock::ReaderLock lm (Evoral::ControlList::_lock);
if (s == _state) {
return;
}
_state = s;
if (s == Write && _desc.toggled) {
snapshot_history (true);
}
}
automation_state_changed (s); /* EMIT SIGNAL */
}
@ -588,4 +600,3 @@ AutomationListProperty::clone () const
boost::shared_ptr<AutomationList> (new AutomationList (*this->_current.get()))
);
}