X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Froute_group.cc;h=7b24a88114d5eca3b4941799f8aed41019e754f2;hb=79f01bc889d6c928345214eaba9016c6396bcfca;hp=f258e9f14d2d379aaec05f937e3b09467d77e704;hpb=ec8a4de01596c162c1529f3021dfc432bf66dfe8;p=ardour.git diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index f258e9f14d..7b24a88114 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,16 +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/vca.h" +#include "ardour/vca_manager.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -51,6 +55,7 @@ namespace ARDOUR { PropertyDescriptor group_route_active; PropertyDescriptor group_color; PropertyDescriptor group_monitoring; + PropertyDescriptor group_master_number; } } @@ -75,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) \ @@ -90,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) @@ -101,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"); @@ -115,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 () @@ -125,12 +136,18 @@ RouteGroup::~RouteGroup () _rec_enable_group->clear (); _monitoring_group->clear (); + boost::shared_ptr vca (group_master.lock()); + for (RouteList::iterator i = routes->begin(); i != routes->end();) { RouteList::iterator tmp = i; ++tmp; (*i)->set_route_group (0); + if (vca) { + (*i)->unassign (vca); + } + i = tmp; } } @@ -141,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; } @@ -163,6 +184,12 @@ RouteGroup::add (boost::shared_ptr r) r->set_route_group (this); r->DropReferences.connect_same_thread (*this, boost::bind (&RouteGroup::remove_when_going_away, this, boost::weak_ptr (r))); + boost::shared_ptr vca (group_master.lock()); + + if (vca) { + r->assign (vca); + } + _session.set_dirty (); RouteAdded (this, boost::weak_ptr (r)); /* EMIT SIGNAL */ return 0; @@ -185,6 +212,13 @@ RouteGroup::remove (boost::shared_ptr r) if ((i = find (routes->begin(), routes->end(), r)) != routes->end()) { r->set_route_group (0); + + boost::shared_ptr vca = group_master.lock(); + + if (vca) { + r->unassign (vca); + } + _solo_group->remove_control (r->solo_control()); _mute_group->remove_control (r->mute_control()); _gain_group->remove_control (r->gain_control()); @@ -202,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); @@ -221,7 +274,7 @@ RouteGroup::get_state () str << (*i)->id () << ' '; } - node->add_property ("routes", str.str()); + node->set_property ("routes", str.str()); } return *node; @@ -234,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, ' '); @@ -254,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; @@ -291,6 +364,7 @@ RouteGroup::set_gain (bool yn) if (is_gain() == yn) { return; } + _gain = yn; _gain_group->set_active (yn); @@ -486,16 +560,16 @@ RouteGroup::make_subgroup (bool aux, Placement placement) return; } - subgroup_bus = rl.front(); - subgroup_bus->set_name (_name); + _subgroup_bus = rl.front(); + _subgroup_bus->set_name (_name); if (aux) { - _session.add_internal_sends (subgroup_bus, placement, routes); + _session.add_internal_sends (_subgroup_bus, placement, routes); } else { - boost::shared_ptr bundle = subgroup_bus->input()->bundle (); + boost::shared_ptr bundle = _subgroup_bus->input()->bundle (); for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { (*i)->output()->disconnect (this); @@ -507,7 +581,7 @@ RouteGroup::make_subgroup (bool aux, Placement placement) void RouteGroup::destroy_subgroup () { - if (!subgroup_bus) { + if (!_subgroup_bus) { return; } @@ -516,14 +590,14 @@ RouteGroup::destroy_subgroup () /* XXX find a new bundle to connect to */ } - _session.remove_route (subgroup_bus); - subgroup_bus.reset (); + _session.remove_route (_subgroup_bus); + _subgroup_bus.reset (); } bool RouteGroup::has_subgroup() const { - return subgroup_bus != 0; + return _subgroup_bus != 0; } bool @@ -562,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); } @@ -583,6 +658,12 @@ RouteGroup::assign_master (boost::shared_ptr master) for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) { (*r)->assign (master); } + + group_master = master; + _group_master_number = master->number(); + + _used_to_share_gain = is_gain (); + set_gain (false); } void @@ -601,6 +682,11 @@ RouteGroup::unassign_master (boost::shared_ptr master) for (RouteList::iterator r = routes->begin(); r != routes->end(); ++r) { (*r)->unassign (master); } + + group_master.reset (); + _group_master_number = -1; + + set_gain (_used_to_share_gain); } bool @@ -612,3 +698,9 @@ RouteGroup::slaved () const return routes->front()->slaved (); } + +bool +RouteGroup::has_control_master() const +{ + return group_master.lock() != 0; +}