From 01aefd236a7c87fa1798334b579be28eaa832afd Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 19 Apr 2016 13:01:57 -0400 Subject: move SlavableAutomationControl into its own header --- libs/ardour/ardour/automation_control.h | 58 ------------ libs/ardour/ardour/gain_control.h | 2 +- libs/ardour/ardour/monitor_control.h | 2 +- libs/ardour/ardour/mute_control.h | 2 + libs/ardour/ardour/phase_control.h | 2 +- libs/ardour/ardour/record_enable_control.h | 2 +- libs/ardour/ardour/slavable_automation_control.h | 112 +++++++++++++++++++++++ libs/ardour/ardour/solo_control.h | 2 +- libs/ardour/ardour/solo_isolate_control.h | 3 +- libs/ardour/ardour/solo_safe_control.h | 2 + libs/ardour/slavable_automation_control.cc | 2 +- 11 files changed, 124 insertions(+), 65 deletions(-) create mode 100644 libs/ardour/ardour/slavable_automation_control.h 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); }; -class SlavableAutomationControl : public AutomationControl -{ - public: - SlavableAutomationControl(ARDOUR::Session&, - const Evoral::Parameter& parameter, - const ParameterDescriptor& desc, - boost::shared_ptr l=boost::shared_ptr(), - const std::string& name=""); - - double get_value () const; - - void add_master (boost::shared_ptr); - void remove_master (boost::shared_ptr); - void clear_masters (); - bool slaved_to (boost::shared_ptr) const; - bool slaved () const; - double get_masters_value () const { - Glib::Threads::RWLock::ReaderLock lm (master_lock); - return get_masters_value_locked (); - } - - std::vector masters () const; - - PBD::Signal0 MasterStatusChange; - - protected: - - class MasterRecord { - public: - MasterRecord (boost::shared_ptr gc, double r) - : _master (gc) - , _ratio (r) - {} - - boost::shared_ptr master() const { return _master; } - double ratio () const { return _ratio; } - void reset_ratio (double r) { _ratio = r; } - - PBD::ScopedConnection connection; - - private: - boost::shared_ptr _master; - double _ratio; - - }; - - mutable Glib::Threads::RWLock master_lock; - typedef std::map Masters; - Masters _masters; - PBD::ScopedConnectionList masters_connections; - virtual void master_changed (bool from_self, GroupControlDisposition gcd); - void master_going_away (boost::weak_ptr); - 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 #include -#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 +#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 #include -#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 #include -#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 l=boost::shared_ptr(), + const std::string& name=""); + + double get_value () const; + + void add_master (boost::shared_ptr); + void remove_master (boost::shared_ptr); + void clear_masters (); + bool slaved_to (boost::shared_ptr) const; + bool slaved () const; + double get_masters_value () const { + Glib::Threads::RWLock::ReaderLock lm (master_lock); + return get_masters_value_locked (); + } + + std::vector masters () const; + + PBD::Signal0 MasterStatusChange; + + protected: + + class MasterRecord { + public: + MasterRecord (boost::shared_ptr gc, double r) + : _master (gc) + , _ratio (r) + {} + + boost::shared_ptr 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 _master; + union { + double _ratio; + bool _yn; + }; + }; + + mutable Glib::Threads::RWLock master_lock; + typedef std::map Masters; + Masters _masters; + PBD::ScopedConnectionList masters_connections; + + void master_going_away (boost::weak_ptr); + double get_value_locked() const; + void actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override); + void update_boolean_masters_records (boost::shared_ptr); + bool get_boolean_masters () const; + + virtual void master_changed (bool from_self, GroupControlDisposition gcd, boost::shared_ptr); + 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) {} + virtual void post_add_master (boost::shared_ptr) {} + + +}; + +} // 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 -#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 +#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); 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 +#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; -- cgit v1.2.3