Aux-Send Latency compensation, part 2 & code-consolidation
[ardour.git] / libs / ardour / ardour / gain_control.h
index 15be6d684f2cee9f806c00abadbada118ae47250..a2644582cef69d20a39e01bb21059432bcfd9344 100644 (file)
 #define __ardour_gain_control_h__
 
 #include <string>
-#include <set>
 
 #include <boost/shared_ptr.hpp>
-#include <glibmm/threads.h>
 
 #include "pbd/controllable.h"
 
 #include "evoral/Parameter.hpp"
 
-#include "ardour/automation_control.h"
+#include "ardour/slavable_automation_control.h"
 #include "ardour/libardour_visibility.h"
 
 namespace ARDOUR {
 
 class Session;
 
-class LIBARDOUR_API GainControl : public AutomationControl {
+class LIBARDOUR_API GainControl : public SlavableAutomationControl {
   public:
        GainControl (Session& session, const Evoral::Parameter &param,
                     boost::shared_ptr<AutomationList> al = boost::shared_ptr<AutomationList>());
 
-       double get_value () const;
-       void set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
-       void set_value_unchecked (double);
-
-       double internal_to_interface (double) const;
-       double interface_to_internal (double) const;
-       double internal_to_user (double) const;
-       double user_to_internal (double) const;
-       std::string get_user_string () const;
-
-       double lower_db;
-       double range_db;
-
-       gain_t get_master_gain () const;
-       void add_master (boost::shared_ptr<VCA>);
-       void remove_master (boost::shared_ptr<VCA>);
-       void clear_masters ();
-       bool slaved_to (boost::shared_ptr<VCA>) const;
-       bool slaved () const;
-       std::vector<uint32_t> masters () const;
-
-       PBD::Signal0<void> VCAStatusChange;
-
-       int set_state (XMLNode const&, int);
-       XMLNode& get_state();
-
-  private:
-       class MasterRecord {
-          public:
-               MasterRecord (boost::shared_ptr<GainControl> gc, uint32_t n, double r)
-                       : _master (gc)
-                       , _number (n)
-                       , _ratio (r)
-               {}
-
-               boost::shared_ptr<GainControl> master() const { return _master; }
-               double ratio () const { return _ratio; }
-               uint32_t number() const { return _number; }
-
-               bool operator== (MasterRecord const& other) const {
-                       return _number == other._number;
-               }
-
-               bool operator< (MasterRecord const& other) const {
-                       return _number < other._number;
-               }
-
-               void reset_ratio (double r) { _ratio = r; }
-
-         private:
-               const boost::shared_ptr<GainControl> _master;
-               const uint32_t _number;
-               double _ratio;
-       };
-
-       mutable Glib::Threads::RWLock master_lock;
-       typedef std::set<MasterRecord> Masters;
-       Masters _masters;
-       PBD::ScopedConnectionList masters_connections;
-       std::string _masters_state_string ();
-
-       gain_t get_master_gain_locked () const;
-       void master_going_away (boost::weak_ptr<VCA>);
-       void recompute_masters_ratios (double val);
-       
-       void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
+       void inc_gain (gain_t);
+
+protected:
+       void post_add_master (boost::shared_ptr<AutomationControl>);
+       bool get_masters_curve_locked (samplepos_t, samplepos_t, float*, samplecnt_t) const;
 };
 
 } /* namespace */