From 2e3c25eca709b734297edc3f4487264cbf6c1a58 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 4 Jul 2016 09:25:31 -0400 Subject: [PATCH] make sure that rec-enable changes get to do their non-RT stuff before being queued for RT-context execution --- libs/ardour/ardour/automation_control.h | 6 ++++ libs/ardour/ardour/record_enable_control.h | 1 + libs/ardour/record_enable_control.cc | 32 ++++++++++++---------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index ecc16cb134..e15abbec46 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -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 diff --git a/libs/ardour/ardour/record_enable_control.h b/libs/ardour/ardour/record_enable_control.h index d631c500a3..c5cb65c597 100644 --- a/libs/ardour/ardour/record_enable_control.h +++ b/libs/ardour/ardour/record_enable_control.h @@ -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; diff --git a/libs/ardour/record_enable_control.cc b/libs/ardour/record_enable_control.cc index f71fd5034b..67375e7431 100644 --- a/libs/ardour/record_enable_control.cc +++ b/libs/ardour/record_enable_control.cc @@ -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"; + } +}