summaryrefslogtreecommitdiff
path: root/libs/ardour/route_group.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-04-08 16:49:47 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:40 -0400
commit653ae4acd639fef149314fe6f8c7a0d862afae40 (patch)
treeba32ff0efd9b105c207ad7e3b2e89d73e76b4355 /libs/ardour/route_group.cc
parentc107f1ab56270f4485ca2a787d575c2b5b53cfcf (diff)
universal change in the design of the way Route/Track controls are designed and used. The controls now own their own state, rather than proxy for state in their owners.
Massive changes all over the code to accomodate this. Many things are not finished. Consider this a backup safety commit
Diffstat (limited to 'libs/ardour/route_group.cc')
-rw-r--r--libs/ardour/route_group.cc115
1 files changed, 64 insertions, 51 deletions
diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc
index b482bb85d3..137e2c4734 100644
--- a/libs/ardour/route_group.cc
+++ b/libs/ardour/route_group.cc
@@ -28,6 +28,7 @@
#include "ardour/amp.h"
#include "ardour/audio_track.h"
+#include "ardour/monitor_control.h"
#include "ardour/route.h"
#include "ardour/route_group.h"
#include "ardour/session.h"
@@ -57,21 +58,21 @@ 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));
+ 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));
+ 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));
+ 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));
+ 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));
+ 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));
+ 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));
+ 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));
+ DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for select = %1\n", Properties::select.property_id));
Properties::route_active.property_id = g_quark_from_static_string (X_("route-active"));
DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for route-active = %1\n", Properties::route_active.property_id));
Properties::color.property_id = g_quark_from_static_string (X_("color"));
@@ -96,6 +97,11 @@ RouteGroup::RouteGroup (Session& s, const string &n)
: SessionObject (s, n)
, routes (new RouteList)
, ROUTE_GROUP_DEFAULT_PROPERTIES
+ , _solo_group (new ControlGroup (SoloAutomation))
+ , _mute_group (new ControlGroup (MuteAutomation))
+ , _rec_enable_group (new ControlGroup (RecEnableAutomation))
+ , _gain_group (new ControlGroup (GainAutomation))
+ , _monitoring_group (new ControlGroup (MonitoringAutomation))
{
_xml_node_name = X_("RouteGroup");
@@ -114,6 +120,12 @@ RouteGroup::RouteGroup (Session& s, const string &n)
RouteGroup::~RouteGroup ()
{
+ _solo_group->clear ();
+ _mute_group->clear ();
+ _gain_group->clear ();
+ _rec_enable_group->clear ();
+ _monitoring_group->clear ();
+
for (RouteList::iterator i = routes->begin(); i != routes->end();) {
RouteList::iterator tmp = i;
++tmp;
@@ -140,6 +152,15 @@ RouteGroup::add (boost::shared_ptr<Route> r)
routes->push_back (r);
+ _solo_group->add_control (r->solo_control());
+ _mute_group->add_control (r->mute_control());
+ _gain_group->add_control (r->gain_control());
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (r);
+ if (trk) {
+ _rec_enable_group->add_control (trk->rec_enable_control());
+ _monitoring_group->add_control (trk->monitoring_control());
+ }
+
r->set_route_group (this);
r->DropReferences.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr<Route> (r)));
@@ -165,6 +186,14 @@ RouteGroup::remove (boost::shared_ptr<Route> r)
if ((i = find (routes->begin(), routes->end(), r)) != routes->end()) {
r->set_route_group (0);
+ _solo_group->remove_control (r->solo_control());
+ _mute_group->remove_control (r->mute_control());
+ _gain_group->remove_control (r->gain_control());
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<Track> (r);
+ if (trk) {
+ _rec_enable_group->remove_control (trk->rec_enable_control());
+ _monitoring_group->remove_control (trk->monitoring_control());
+ }
routes->erase (i);
_session.set_dirty ();
RouteRemoved (this, boost::weak_ptr<Route> (r)); /* EMIT SIGNAL */
@@ -175,49 +204,6 @@ RouteGroup::remove (boost::shared_ptr<Route> r)
}
-gain_t
-RouteGroup::get_min_factor (gain_t factor)
-{
- for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
- gain_t const g = (*i)->gain_control()->get_value();
-
- if ((g + g * factor) >= 0.0f) {
- continue;
- }
-
- if (g <= 0.0000003f) {
- return 0.0f;
- }
-
- factor = 0.0000003f / g - 1.0f;
- }
-
- return factor;
-}
-
-gain_t
-RouteGroup::get_max_factor (gain_t factor)
-{
- for (RouteList::iterator i = routes->begin(); i != routes->end(); i++) {
- gain_t const g = (*i)->gain_control()->get_value();
-
- // if the current factor woulnd't raise this route above maximum
- if ((g + g * factor) <= 1.99526231f) {
- continue;
- }
-
- // if route gain is already at peak, return 0.0f factor
- if (g >= 1.99526231f) {
- return 0.0f;
- }
-
- // factor is calculated so that it would raise current route to max
- factor = 1.99526231f / g - 1.0f;
- }
-
- return factor;
-}
-
XMLNode&
RouteGroup::get_state ()
{
@@ -269,6 +255,8 @@ RouteGroup::set_state (const XMLNode& node, int version)
}
}
+ push_to_groups ();
+
return 0;
}
@@ -293,6 +281,8 @@ RouteGroup::set_state_2X (const XMLNode& node, int /*version*/)
_color = false;
}
+ push_to_groups ();
+
return 0;
}
@@ -303,6 +293,8 @@ RouteGroup::set_gain (bool yn)
return;
}
_gain = yn;
+ _gain_group->set_active (yn);
+
send_change (PropertyChange (Properties::gain));
}
@@ -313,6 +305,7 @@ RouteGroup::set_mute (bool yn)
return;
}
_mute = yn;
+ _mute_group->set_active (yn);
send_change (PropertyChange (Properties::mute));
}
@@ -323,6 +316,7 @@ RouteGroup::set_solo (bool yn)
return;
}
_solo = yn;
+ _solo_group->set_active (yn);
send_change (PropertyChange (Properties::solo));
}
@@ -333,6 +327,7 @@ RouteGroup::set_recenable (bool yn)
return;
}
_recenable = yn;
+ _rec_enable_group->set_active (yn);
send_change (PropertyChange (Properties::recenable));
}
@@ -384,6 +379,8 @@ RouteGroup::set_monitoring (bool yn)
}
_monitoring = yn;
+ _monitoring_group->set_active (yn);
+
send_change (PropertyChange (Properties::monitoring));
_session.set_dirty ();
@@ -531,3 +528,19 @@ RouteGroup::enabled_property (PBD::PropertyID prop)
return dynamic_cast<const PropertyTemplate<bool>* > (i->second)->val ();
}
+
+void
+RouteGroup::post_set (PBD::PropertyChange const &)
+{
+ push_to_groups ();
+}
+
+void
+RouteGroup::push_to_groups ()
+{
+ _gain_group->set_active (_gain);
+ _solo_group->set_active (_solo);
+ _mute_group->set_active (_mute);
+ _rec_enable_group->set_active (_recenable);
+ _monitoring_group->set_active (_monitoring);
+}