change Session::convert_to_frames_at() to Session::convert_to_frames() to reflect...
[ardour.git] / libs / ardour / route_group.cc
index e1d43f4cd6a72401d2ac8eccddc943cb3b34db2c..629216da39e5763b4fa2ed122c4fe1386169a16d 100644 (file)
@@ -17,7 +17,6 @@
 
 */
 
-#define __STDC_FORMAT_MACROS
 #include <inttypes.h>
 
 #include <algorithm>
@@ -28,6 +27,7 @@
 #include "pbd/strsplit.h"
 
 #include "ardour/amp.h"
+#include "ardour/debug.h"
 #include "ardour/route_group.h"
 #include "ardour/audio_track.h"
 #include "ardour/audio_diskstream.h"
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace PBD;
 using namespace std;
 
-RouteGroup::RouteGroup (Session& s, const string &n, Flag f, Property p)
-       : _session (s)
+namespace ARDOUR {
+       namespace Properties {
+               PropertyDescriptor<bool> relative;
+               PropertyDescriptor<bool> active;
+               PropertyDescriptor<bool> gain;
+               PropertyDescriptor<bool> mute;
+               PropertyDescriptor<bool> solo;
+               PropertyDescriptor<bool> recenable;
+               PropertyDescriptor<bool> select;
+               PropertyDescriptor<bool> edit;
+       }       
+}
+
+void
+RouteGroup::make_property_quarks ()
+{
+       Properties::relative.property_id = g_quark_from_static_string (X_("relative"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for relative = %1\n",   Properties::relative.property_id));
+       Properties::active.property_id = g_quark_from_static_string (X_("active"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for active = %1\n",     Properties::active.property_id));
+       Properties::hidden.property_id = g_quark_from_static_string (X_("hidden"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for hidden = %1\n",     Properties::hidden.property_id));
+       Properties::gain.property_id = g_quark_from_static_string (X_("gain"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for gain = %1\n",       Properties::gain.property_id));
+       Properties::mute.property_id = g_quark_from_static_string (X_("mute"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for mute = %1\n",       Properties::mute.property_id));
+       Properties::solo.property_id = g_quark_from_static_string (X_("solo"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for solo = %1\n",       Properties::solo.property_id));
+       Properties::recenable.property_id = g_quark_from_static_string (X_("recenable"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for recenable = %1\n",  Properties::recenable.property_id));
+       Properties::select.property_id = g_quark_from_static_string (X_("select"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for select = %1\n",     Properties::select.property_id));
+       Properties::edit.property_id = g_quark_from_static_string (X_("edit"));
+        DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for edit = %1\n",       Properties::edit.property_id));
+}
+
+#define ROUTE_GROUP_DEFAULT_PROPERTIES  _relative (Properties::relative, false) \
+       , _active (Properties::active, false) \
+       , _hidden (Properties::hidden, false) \
+       , _gain (Properties::gain, false) \
+       , _mute (Properties::mute, false) \
+       , _solo (Properties::solo, false) \
+       , _recenable (Properties::recenable, false) \
+       , _select (Properties::select, false) \
+       , _edit (Properties::edit, false)
+
+RouteGroup::RouteGroup (Session& s, const string &n)
+       : SessionObject (s, n)
        , routes (new RouteList)
-       , _name (n)
-       , _flags (f)
-       , _properties (Property (p))
+       , ROUTE_GROUP_DEFAULT_PROPERTIES
 {
+       _xml_node_name = X_("RouteGroup");
+
+       add_property (_relative);
+       add_property (_active);
+       add_property (_hidden);
+       add_property (_gain);
+       add_property (_mute);
+       add_property (_solo);
+       add_property (_recenable);
+       add_property (_select);
+       add_property (_edit);
 }
 
 RouteGroup::~RouteGroup ()
@@ -60,14 +116,6 @@ RouteGroup::~RouteGroup ()
        }
 }
 
-void
-RouteGroup::set_name (string str)
-{
-       _name = str;
-       _session.set_dirty ();
-       FlagsChanged (0); /* EMIT SIGNAL */
-}
-
 /** Add a route to a group.  Adding a route which is already in the group is allowed; nothing will happen.
  *  @param r Route to add.
  */
@@ -86,7 +134,7 @@ RouteGroup::add (boost::shared_ptr<Route> r)
        r->DropReferences.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr<Route> (r)));
        
        _session.set_dirty ();
-       changed (); /* EMIT SIGNAL */
+       MembershipChanged (); /* EMIT SIGNAL */
        return 0;
 }
 
@@ -109,7 +157,7 @@ RouteGroup::remove (boost::shared_ptr<Route> r)
                r->leave_route_group ();
                routes->erase (i);
                _session.set_dirty ();
-               changed (); /* EMIT SIGNAL */
+               MembershipChanged (); /* EMIT SIGNAL */
                return 0;
        }
 
@@ -122,7 +170,7 @@ RouteGroup::get_min_factor(gain_t factor)
 {
        gain_t g;
 
-       for (RouteList::iterator i = routes->begin(); i != routes->end(); i++) {
+       for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
                g = (*i)->amp()->gain();
 
                if ( (g+g*factor) >= 0.0f)
@@ -163,9 +211,8 @@ XMLNode&
 RouteGroup::get_state (void)
 {
        XMLNode *node = new XMLNode ("RouteGroup");
-       node->add_property ("name", _name);
-       node->add_property ("flags", enum_2_string (_flags));
-       node->add_property ("properties", enum_2_string (_properties));
+       
+       add_properties (*node);
 
        if (!routes->empty()) {
                stringstream str;
@@ -187,19 +234,9 @@ RouteGroup::set_state (const XMLNode& node, int version)
                return set_state_2X (node, version);
        }
 
-       const XMLProperty *prop;
-
-       if ((prop = node.property ("name")) != 0) {
-               _name = prop->value();
-       }
-
-       if ((prop = node.property ("flags")) != 0) {
-               _flags = Flag (string_2_enum (prop->value(), _flags));
-       }
+       set_values (node);
 
-       if ((prop = node.property ("properties")) != 0) {
-               _properties = Property (string_2_enum (prop->value(), _properties));
-       }
+       const XMLProperty *prop;
 
        if ((prop = node.property ("routes")) != 0) {
                stringstream str (prop->value());
@@ -222,76 +259,120 @@ RouteGroup::set_state (const XMLNode& node, int version)
 int
 RouteGroup::set_state_2X (const XMLNode& node, int /*version*/)
 {
-       XMLProperty const * prop;
-
-       if ((prop = node.property ("name")) != 0) {
-               _name = prop->value();
-       }
-
-       if ((prop = node.property ("flags")) != 0) {
-               _flags = Flag (string_2_enum (prop->value(), _flags));
-       }
+       set_values (node);
 
        if (node.name() == "MixGroup") {
-               _properties = Property (Gain | Mute | Solo | RecEnable);
+               _gain = true;
+               _mute = true;
+               _solo = true;
+               _recenable = true;
+               _edit = false;
        } else if (node.name() == "EditGroup") {
-               _properties = Property (Select | Edit);
+               _gain = false;
+               _mute = false;
+               _solo = false;
+               _recenable = false;
+               _edit = true;
        }
 
        return 0;
 }
 
 void
-RouteGroup::set_active (bool yn, void *src)
+RouteGroup::set_gain (bool yn)
 {
-       if (is_active() == yn) {
+       if (is_gain() == yn) {
                return;
        }
-       if (yn) {
-               _flags = Flag (_flags | Active);
-       } else {
-               _flags = Flag (_flags & ~Active);
+       _gain = yn;
+}
+
+void
+RouteGroup::set_mute (bool yn)
+{
+       if (is_mute() == yn) {
+               return;
        }
-       _session.set_dirty ();
-       FlagsChanged (src); /* EMIT SIGNAL */
+       _mute = yn;
+}
+
+void
+RouteGroup::set_solo (bool yn)
+{
+       if (is_solo() == yn) {
+               return;
+       }
+       _solo = yn;
 }
 
 void
-RouteGroup::set_relative (bool yn, void *src)
+RouteGroup::set_recenable (bool yn)
+{
+       if (is_recenable() == yn) {
+               return;
+       }
+       _recenable = yn;
+}
 
+void
+RouteGroup::set_select (bool yn)
 {
-       if (is_relative() == yn) {
+       if (is_select() == yn) {
                return;
        }
-       if (yn) {
-               _flags = Flag (_flags | Relative);
-       } else {
-               _flags = Flag (_flags & ~Relative);
+       _select = yn;
+}
+
+void
+RouteGroup::set_edit (bool yn)
+{
+       if (is_edit() == yn) {
+               return;
        }
+       _edit = yn;
+}
+
+void
+RouteGroup::set_active (bool yn, void* /*src*/)
+{
+       if (is_active() == yn) {
+               return;
+       }
+
+       _active = yn;
+       send_change (PropertyChange (Properties::active));
+               
        _session.set_dirty ();
-       FlagsChanged (src); /* EMIT SIGNAL */
 }
 
 void
-RouteGroup::set_hidden (bool yn, void *src)
+RouteGroup::set_relative (bool yn, void* /*src*/)
+{
+       if (is_relative() == yn) {
+               return;
+       }
+       _relative = yn;
+       _session.set_dirty ();
+}
 
+void
+RouteGroup::set_hidden (bool yn, void* /*src*/)
 {
        if (is_hidden() == yn) {
                return;
        }
        if (yn) {
-               _flags = Flag (_flags | Hidden);
+               _hidden = true;
                if (Config->get_hiding_groups_deactivates_groups()) {
-                       _flags = Flag (_flags & ~Active);
+                       _active = false;
                }
        } else {
-               _flags = Flag (_flags & ~Hidden);
+               _hidden = false;
                if (Config->get_hiding_groups_deactivates_groups()) {
-                       _flags = Flag (_flags | Active);
+                       _active = true;
                }
        }
        _session.set_dirty ();
-       FlagsChanged (src); /* EMIT SIGNAL */
 }
 
 void
@@ -357,3 +438,14 @@ RouteGroup::destroy_subgroup ()
        _session.remove_route (subgroup_bus);
        subgroup_bus.reset ();
 }
+
+bool
+RouteGroup::enabled_property (PBD::PropertyID prop)
+{
+       OwnedPropertyList::iterator i = _properties->find (prop);
+       if (i == _properties->end()) {
+               return false;
+       }
+
+       return dynamic_cast<const PropertyTemplate<bool>* > (i->second)->val ();
+}