#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;
: public PBD::Controllable
, public Evoral::Control
, public boost::enable_shared_from_this<AutomationControl>
+ , public ControlGroupMember
{
public:
AutomationControl(ARDOUR::Session&,
const ARDOUR::Session& session() const { return _session; }
void commit_transaction (bool did_write);
- void set_group (boost::shared_ptr<ControlGroup>);
-
protected:
ARDOUR::Session& _session;
boost::shared_ptr<ControlGroup> _group;
*/
virtual void actually_set_value (double value, PBD::Controllable::GroupControlDisposition);
-};
-
-class SlavableAutomationControl : public AutomationControl
-{
- public:
- SlavableAutomationControl(ARDOUR::Session&,
- const Evoral::Parameter& parameter,
- const ParameterDescriptor& desc,
- boost::shared_ptr<ARDOUR::AutomationList> l=boost::shared_ptr<ARDOUR::AutomationList>(),
- const std::string& name="");
-
- ~SlavableAutomationControl ();
- double get_value () const;
-
- void add_master (boost::shared_ptr<AutomationControl>);
- void remove_master (boost::shared_ptr<AutomationControl>);
- void clear_masters ();
- bool slaved_to (boost::shared_ptr<AutomationControl>) const;
- bool slaved () const;
- std::vector<PBD::ID> masters () const;
-
- PBD::Signal0<void> MasterStatusChange;
-
- protected:
-
- class MasterRecord {
- public:
- MasterRecord (boost::shared_ptr<AutomationControl> gc, double r)
- : _master (gc)
- , _ratio (r)
- {}
-
- boost::shared_ptr<AutomationControl> master() const { return _master; }
- double ratio () const { return _ratio; }
- void reset_ratio (double r) { _ratio = r; }
-
- PBD::ScopedConnection connection;
-
- private:
- boost::shared_ptr<AutomationControl> _master;
- double _ratio;
-
- };
-
- mutable Glib::Threads::RWLock master_lock;
- typedef std::map<PBD::ID,MasterRecord> Masters;
- Masters _masters;
- PBD::ScopedConnectionList masters_connections;
- virtual void master_changed (bool from_self, GroupControlDisposition gcd);
- void master_going_away (boost::weak_ptr<AutomationControl>);
- virtual void recompute_masters_ratios (double val) { /* do nothing by default */}
- virtual double get_masters_value_locked () const;
- double get_value_locked() const;
+ /* 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<ControlGroup>);
};