fix issues with route group assignment to control master
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 19 May 2016 17:10:28 +0000 (13:10 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Tue, 31 May 2016 19:30:43 +0000 (15:30 -0400)
libs/ardour/ardour/route_group.h
libs/ardour/route_group.cc

index 78a3102565b0c3cb078b417ae043a7fc50e23f80..6fec1158c572e57a0a10cdc48f6562576fe249a9 100644 (file)
@@ -145,6 +145,7 @@ class LIBARDOUR_API RouteGroup : public SessionObject
 
        void assign_master (boost::shared_ptr<VCA>);
        void unassign_master (boost::shared_ptr<VCA>);
+       bool slaved () const;
 
   private:
        boost::shared_ptr<RouteList> routes;
index ef1a232896c9997803cce02a94b31c6d17c3e83c..a42f90a113cb0f3031b1a154c38d151e0b5fbc4e 100644 (file)
@@ -562,6 +562,10 @@ RouteGroup::push_to_groups ()
 void
 RouteGroup::assign_master (boost::shared_ptr<VCA> master)
 {
+       if (!routes || routes->empty()) {
+               return;
+       }
+
        boost::shared_ptr<Route> front = routes->front ();
 
        if (!front) {
@@ -572,16 +576,20 @@ RouteGroup::assign_master (boost::shared_ptr<VCA> master)
                return;
        }
 
-       if (!front->slaved()) {
+       bool cancel_master_controls = false;
 
+       if (!front->slaved()) {
                pre_master_gain = is_gain ();
                pre_master_solo = is_solo ();
                pre_master_mute = is_mute ();
+               cancel_master_controls = true;
+       }
 
-               for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
-                       (*r)->assign (master);
-               }
+       for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) {
+               (*r)->assign (master);
+       }
 
+       if (cancel_master_controls) {
                set_gain (false);
                set_solo (false);
                set_mute (false);
@@ -591,6 +599,10 @@ RouteGroup::assign_master (boost::shared_ptr<VCA> master)
 void
 RouteGroup::unassign_master (boost::shared_ptr<VCA> master)
 {
+       if (!routes || routes->empty()) {
+               return;
+       }
+
        boost::shared_ptr<Route> front = routes->front ();
 
        if (!front) {
@@ -611,3 +623,13 @@ RouteGroup::unassign_master (boost::shared_ptr<VCA> master)
                set_mute (pre_master_mute);
        }
 }
+
+bool
+RouteGroup::slaved () const
+{
+       if (!routes || routes->empty()) {
+               return false;
+       }
+
+       return routes->front()->slaved ();
+}