diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-12-10 03:25:32 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-12-10 03:25:32 +0000 |
commit | 61cade6d59118288e90a405e0f4fbc24d0108814 (patch) | |
tree | fe9083a4c005ac239bf5995c16252609dc547869 /libs/ardour/route_group.cc | |
parent | f18bcf0cc835ab401d8e28dcc18c72795977752a (diff) |
drastic, deep and wide changes to make RouteGroup use boost::shared_ptr<Route> and boost::shared_ptr<RouteList> to better fit into emerging framework for "RT operations" ; torben's changes to MTC slaving code (sorry for bundling)
git-svn-id: svn://localhost/ardour2/branches/3.0@6334 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/route_group.cc')
-rw-r--r-- | libs/ardour/route_group.cc | 96 |
1 files changed, 75 insertions, 21 deletions
diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index f33a7f1f40..d7ac672f9a 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2002 Paul Davis + Copyright (C) 2000-2009 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 @@ -26,6 +26,7 @@ #include "pbd/error.h" #include "pbd/enumwriter.h" +#include "pbd/strsplit.h" #include "ardour/amp.h" #include "ardour/route_group.h" @@ -41,10 +42,26 @@ using namespace sigc; using namespace std; RouteGroup::RouteGroup (Session& s, const string &n, Flag f, Property p) - : _session (s), _name (n), _flags (f), _properties (Property (p)) + : _session (s) + , routes (new RouteList) + , _name (n) + , _flags (f) + , _properties (Property (p)) { } +RouteGroup::~RouteGroup () +{ + for (RouteList::iterator i = routes->begin(); i != routes->end();) { + RouteList::iterator tmp = i; + ++tmp; + + (*i)->leave_route_group (); + + i = tmp; + } +} + void RouteGroup::set_name (string str) { @@ -54,32 +71,43 @@ RouteGroup::set_name (string str) } int -RouteGroup::add (Route *r) +RouteGroup::add (boost::shared_ptr<Route> r) { - routes.push_back (r); - r->GoingAway.connect (sigc::bind (mem_fun (*this, &RouteGroup::remove_when_going_away), r)); + r->leave_route_group (); + + routes->push_back (r); + + r->join_route_group (this); + r->GoingAway.connect (sigc::bind (mem_fun (*this, &RouteGroup::remove_when_going_away), boost::weak_ptr<Route> (r))); + _session.set_dirty (); changed (); /* EMIT SIGNAL */ return 0; } void -RouteGroup::remove_when_going_away (Route *r) +RouteGroup::remove_when_going_away (boost::weak_ptr<Route> wr) { - remove (r); + boost::shared_ptr<Route> r (wr.lock()); + + if (r) { + remove (r); + } } int -RouteGroup::remove (Route *r) +RouteGroup::remove (boost::shared_ptr<Route> r) { - list<Route *>::iterator i; + RouteList::iterator i; - if ((i = find (routes.begin(), routes.end(), r)) != routes.end()) { - routes.erase (i); + if ((i = find (routes->begin(), routes->end(), r)) != routes->end()) { + r->leave_route_group (); + routes->erase (i); _session.set_dirty (); changed (); /* EMIT SIGNAL */ return 0; } + return -1; } @@ -89,7 +117,7 @@ RouteGroup::get_min_factor(gain_t factor) { gain_t g; - for (list<Route *>::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) @@ -108,7 +136,7 @@ RouteGroup::get_max_factor(gain_t factor) { gain_t g; - for (list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) { + for (RouteList::iterator i = routes->begin(); i != routes->end(); i++) { g = (*i)->amp()->gain(); // if the current factor woulnd't raise this route above maximum @@ -133,6 +161,17 @@ RouteGroup::get_state (void) node->add_property ("name", _name); node->add_property ("flags", enum_2_string (_flags)); node->add_property ("properties", enum_2_string (_properties)); + + if (!routes->empty()) { + stringstream str; + + for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { + str << (*i)->id () << ' '; + } + + node->add_property ("routes", str.str()); + } + return *node; } @@ -157,6 +196,21 @@ RouteGroup::set_state (const XMLNode& node, int version) _properties = Property (string_2_enum (prop->value(), _properties)); } + if ((prop = node.property ("routes")) != 0) { + stringstream str (prop->value()); + vector<string> ids; + split (str.str(), ids, ' '); + + for (vector<string>::iterator i = ids.begin(); i != ids.end(); ++i) { + PBD::ID id (*i); + boost::shared_ptr<Route> r = _session.route_by_id (id); + + if (r) { + add (r); + } + } + } + return 0; } @@ -236,10 +290,10 @@ RouteGroup::set_hidden (bool yn, void *src) } void -RouteGroup::audio_track_group (set<AudioTrack*>& ats) +RouteGroup::audio_track_group (set<boost::shared_ptr<AudioTrack> >& ats) { - for (list<Route*>::iterator i = routes.begin(); i != routes.end(); ++i) { - AudioTrack* at = dynamic_cast<AudioTrack*>(*i); + for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { + boost::shared_ptr<AudioTrack> at = boost::dynamic_pointer_cast<AudioTrack>(*i); if (at) { ats.insert (at); } @@ -254,14 +308,14 @@ RouteGroup::make_subgroup () /* since we don't do MIDI Busses yet, check quickly ... */ - for (list<Route*>::iterator i = routes.begin(); i != routes.end(); ++i) { + for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { if ((*i)->output()->n_ports().n_midi() != 0) { PBD::info << _("You cannot subgroup MIDI tracks at this time") << endmsg; return; } } - for (list<Route*>::iterator i = routes.begin(); i != routes.end(); ++i) { + for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { nin = max (nin, (*i)->output()->n_ports().n_audio()); } @@ -277,7 +331,7 @@ RouteGroup::make_subgroup () boost::shared_ptr<Bundle> bundle = subgroup_bus->input()->bundle (); - for (list<Route*>::iterator i = routes.begin(); i != routes.end(); ++i) { + for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { (*i)->output()->disconnect (this); (*i)->output()->connect_ports_to_bundle (bundle, this); } @@ -289,8 +343,8 @@ RouteGroup::destroy_subgroup () if (!subgroup_bus) { return; } - - for (list<Route*>::iterator i = routes.begin(); i != routes.end(); ++i) { + + for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { (*i)->output()->disconnect (this); /* XXX find a new bundle to connect to */ } |