make sure that rec-enable changes get to do their non-RT stuff before being queued for RT-context execution

This commit is contained in:
Paul Davis 2016-07-04 09:25:31 -04:00
parent d2f20120b7
commit 2e3c25eca7
3 changed files with 24 additions and 15 deletions

View File

@ -134,6 +134,12 @@ class LIBARDOUR_API AutomationControl
virtual void actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
/* Session needs to call this method before it queues up the real
change for execution in a realtime context. C++ access control sucks.
*/
friend class Session;
virtual void do_pre_realtime_queue_stuff (double new_value) {}
private:
/* I am unclear on why we have to make ControlGroup a friend in order
to get access to the ::set_group() method when it is already

View File

@ -50,6 +50,7 @@ class LIBARDOUR_API RecordEnableControl : public SlavableAutomationControl
protected:
void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
void do_pre_realtime_queue_stuff (double value);
private:
Recordable& _recordable;

View File

@ -39,21 +39,6 @@ RecordEnableControl::RecordEnableControl (Session& session, std::string const &
void
RecordEnableControl::set_value (double val, Controllable::GroupControlDisposition gcd)
{
/* do the non-RT part of rec-enabling first - the RT part will be done
* on the next process cycle. This does mean that theoretically we are
* doing things provisionally on the assumption that the rec-enable
* change will work, but this had better be a solid assumption for
* other reasons.
*/
if (!AudioEngine::instance()->in_process_thread()) {
if (_recordable.prep_record_enabled (val)) {
/* failed */
std::cerr << "Prep rec-enable failed\n";
return;
}
}
/* Because we are marked as a RealTime control, this will queue
up the control change to be executed in a realtime context.
*/
@ -71,3 +56,20 @@ RecordEnableControl::actually_set_value (double val, Controllable::GroupControlD
SlavableAutomationControl::actually_set_value (val, gcd);
}
void
RecordEnableControl::do_pre_realtime_queue_stuff (double newval)
{
/* do the non-RT part of rec-enabling first - the RT part will be done
* on the next process cycle. This does mean that theoretically we are
* doing things provisionally on the assumption that the rec-enable
* change will work, but this had better be a solid assumption for
* other reasons.
*
* this is guaranteed to be called from a non-process thread.
*/
if (_recordable.prep_record_enabled (newval)) {
/* failed */
std::cerr << "Prep rec-enable failed\n";
}
}