+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ if (boost::dynamic_pointer_cast<Track>(*i)) {
+ if ((s = (*i)->internal_send_for (dest)) != 0) {
+ s->amp()->gain_control()->set_value (0.0);
+ }
+ }
+ }
+}
+
+void
+Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
+{
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ boost::shared_ptr<Send> s;
+
+ /* only tracks */
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ if (boost::dynamic_pointer_cast<Track>(*i)) {
+ if ((s = (*i)->internal_send_for (dest)) != 0) {
+ s->amp()->gain_control()->set_value (1.0);
+ }
+ }
+ }
+}
+
+void
+Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
+{
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ boost::shared_ptr<Send> s;
+
+ /* only tracks */
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ if (boost::dynamic_pointer_cast<Track>(*i)) {
+ if ((s = (*i)->internal_send_for (dest)) != 0) {
+ s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
+ }
+ }
+ }
+}
+
+void
+Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p)
+{
+ boost::shared_ptr<RouteList> r = routes.reader ();
+ boost::shared_ptr<RouteList> t (new RouteList);
+
+ /* only send tracks */
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ if (boost::dynamic_pointer_cast<Track>(*i)) {
+ t->push_back (*i);
+ }
+ }
+
+ add_internal_sends (dest, p, t);
+}
+
+void
+Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
+{
+ if (dest->is_control() || dest->is_master()) {
+ return;
+ }
+
+ if (!dest->internal_return()) {
+ dest->add_internal_return();
+ }
+
+ for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
+
+ if ((*i)->is_control() || (*i)->is_master() || (*i) == dest) {
+ continue;
+ }
+
+ (*i)->listen_via (dest, p, true, true);
+ }
+
+ graph_reordered ();
+}
+
+void
+Session::add_diskstream (boost::shared_ptr<Diskstream> dstream)
+{
+ /* need to do this in case we're rolling at the time, to prevent false underruns */
+ dstream->do_refill_with_alloc ();
+
+ dstream->set_block_size (current_block_size);
+
+ {
+ RCUWriter<DiskstreamList> writer (diskstreams);
+ boost::shared_ptr<DiskstreamList> ds = writer.get_copy();