X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fautomation_control.h;h=e15abbec46ce58f0594b526d696b9b557c169b2c;hb=2e3c25eca709b734297edc3f4487264cbf6c1a58;hp=d24a0d9da96876173b8dbd34a1f490bae3895dca;hpb=bc487bb4b02a9780938d6cf8528c888e59161aa9;p=ardour.git diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index d24a0d9da9..e15abbec46 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -21,22 +21,29 @@ #ifndef __ardour_automation_control_h__ #define __ardour_automation_control_h__ +#include + +#include + #include #include -#include "evoral/types.hpp" #include "pbd/controllable.h" + +#include "evoral/types.hpp" #include "evoral/Control.hpp" -#include "ardour/libardour_visibility.h" #include "ardour/automation_list.h" +#include "ardour/control_group_member.h" #include "ardour/parameter_descriptor.h" +#include "ardour/libardour_visibility.h" + namespace ARDOUR { class Session; class Automatable; - +class ControlGroup; /** A PBD::Controllable with associated automation data (AutomationList) */ @@ -44,8 +51,9 @@ class LIBARDOUR_API AutomationControl : public PBD::Controllable , public Evoral::Control , public boost::enable_shared_from_this + , public ControlGroupMember { -public: + public: AutomationControl(ARDOUR::Session&, const Evoral::Parameter& parameter, const ParameterDescriptor& desc, @@ -82,8 +90,6 @@ public: void stop_touch(bool mark, double when); /* inherited from PBD::Controllable. - * Derived classes MUST call ::writable() to verify - * that writing to the parameter is legal at that time. */ double get_value () const; /* inherited from PBD::Controllable. @@ -94,10 +100,11 @@ public: /* automation related value setting */ virtual bool writable () const; /* Call to ::set_value() with no test for writable() because - * this is only used by automation playback. We would like - * to make it pure virtual + * this is only used by automation playback. */ - virtual void set_value_unchecked (double val) {} + void set_value_unchecked (double val) { + actually_set_value (val, PBD::Controllable::NoGroup); + } double lower() const { return _desc.lower; } double upper() const { return _desc.upper; } @@ -112,10 +119,34 @@ public: const ARDOUR::Session& session() const { return _session; } void commit_transaction (bool did_write); -protected: + protected: ARDOUR::Session& _session; + boost::shared_ptr _group; const ParameterDescriptor _desc; + + bool check_rt (double val, Controllable::GroupControlDisposition gcd); + + /* derived classes may reimplement this, but should either + call this explicitly inside their version OR make sure that the + Controllable::Changed signal is emitted when necessary. + */ + + 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 + declared to be a friend in ControlGroupMember. Oh well. + */ + friend class ControlGroup; + void set_group (boost::shared_ptr); };