From 653ae4acd639fef149314fe6f8c7a0d862afae40 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 8 Apr 2016 16:49:47 -0400 Subject: 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 --- libs/ardour/route_group.cc | 115 +++++++++++++++++++++++++-------------------- 1 file changed, 64 insertions(+), 51 deletions(-) (limited to 'libs/ardour/route_group.cc') 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 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 trk = boost::dynamic_pointer_cast (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 (r))); @@ -165,6 +186,14 @@ RouteGroup::remove (boost::shared_ptr 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 trk = boost::dynamic_pointer_cast (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 (r)); /* EMIT SIGNAL */ @@ -175,49 +204,6 @@ RouteGroup::remove (boost::shared_ptr 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* > (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); +} -- cgit v1.2.3