diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 46c5b1f3c7..52be8c94b4 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -57,6 +57,7 @@ #include "ardour/soloable.h" #include "ardour/solo_control.h" #include "ardour/solo_safe_control.h" +#include "ardour/slavable.h" class RoutePinWindowProxy; @@ -83,13 +84,14 @@ class SoloIsolateControl; class PhaseControl; class MonitorControl; -class LIBARDOUR_API Route : public Stripable, +class LIBARDOUR_API Route : public GraphNode, + public Stripable, public Soloable, public Muteable, public Monitorable, public Automatable, public RouteGroupMember, - public GraphNode, + public Slavable, public boost::enable_shared_from_this { public: @@ -599,8 +601,6 @@ public: pframes_t nframes, int declick); bool slaved_to (boost::shared_ptr) const; - void vca_assign (boost::shared_ptr); - void vca_unassign (boost::shared_ptr); protected: friend class Session; @@ -611,8 +611,11 @@ public: void curve_reallocate (); virtual void set_block_size (pframes_t nframes); -protected: - virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; } + protected: + int assign_controls (boost::shared_ptr); + int unassign_controls (boost::shared_ptr); + + virtual framecnt_t check_initial_delay (framecnt_t nframes, framepos_t&) { return nframes; } void fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr io, pframes_t nframes); diff --git a/libs/ardour/ardour/vca.h b/libs/ardour/ardour/vca.h index 9af6436f6b..a3dfb3ec07 100644 --- a/libs/ardour/ardour/vca.h +++ b/libs/ardour/ardour/vca.h @@ -29,6 +29,7 @@ #include "ardour/automatable.h" #include "ardour/muteable.h" #include "ardour/soloable.h" +#include "ardour/slavable.h" #include "ardour/stripable.h" namespace ARDOUR { @@ -39,7 +40,7 @@ class SoloControl; class MuteControl; class MonitorControl; -class LIBARDOUR_API VCA : public Stripable, public Soloable, public Muteable, public Automatable, public boost::enable_shared_from_this { +class LIBARDOUR_API VCA : public Stripable, public Soloable, public Muteable, public Automatable, public Slavable, public boost::enable_shared_from_this { public: VCA (Session& session, uint32_t num, const std::string& name); ~VCA(); @@ -108,6 +109,10 @@ class LIBARDOUR_API VCA : public Stripable, public Soloable, public Muteable, pu virtual std::string send_name (uint32_t n) const { return std::string(); } virtual boost::shared_ptr master_send_enable_controllable () const { return boost::shared_ptr(); } + protected: + int assign_controls (boost::shared_ptr); + int unassign_controls (boost::shared_ptr); + private: uint32_t _number; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 78e0228382..301c7ba5c0 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -86,10 +86,10 @@ PBD::Signal3, boost::shared_ptr, Rout /** Base class for all routable/mixable objects (tracks and busses) */ Route::Route (Session& sess, string name, Flag flg, DataType default_type) - : Stripable (sess, name) + : GraphNode (sess._process_graph) + , Stripable (sess, name) , Muteable (sess, name) , Automatable (sess) - , GraphNode (sess._process_graph) , _active (true) , _signal_latency (0) , _signal_latency_at_amp_position (0) @@ -5447,16 +5447,18 @@ Route::slaved_to (boost::shared_ptr vca) const return _gain_control->slaved_to (vca->gain_control()); } -void -Route::vca_assign (boost::shared_ptr vca) +int +Route::assign_controls (boost::shared_ptr vca) { _gain_control->add_master (vca->gain_control()); _solo_control->add_master (vca->solo_control()); _mute_control->add_master (vca->mute_control()); + + return 0; } -void -Route::vca_unassign (boost::shared_ptr vca) +int +Route::unassign_controls (boost::shared_ptr vca) { if (!vca) { /* unassign from all */ @@ -5468,6 +5470,8 @@ Route::vca_unassign (boost::shared_ptr vca) _solo_control->remove_master (vca->solo_control()); _mute_control->remove_master (vca->mute_control()); } + + return 0; } bool diff --git a/libs/ardour/vca.cc b/libs/ardour/vca.cc index 0e33dca6e2..2ab84d5570 100644 --- a/libs/ardour/vca.cc +++ b/libs/ardour/vca.cc @@ -152,3 +152,30 @@ VCA::clear_all_solo_state () { _solo_control->clear_all_solo_state (); } + +int +VCA::assign_controls (boost::shared_ptr vca) +{ + _gain_control->add_master (vca->gain_control()); + _solo_control->add_master (vca->solo_control()); + _mute_control->add_master (vca->mute_control()); + + return 0; +} + +int +VCA::unassign_controls (boost::shared_ptr vca) +{ + if (!vca) { + /* unassign from all */ + _gain_control->clear_masters (); + _solo_control->clear_masters (); + _mute_control->clear_masters (); + } else { + _gain_control->remove_master (vca->gain_control()); + _solo_control->remove_master (vca->solo_control()); + _mute_control->remove_master (vca->mute_control()); + } + + return 0; +} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 17876f889b..9a9b650a66 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -211,6 +211,7 @@ libardour_sources = [ 'session_transport.cc', 'sidechain.cc', 'slave.cc', + 'slavable.cc', 'slavable_automation_control.cc', 'smf_source.cc', 'sndfile_helpers.cc',