start shaping up VCA assign process
authorPaul Davis <paul@linuxaudiosystems.com>
Tue, 1 Mar 2016 02:26:45 +0000 (21:26 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 May 2016 19:30:38 +0000 (15:30 -0400)
gtk2_ardour/mixer_actor.cc
gtk2_ardour/mixer_actor.h
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h
gtk2_ardour/mixer_ui.cc
gtk2_ardour/mixer_ui.h
libs/ardour/ardour/gain_control.h
libs/ardour/ardour/route.h
libs/ardour/gain_control.cc
libs/ardour/route.cc

index ada3b3f500d2ce10fde3f38beccb49f805ed291e..7ffcc6f3a8698213f7f1546fe63bf917e6cc30fb 100644 (file)
@@ -250,3 +250,30 @@ MixerActor::ab_plugins ()
        }
 }
 
        }
 }
 
+void
+MixerActor::vca_assign (boost::shared_ptr<VCA> vca)
+{
+       set_route_targets_for_operation ();
+
+       BOOST_FOREACH(RouteUI* r, _route_targets) {
+               MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+               if (ms) {
+                       ms->vca_assign (vca);
+               }
+       }
+}
+
+void
+MixerActor::vca_unassign (boost::shared_ptr<VCA> vca)
+{
+       set_route_targets_for_operation ();
+
+       BOOST_FOREACH(RouteUI* r, _route_targets) {
+               MixerStrip* ms = dynamic_cast<MixerStrip*> (r);
+               if (ms) {
+                       ms->vca_unassign (vca);
+               }
+       }
+}
+
+
index 6e941476047e4e72974bbf96a572acee80809ad3..16b450133d9e9e5fcacfb41c1021281ab224621d 100644 (file)
@@ -29,6 +29,10 @@ namespace Gtk {
        class ActionGroup;
 }
 
        class ActionGroup;
 }
 
+namespace ARDOUR {
+       class VCA;
+}
+
 class MixerActor : virtual public sigc::trackable
 {
   public:
 class MixerActor : virtual public sigc::trackable
 {
   public:
@@ -48,6 +52,9 @@ class MixerActor : virtual public sigc::trackable
 
        virtual void set_route_targets_for_operation () = 0;
 
 
        virtual void set_route_targets_for_operation () = 0;
 
+       void vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+       void vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+
        void solo_action ();
        void mute_action ();
        void rec_enable_action ();
        void solo_action ();
        void mute_action ();
        void rec_enable_action ();
index 673bce61d1f3548eb79297ff2e6403d72e9fbda4..d080e79c3805e91184e56330ec54123a4245909a 100644 (file)
@@ -2492,7 +2492,7 @@ MixerStrip::set_meter_type (MeterType t)
 }
 
 void
 }
 
 void
-MixerStrip::vca_menu_toggle (uint32_t n)
+MixerStrip::vca_menu_toggle (MenuItem* m, uint32_t n)
 {
        if (!_route) {
                return;
 {
        if (!_route) {
                return;
@@ -2504,9 +2504,44 @@ MixerStrip::vca_menu_toggle (uint32_t n)
                return;
        }
 
                return;
        }
 
+       RadioMenuItem* ri = dynamic_cast<RadioMenuItem*> (m);
+
+       if (!ri) {
+               return;
+       }
+
+       if (!ri->get_active()) {
+               _mixer.do_vca_unassign (vca);
+               return;
+       }
+
+       /* Now invoke a global method to apply this all relevant strips/routes */
+
+       _mixer.do_vca_assign (vca);
+}
+
+void
+MixerStrip::vca_assign (boost::shared_ptr<VCA> vca)
+{
+       if (!vca || !_route) {
+               return;
+       }
+
        vca->add (_route);
 }
 
        vca->add (_route);
 }
 
+void
+MixerStrip::vca_unassign (boost::shared_ptr<VCA> vca)
+{
+       if (!_route) {
+               return;
+       }
+
+       if (!vca) {
+               /* null VCA means drop all VCA assignments */
+       }
+}
+
 bool
 MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
 {
 bool
 MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
 {
@@ -2516,6 +2551,11 @@ MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
                return false;
        }
 
                return false;
        }
 
+       if (!_route) {
+               /* no route - nothing to do */
+               return false;
+       }
+
        VCAList vcas (_session->vca_manager().vcas());
 
        if (vcas.empty()) {
        VCAList vcas (_session->vca_manager().vcas());
 
        if (vcas.empty()) {
@@ -2527,8 +2567,15 @@ MixerStrip::vca_button_release (GdkEventButton* ev, uint32_t which)
        MenuList& items = menu->items();
        RadioMenuItem::Group group;
 
        MenuList& items = menu->items();
        RadioMenuItem::Group group;
 
+       items.push_back (MenuElem (_("Unassign"), sigc::bind (sigc::mem_fun (_mixer, &Mixer_UI::do_vca_unassign), boost::shared_ptr<VCA>())));
+
        for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
        for (VCAList::iterator v = vcas.begin(); v != vcas.end(); ++v) {
-               items.push_back (RadioMenuElem (group, (*v)->name(), sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_menu_toggle), (*v)->number())));
+               items.push_back (RadioMenuElem (group, (*v)->name()));
+               RadioMenuItem* item = dynamic_cast<RadioMenuItem*> (&items.back());
+               if (_route->slaved_to (*v)) {
+                       item->set_active (true);
+               }
+               item->signal_activate().connect (sigc::bind (sigc::mem_fun (*this, &MixerStrip::vca_menu_toggle), item, (*v)->number()));
        }
 
        menu->popup (1, ev->time);
        }
 
        menu->popup (1, ev->time);
index 1fbdb04120de1f176848dccb26d8246d9e839ece..670bab056135d51c0158979f23dec4ee7dd16df0 100644 (file)
@@ -131,6 +131,9 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
        void toggle_processors ();
        void ab_plugins ();
 
        void toggle_processors ();
        void ab_plugins ();
 
+       void vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+       void vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+
        void set_selected(bool yn);
        bool is_selected() {return _selected;}
 
        void set_selected(bool yn);
        bool is_selected() {return _selected;}
 
@@ -320,7 +323,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
 
        std::string meter_point_string (ARDOUR::MeterPoint);
 
 
        std::string meter_point_string (ARDOUR::MeterPoint);
 
-       void vca_menu_toggle (uint32_t n);
+       void vca_menu_toggle (Gtk::MenuItem*, uint32_t n);
        bool vca_button_release (GdkEventButton* ev, uint32_t which);
 };
 
        bool vca_button_release (GdkEventButton* ev, uint32_t which);
 };
 
index f847678df809b0130b8d4bbe1179df49ffcf1337..a321085e23cd5218a67b35ca61ca7271b701e164 100644 (file)
@@ -2579,3 +2579,17 @@ Mixer_UI::plugin_drop (const Glib::RefPtr<Gdk::DragContext>&, const Gtk::Selecti
        manager.set_status (ppp->_pip->type, ppp->_pip->unique_id, status);
        manager.save_statuses ();
 }
        manager.set_status (ppp->_pip->type, ppp->_pip->unique_id, status);
        manager.save_statuses ();
 }
+
+void
+Mixer_UI::do_vca_assign (boost::shared_ptr<VCA> vca)
+{
+       /* call protected MixerActor:: method */
+       vca_assign (vca);
+}
+
+void
+Mixer_UI::do_vca_unassign (boost::shared_ptr<VCA> vca)
+{
+       /* call protected MixerActor:: method */
+       vca_unassign (vca);
+}
index 198d510a148730c36572bc9f7d859e25bf9b534c..d818ee214a4b0a938ff124e01c36a980b7509a9a 100644 (file)
@@ -116,6 +116,9 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p
 
        bool window_not_visible () const;
 
 
        bool window_not_visible () const;
 
+       void do_vca_assign (boost::shared_ptr<ARDOUR::VCA>);
+       void do_vca_unassign (boost::shared_ptr<ARDOUR::VCA>);
+
   protected:
        void set_route_targets_for_operation ();
 
   protected:
        void set_route_targets_for_operation ();
 
index c6421a6922a673629e7b9428737056e91936d04c..7845679220f8fece5f738a1ccd0814c24739d682 100644 (file)
@@ -57,6 +57,7 @@ class LIBARDOUR_API GainControl : public AutomationControl {
        void add_master (boost::shared_ptr<GainControl>);
        void remove_master (boost::shared_ptr<GainControl>);
        void clear_masters ();
        void add_master (boost::shared_ptr<GainControl>);
        void remove_master (boost::shared_ptr<GainControl>);
        void clear_masters ();
+       bool slaved_to (boost::shared_ptr<GainControl>) const;
 
   private:
        void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
 
   private:
        void _set_value (double val, PBD::Controllable::GroupControlDisposition group_override);
index 3ade22319d28a7c555aeb68914a0231dd984b249..ed3276905819032434fd28e31a4168912d8b9e47 100644 (file)
@@ -72,6 +72,7 @@ class MonitorProcessor;
 class Pannable;
 class CapturingProcessor;
 class InternalSend;
 class Pannable;
 class CapturingProcessor;
 class InternalSend;
+class VCA;
 
 class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
 {
 
 class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
 {
@@ -707,8 +708,10 @@ public:
        void monitor_run (framepos_t start_frame, framepos_t end_frame,
                        pframes_t nframes, int declick);
 
        void monitor_run (framepos_t start_frame, framepos_t end_frame,
                        pframes_t nframes, int declick);
 
-protected:
-       friend class Session;
+        bool slaved_to (boost::shared_ptr<VCA>) const;
+
+  protected:
+        friend class Session;
 
        void catch_up_on_solo_mute_override ();
        void mod_solo_by_others_upstream (int32_t);
 
        void catch_up_on_solo_mute_override ();
        void mod_solo_by_others_upstream (int32_t);
index eeb49e7de04fecc214892faa049bb6ae5b17b49c..5ba7179231bc291fa4a64e2587ca0b63e1e55dd0 100644 (file)
@@ -176,3 +176,10 @@ GainControl::clear_masters ()
                Changed(); /* EMIT SIGNAL */
        }
 }
                Changed(); /* EMIT SIGNAL */
        }
 }
+
+bool
+GainControl::slaved_to (boost::shared_ptr<GainControl> gc) const
+{
+       Glib::Threads::Mutex::Lock lm (master_lock);
+       return find (_masters.begin(), _masters.end(), gc) != _masters.end();
+}
index 49528e30e32e2be564b7249c67c1b5249b12b04c..8b1f47ec4ec22a6409472fe16266dba077523ac5 100644 (file)
@@ -69,6 +69,7 @@
 #include "ardour/session.h"
 #include "ardour/unknown_processor.h"
 #include "ardour/utils.h"
 #include "ardour/session.h"
 #include "ardour/unknown_processor.h"
 #include "ardour/utils.h"
+#include "ardour/vca.h"
 
 #include "i18n.h"
 
 
 #include "i18n.h"
 
@@ -3345,7 +3346,7 @@ Route::set_processor_state (const XMLNode& node)
 
        for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 
 
        for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
 
-               XMLProperty const * prop = (*niter)->property ("type");
+               XMLProperty* prop = (*niter)->property ("type");
 
                if (prop->value() == "amp") {
                        _amp->set_state (**niter, Stateful::current_state_version);
 
                if (prop->value() == "amp") {
                        _amp->set_state (**niter, Stateful::current_state_version);
@@ -5883,3 +5884,13 @@ Route::master_send_enable_controllable () const
        return boost::shared_ptr<AutomationControl>();
 #endif
 }
        return boost::shared_ptr<AutomationControl>();
 #endif
 }
+
+bool
+Route::slaved_to (boost::shared_ptr<VCA> vca) const
+{
+       if (!vca || !_gain_control) {
+               return false;
+       }
+
+       return _gain_control->slaved_to (vca->control());
+}