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);
|
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:
|
private:
|
||||||
/* I am unclear on why we have to make ControlGroup a friend in order
|
/* 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
|
to get access to the ::set_group() method when it is already
|
||||||
|
|
|
@ -50,6 +50,7 @@ class LIBARDOUR_API RecordEnableControl : public SlavableAutomationControl
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
|
void actually_set_value (double val, Controllable::GroupControlDisposition gcd);
|
||||||
|
void do_pre_realtime_queue_stuff (double value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Recordable& _recordable;
|
Recordable& _recordable;
|
||||||
|
|
|
@ -39,21 +39,6 @@ RecordEnableControl::RecordEnableControl (Session& session, std::string const &
|
||||||
void
|
void
|
||||||
RecordEnableControl::set_value (double val, Controllable::GroupControlDisposition gcd)
|
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
|
/* Because we are marked as a RealTime control, this will queue
|
||||||
up the control change to be executed in a realtime context.
|
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);
|
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