diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-04-19 13:01:57 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-05-31 15:30:41 -0400 |
commit | 01aefd236a7c87fa1798334b579be28eaa832afd (patch) | |
tree | 3c5143f3cc3df0d7e12cbb70fb9c4dc87f759921 /libs | |
parent | 6de4953be8dc5cd413b405d4801f086567923965 (diff) |
move SlavableAutomationControl into its own header
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/automation_control.h | 58 | ||||
-rw-r--r-- | libs/ardour/ardour/gain_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/monitor_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/mute_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/phase_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/record_enable_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/slavable_automation_control.h | 112 | ||||
-rw-r--r-- | libs/ardour/ardour/solo_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/solo_isolate_control.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/solo_safe_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/slavable_automation_control.cc | 2 |
11 files changed, 124 insertions, 65 deletions
diff --git a/libs/ardour/ardour/automation_control.h b/libs/ardour/ardour/automation_control.h index 6195f90a68..ecc16cb134 100644 --- a/libs/ardour/ardour/automation_control.h +++ b/libs/ardour/ardour/automation_control.h @@ -143,64 +143,6 @@ class LIBARDOUR_API AutomationControl void set_group (boost::shared_ptr<ControlGroup>); }; -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=""); - - 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; - double get_masters_value () const { - Glib::Threads::RWLock::ReaderLock lm (master_lock); - return get_masters_value_locked (); - } - - 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; - void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override); -}; - } // namespace ARDOUR diff --git a/libs/ardour/ardour/gain_control.h b/libs/ardour/ardour/gain_control.h index 32d1ad1229..f7041fff78 100644 --- a/libs/ardour/ardour/gain_control.h +++ b/libs/ardour/ardour/gain_control.h @@ -27,7 +27,7 @@ #include "evoral/Parameter.hpp" -#include "ardour/automation_control.h" +#include "ardour/slavable_automation_control.h" #include "ardour/libardour_visibility.h" namespace ARDOUR { diff --git a/libs/ardour/ardour/monitor_control.h b/libs/ardour/ardour/monitor_control.h index 871263a0c6..587d8ca58c 100644 --- a/libs/ardour/ardour/monitor_control.h +++ b/libs/ardour/ardour/monitor_control.h @@ -24,7 +24,7 @@ #include <boost/shared_ptr.hpp> #include <boost/dynamic_bitset.hpp> -#include "ardour/automation_control.h" +#include "ardour/slavable_automation_control.h" #include "ardour/monitorable.h" #include "ardour/libardour_visibility.h" diff --git a/libs/ardour/ardour/mute_control.h b/libs/ardour/ardour/mute_control.h index f7a7814f00..a9169d65bd 100644 --- a/libs/ardour/ardour/mute_control.h +++ b/libs/ardour/ardour/mute_control.h @@ -23,6 +23,8 @@ #include <boost/shared_ptr.hpp> +#include "ardour/slavable_automation_control.h" + #include "ardour/libardour_visibility.h" namespace ARDOUR { diff --git a/libs/ardour/ardour/phase_control.h b/libs/ardour/ardour/phase_control.h index 054ad4a5a4..0693c8ee50 100644 --- a/libs/ardour/ardour/phase_control.h +++ b/libs/ardour/ardour/phase_control.h @@ -24,7 +24,7 @@ #include <boost/shared_ptr.hpp> #include <boost/dynamic_bitset.hpp> -#include "ardour/automation_control.h" +#include "ardour/slavable_automation_control.h" #include "ardour/libardour_visibility.h" namespace ARDOUR { diff --git a/libs/ardour/ardour/record_enable_control.h b/libs/ardour/ardour/record_enable_control.h index 0bb5edac8d..d631c500a3 100644 --- a/libs/ardour/ardour/record_enable_control.h +++ b/libs/ardour/ardour/record_enable_control.h @@ -24,7 +24,7 @@ #include <boost/shared_ptr.hpp> #include <boost/dynamic_bitset.hpp> -#include "ardour/automation_control.h" +#include "ardour/slavable_automation_control.h" #include "ardour/recordable.h" #include "ardour/libardour_visibility.h" diff --git a/libs/ardour/ardour/slavable_automation_control.h b/libs/ardour/ardour/slavable_automation_control.h new file mode 100644 index 0000000000..1f1847fb03 --- /dev/null +++ b/libs/ardour/ardour/slavable_automation_control.h @@ -0,0 +1,112 @@ +/* + Copyright (C) 2016 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __ardour_slavable_automation_control_h__ +#define __ardour_slavable_automation_control_h__ + +#include "ardour/automation_control.h" + +namespace ARDOUR { + +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=""); + + 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; + double get_masters_value () const { + Glib::Threads::RWLock::ReaderLock lm (master_lock); + return get_masters_value_locked (); + } + + 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; } + + /* for boolean/toggled controls, we store a boolean value to + * indicate if this master returned true/false (1.0/0.0) from + * ::get_value() after its most recent change. + */ + + bool yn() const { return _yn; } + void set_yn (bool yn) { _yn = yn; } + + /* for non-boolean/non-toggled controls, we store a ratio that + * connects the value of the master with the value of this + * slave. See comments in the source for more details on how + * this is computed and used. + */ + + double ratio () const { return _ratio; } + void reset_ratio (double r) { _ratio = r; } + + PBD::ScopedConnection connection; + + private: + boost::shared_ptr<AutomationControl> _master; + union { + double _ratio; + bool _yn; + }; + }; + + mutable Glib::Threads::RWLock master_lock; + typedef std::map<PBD::ID,MasterRecord> Masters; + Masters _masters; + PBD::ScopedConnectionList masters_connections; + + void master_going_away (boost::weak_ptr<AutomationControl>); + double get_value_locked() const; + void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override); + void update_boolean_masters_records (boost::shared_ptr<AutomationControl>); + bool get_boolean_masters () const; + + virtual void master_changed (bool from_self, GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>); + virtual void recompute_masters_ratios (double val) { /* do nothing by default */} + virtual double get_masters_value_locked () const; + virtual void pre_remove_master (boost::shared_ptr<AutomationControl>) {} + virtual void post_add_master (boost::shared_ptr<AutomationControl>) {} + + +}; + +} // namespace ARDOUR + +#endif /* __ardour_slavable_automation_control_h__ */ diff --git a/libs/ardour/ardour/solo_control.h b/libs/ardour/ardour/solo_control.h index d034456a3b..aefd6abb79 100644 --- a/libs/ardour/ardour/solo_control.h +++ b/libs/ardour/ardour/solo_control.h @@ -23,7 +23,7 @@ #include <boost/shared_ptr.hpp> -#include "ardour/automation_control.h" +#include "ardour/slavable_automation_control.h" #include "ardour/libardour_visibility.h" namespace ARDOUR { diff --git a/libs/ardour/ardour/solo_isolate_control.h b/libs/ardour/ardour/solo_isolate_control.h index cb8ea8b507..1e49469067 100644 --- a/libs/ardour/ardour/solo_isolate_control.h +++ b/libs/ardour/ardour/solo_isolate_control.h @@ -23,6 +23,7 @@ #include <boost/shared_ptr.hpp> +#include "ardour/slavable_automation_control.h" #include "ardour/libardour_visibility.h" class XMLNode; @@ -72,7 +73,7 @@ class LIBARDOUR_API SoloIsolateControl : public SlavableAutomationControl XMLNode& get_state (); protected: - void master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd); + void master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd, boost::shared_ptr<AutomationControl>); void actually_set_value (double, PBD::Controllable::GroupControlDisposition group_override); private: diff --git a/libs/ardour/ardour/solo_safe_control.h b/libs/ardour/ardour/solo_safe_control.h index d230a9c2d9..e969959e94 100644 --- a/libs/ardour/ardour/solo_safe_control.h +++ b/libs/ardour/ardour/solo_safe_control.h @@ -21,6 +21,8 @@ #include <string> +#include "ardour/slavable_automation_control.h" + #include "ardour/libardour_visibility.h" class XMLNode; diff --git a/libs/ardour/slavable_automation_control.cc b/libs/ardour/slavable_automation_control.cc index 624fa484ca..72ddae7929 100644 --- a/libs/ardour/slavable_automation_control.cc +++ b/libs/ardour/slavable_automation_control.cc @@ -21,7 +21,7 @@ #include "pbd/enumwriter.h" -#include "ardour/automation_control.h" +#include "ardour/slavable_automation_control.h" #include "ardour/session.h" using namespace std; |