OSC: add group sharing bit feedback
authorLen Ovens <len@ovenwerks.net>
Wed, 28 Feb 2018 04:55:30 +0000 (20:55 -0800)
committerLen Ovens <len@ovenwerks.net>
Wed, 28 Feb 2018 05:59:43 +0000 (21:59 -0800)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc_select_observer.cc
libs/surfaces/osc/osc_select_observer.h

index 7f8f2b36b9844a64dc5fc279a989e33ec8490a3f..1a9d7371598918f088d59587b27115e426297210 100644 (file)
@@ -2593,15 +2593,34 @@ OSC::parse_sel_group (const char *path, const char* types, lo_arg **argv, int ar
                }
                else if (!strncmp (path, X_("/select/group/sharing"), 21)) {
                        if (argc == 9) {
-                               rg->set_gain ((bool) argv[0]->i);
-                               rg->set_relative ((bool) argv[1]->i, this);
-                               rg->set_mute ((bool) argv[2]->i);
-                               rg->set_solo ((bool) argv[3]->i);
-                               rg->set_recenable ((bool) argv[4]->i);
-                               rg->set_select ((bool) argv[5]->i);
-                               rg->set_route_active ((bool) argv[6]->i);
-                               rg->set_color ((bool) argv[7]->i);
-                               rg->set_monitoring ((bool) argv[8]->i);
+                               if (rg->is_gain() != (bool) argv[0]->i) {
+                                       rg->set_gain ((bool) argv[0]->i);
+                               }
+                               if (rg->is_relative() != (bool) argv[1]->i) {
+                                       rg->set_relative ((bool) argv[1]->i, this);
+                               }
+                               if (rg->is_mute() != (bool) argv[2]->i) {
+                                       rg->set_mute ((bool) argv[2]->i);
+                               }
+                               if (rg->is_solo() != (bool) argv[3]->i) {
+                                       rg->set_solo ((bool) argv[3]->i);
+                               }
+                               if (rg->is_recenable() != (bool) argv[4]->i) {
+                                       rg->set_recenable ((bool) argv[4]->i);
+                               }
+                               if (rg->is_select() != (bool) argv[5]->i) {
+                                       rg->set_select ((bool) argv[5]->i);
+                               }
+                               if (rg->is_route_active() != (bool) argv[6]->i) {
+                                       rg->set_route_active ((bool) argv[6]->i);
+                               }
+                               if (rg->is_color() != (bool) argv[7]->i) {
+                                       rg->set_color ((bool) argv[7]->i);
+                               }
+                               if (rg->is_monitoring() != (bool) argv[8]->i) {
+                                       rg->set_monitoring ((bool) argv[8]->i);
+                               }
+                               ret = 0;
                        } else {
                                PBD::warning << "OSC: Sharing can only be set if all 9 parameters are sent." << endmsg;
                        }
@@ -4188,7 +4207,7 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
                if (so != 0) {
                        so->refresh_strip (s, nsends, sur->gainmode, true);
                } else {
-                       OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, sur);
+                       OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, *session, sur);
                        sur->sel_obs = sel_fb;
                }
                sur->sel_obs->set_expand (sur->expand_enable);
index 5b68f08241b41b17f256ccf905e53f86157cedc9..e5995edf2fbb745aeeb5278bfde41f77d26d7580 100644 (file)
@@ -32,6 +32,7 @@
 #include "ardour/solo_safe_control.h"
 #include "ardour/route.h"
 #include "ardour/route_group.h"
+#include "ardour/route_group_member.h"
 #include "ardour/send.h"
 #include "ardour/plugin.h"
 #include "ardour/plugin_insert.h"
@@ -50,7 +51,7 @@ using namespace PBD;
 using namespace ARDOUR;
 using namespace ArdourSurface;
 
-OSCSelectObserver::OSCSelectObserver (OSC& o, ArdourSurface::OSC::OSCSurface* su)
+OSCSelectObserver::OSCSelectObserver (OSC& o, ARDOUR::Session& s, ArdourSurface::OSC::OSCSurface* su)
        : _osc (o)
        ,sur (su)
        ,nsends (0)
@@ -60,6 +61,7 @@ OSCSelectObserver::OSCSelectObserver (OSC& o, ArdourSurface::OSC::OSCSurface* su
        ,eq_bands (0)
        ,_expand (2048)
 {
+       session = &s;
        addr = lo_address_new_from_url  (sur->remote_url.c_str());
        gainmode = sur->gainmode;
        feedback = sur->feedback;
@@ -141,6 +143,9 @@ OSCSelectObserver::refresh_strip (boost::shared_ptr<ARDOUR::Stripable> new_strip
 
                rt->comment_changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::comment_changed, this), OSC::instance());
                comment_changed ();
+
+               session->RouteGroupPropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::group_sharing, this, _1), OSC::instance());
+               group_sharing (rt->route_group ());
        }
 
        _strip->presentation_info().PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::pi_changed, this, _1), OSC::instance());
@@ -664,6 +669,34 @@ OSCSelectObserver::group_name ()
        }
 }
 
+void
+OSCSelectObserver::group_sharing (RouteGroup *rgc)
+{
+       boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (_strip);
+       if (rt) {
+               RouteGroup *rg = rt->route_group();
+               if (rg) {
+                       if (rg != rgc) {
+                               return;
+                       }
+                       lo_message reply = lo_message_new ();
+                       lo_message_add_int32 (reply, rg->is_gain ());
+                       lo_message_add_int32 (reply, rg->is_relative ());
+                       lo_message_add_int32 (reply, rg->is_mute ());
+                       lo_message_add_int32 (reply, rg->is_solo ());
+                       lo_message_add_int32 (reply, rg->is_recenable ());
+                       lo_message_add_int32 (reply, rg->is_select ());
+                       lo_message_add_int32 (reply, rg->is_route_active ());
+                       lo_message_add_int32 (reply, rg->is_color ());
+                       lo_message_add_int32 (reply, rg->is_monitoring ());
+                       lo_send_message (addr, "/select/group/sharing", reply);
+                       lo_message_free (reply);
+               }
+       }
+
+
+}
+
 void
 OSCSelectObserver::comment_changed ()
 {
@@ -676,6 +709,9 @@ OSCSelectObserver::comment_changed ()
 void
 OSCSelectObserver::pi_changed (PBD::PropertyChange const& what_changed)
 {
+       if (!what_changed.contains (ARDOUR::Properties::hidden)) {
+               return;
+       }
        _osc.float_message (X_("/select/hide"), _strip->is_hidden (), addr);
 }
 
index b12d707d835afbe4416b618c412971199e830d5f..0b9f697f2e88590967a49d272ec890dab8afcb1a 100644 (file)
@@ -37,7 +37,7 @@ class OSCSelectObserver
 {
 
   public:
-       OSCSelectObserver (ArdourSurface::OSC& o, ArdourSurface::OSC::OSCSurface* sur);
+       OSCSelectObserver (ArdourSurface::OSC& o, ARDOUR::Session& s, ArdourSurface::OSC::OSCSurface* sur);
        ~OSCSelectObserver ();
 
        boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
@@ -94,9 +94,11 @@ class OSCSelectObserver
        int eq_bands;
        bool _tick_busy;
        uint32_t _expand;
+       ARDOUR::Session* session;
 
        void name_changed (const PBD::PropertyChange& what_changed);
        void group_name ();
+       void group_sharing (ARDOUR::RouteGroup *rg_c);
        void comment_changed ();
        void pi_changed (PBD::PropertyChange const&);
        void change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);