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:
parent
d2f20120b7
commit
2e3c25eca7
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user