X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Froute_group.cc;h=a309e28981e75f4771d523251c7375cad14e4628;hb=5c0ce7311a25fb7f0346c545ec992ff8daf54b10;hp=959342c282423bd3b516a39056efd4cd67065a73;hpb=2cc33684c71131fd483346fe05e3b1a0e1706de9;p=ardour.git diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index 959342c282..a309e28981 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2009 Paul Davis + Copyright (C) 2000-2016 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,17 +24,20 @@ #include "pbd/error.h" #include "pbd/enumwriter.h" #include "pbd/strsplit.h" +#include "pbd/types_convert.h" #include "pbd/debug.h" #include "ardour/amp.h" #include "ardour/audio_track.h" +#include "ardour/debug.h" #include "ardour/monitor_control.h" #include "ardour/route.h" #include "ardour/route_group.h" #include "ardour/session.h" -#include "ardour/debug.h" +#include "ardour/vca.h" +#include "ardour/vca_manager.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -52,6 +55,7 @@ namespace ARDOUR { PropertyDescriptor group_route_active; PropertyDescriptor group_color; PropertyDescriptor group_monitoring; + PropertyDescriptor group_master_number; } } @@ -76,9 +80,11 @@ RouteGroup::make_property_quarks () Properties::group_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::group_route_active.property_id)); Properties::group_color.property_id = g_quark_from_static_string (X_("color")); - DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n", Properties::group_color.property_id)); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for color = %1\n", Properties::group_color.property_id)); Properties::group_monitoring.property_id = g_quark_from_static_string (X_("monitoring")); - DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for monitoring = %1\n", Properties::group_monitoring.property_id)); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for monitoring = %1\n", Properties::group_monitoring.property_id)); + Properties::group_master_number.property_id = g_quark_from_static_string (X_("group-master-number")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for group-master-number = %1\n", Properties::group_master_number.property_id)); } #define ROUTE_GROUP_DEFAULT_PROPERTIES _relative (Properties::group_relative, true) \ @@ -91,7 +97,8 @@ RouteGroup::make_property_quarks () , _select (Properties::group_select, true) \ , _route_active (Properties::group_route_active, true) \ , _color (Properties::group_color, true) \ - , _monitoring (Properties::group_monitoring, true) + , _monitoring (Properties::group_monitoring, true) \ + , _group_master_number (Properties::group_master_number, -1) RouteGroup::RouteGroup (Session& s, const string &n) : SessionObject (s, n) @@ -102,6 +109,8 @@ RouteGroup::RouteGroup (Session& s, const string &n) , _rec_enable_group (new ControlGroup (RecEnableAutomation)) , _gain_group (new GainControlGroup ()) , _monitoring_group (new ControlGroup (MonitoringAutomation)) + , _rgba (0) + , _used_to_share_gain (false) { _xml_node_name = X_("RouteGroup"); @@ -116,6 +125,7 @@ RouteGroup::RouteGroup (Session& s, const string &n) add_property (_route_active); add_property (_color); add_property (_monitoring); + add_property (_group_master_number); } RouteGroup::~RouteGroup () @@ -148,6 +158,10 @@ RouteGroup::~RouteGroup () int RouteGroup::add (boost::shared_ptr r) { + if (r->is_master()) { + return 0; + } + if (find (routes->begin(), routes->end(), r) != routes->end()) { return 0; } @@ -173,7 +187,7 @@ RouteGroup::add (boost::shared_ptr r) boost::shared_ptr vca (group_master.lock()); if (vca) { - r->assign (vca); + r->assign (vca); } _session.set_dirty (); @@ -222,15 +236,34 @@ RouteGroup::remove (boost::shared_ptr r) return -1; } +void +RouteGroup::set_rgba (uint32_t color) { + _rgba = color; + + PBD::PropertyChange change; + change.add (Properties::color); + PropertyChanged (change); + + if (!is_color ()) { + return; + } + + for (RouteList::const_iterator i = routes->begin(); i != routes->end(); ++i) { + (*i)->presentation_info().PropertyChanged (Properties::color); + } +} XMLNode& RouteGroup::get_state () { XMLNode *node = new XMLNode ("RouteGroup"); - char buf[64]; - id().print (buf, sizeof (buf)); - node->add_property ("id", buf); + node->set_property ("id", id()); + node->set_property ("rgba", _rgba); + node->set_property ("used-to-share-gain", _used_to_share_gain); + if (subgroup_bus) { + node->set_property ("subgroup-bus", subgroup_bus->id ()); + } add_properties (*node); @@ -241,7 +274,7 @@ RouteGroup::get_state () str << (*i)->id () << ' '; } - node->add_property ("routes", str.str()); + node->set_property ("routes", str.str()); } return *node; @@ -254,13 +287,14 @@ RouteGroup::set_state (const XMLNode& node, int version) return set_state_2X (node, version); } - XMLProperty const * prop; - set_id (node); set_values (node); + node.get_property ("rgba", _rgba); + node.get_property ("used-to-share-gain", _used_to_share_gain); - if ((prop = node.property ("routes")) != 0) { - stringstream str (prop->value()); + std::string routes; + if (node.get_property ("routes", routes)) { + stringstream str (routes); vector ids; split (str.str(), ids, ' '); @@ -274,6 +308,25 @@ RouteGroup::set_state (const XMLNode& node, int version) } } + PBD::ID subgroup_id (0); + if (node.get_property ("subgroup-bus", subgroup_id)) { + boost::shared_ptr r = _session.route_by_id (subgroup_id); + if (r) { + subgroup_bus = r; + } + } + + if (_group_master_number.val() > 0) { + boost::shared_ptr vca = _session.vca_manager().vca_by_number (_group_master_number.val()); + if (vca) { + /* no need to do the assignment because slaves will + handle that themselves. But we can set group_master + to use with future assignments of newly added routes. + */ + group_master = vca; + } + } + push_to_groups (); return 0; @@ -311,6 +364,7 @@ RouteGroup::set_gain (bool yn) if (is_gain() == yn) { return; } + _gain = yn; _gain_group->set_active (yn); @@ -582,6 +636,7 @@ RouteGroup::push_to_groups () _gain_group->set_active (false); _solo_group->set_active (false); _mute_group->set_active (false); + _rec_enable_group->set_active (false); _monitoring_group->set_active (false); } @@ -605,6 +660,10 @@ RouteGroup::assign_master (boost::shared_ptr master) } group_master = master; + _group_master_number = master->number(); + + _used_to_share_gain = is_gain (); + set_gain (false); } void @@ -625,6 +684,9 @@ RouteGroup::unassign_master (boost::shared_ptr master) } group_master.reset (); + _group_master_number = -1; + + set_gain (_used_to_share_gain); } bool @@ -636,3 +698,9 @@ RouteGroup::slaved () const return routes->front()->slaved (); } + +bool +RouteGroup::has_control_master() const +{ + return group_master.lock() != 0; +}