ignore midi on monitor-section and force strict-i/o
[ardour.git] / libs / ardour / session.cc
index d150860584d886be8edf87da409a1717b019ad72..00055844031fa5c60e1cda4142029ff3e0e73853 100644 (file)
@@ -90,6 +90,7 @@
 #include "ardour/recent_sessions.h"
 #include "ardour/region.h"
 #include "ardour/region_factory.h"
+#include "ardour/revision.h"
 #include "ardour/route_graph.h"
 #include "ardour/route_group.h"
 #include "ardour/send.h"
@@ -316,6 +317,8 @@ Session::Session (AudioEngine &eng,
 {
        uint32_t sr = 0;
 
+       created_with = string_compose ("%1 %2", PROGRAM_NAME, revision);
+
        pthread_mutex_init (&_rt_emit_mutex, 0);
        pthread_cond_init (&_rt_emit_cond, 0);
 
@@ -1311,8 +1314,12 @@ Session::reset_monitor_section ()
        _master_out->output()->disconnect (this);
        _monitor_out->output()->disconnect (this);
 
-       _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
-       _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
+       // monitor section follow master bus - except midi
+       ChanCount mon_chn (_master_out->output()->n_ports());
+       mon_chn.set_midi (0);
+
+       _monitor_out->input()->ensure_io (mon_chn, false, this);
+       _monitor_out->output()->ensure_io (mon_chn, false, this);
 
        for (uint32_t n = 0; n < limit; ++n) {
                boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
@@ -1942,7 +1949,7 @@ void
 Session::set_all_tracks_record_enabled (bool enable )
 {
        boost::shared_ptr<RouteList> rl = routes.reader();
-       set_controls (route_list_to_control_list (rl, &Track::rec_enable_control), enable, Controllable::NoGroup);
+       set_controls (route_list_to_control_list (rl, &Stripable::rec_enable_control), enable, Controllable::NoGroup);
 }
 
 void
@@ -2305,7 +2312,7 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
 #ifndef NDEBUG
                DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
                for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
-                       DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().global_order()));
+                       DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().order()));
                }
 #endif
 
@@ -2921,15 +2928,18 @@ Session::reconnect_mmc_ports(bool inputs)
 #endif
 
 void
-Session::ensure_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
+Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
 {
        if (first_new_order == PresentationInfo::max_order) {
                /* adding at end, no worries */
                return;
        }
 
-       /* create a gap in the existing route order keys to accomodate new routes.*/
+       /* create a gap in the presentation info to accomodate @param how_many
+        * new objects.
+        */
        boost::shared_ptr <RouteList> rd = routes.reader();
+
        for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) {
                boost::shared_ptr<Route> rt (*ri);
 
@@ -2937,8 +2947,8 @@ Session::ensure_presentation_info_gap (PresentationInfo::order_t first_new_order
                        continue;
                }
 
-               if (rt->presentation_info().group_order () >= first_new_order) {
-                       rt->set_presentation_group_order (rt->presentation_info().group_order () + how_many);
+               if (rt->presentation_info().order () >= first_new_order) {
+                       rt->set_presentation_order (rt->presentation_info().order () + how_many);
                }
        }
 }
@@ -3071,8 +3081,6 @@ Session::new_audio_route (int input_channels, int output_channels, RouteGroup* r
 
        bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
 
-       ensure_presentation_info_gap (order, how_many);
-
        while (how_many) {
                if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
                        error << "cannot find name for new audio bus" << endmsg;
@@ -3257,6 +3265,10 @@ Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::s
                                                (*i)->add_property ("bitslot", buf);
                                                (*i)->add_property ("name", name);
                                        }
+                                       else if (type && type->value() == X_("intreturn")) {
+                                               (*i)->remove_property (X_("bitslot"));
+                                               (*i)->add_property ("ignore-bitslot", "1");
+                                       }
                                        else if (type && type->value() == X_("return")) {
                                                // Return::set_state() generates a new one
                                                (*i)->remove_property (X_("bitslot"));
@@ -3391,7 +3403,7 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
        }
 
        DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
-       ensure_presentation_info_gap (order, new_routes.size());
+       ensure_route_presentation_info_gap (order, new_routes.size());
 
        for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
 
@@ -3432,27 +3444,31 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
 
                        /* presentation info order may already have been set from XML */
 
-                       if (r->presentation_info().unordered()) {
+                       if (!r->presentation_info().order_set()) {
 
                                if (order == PresentationInfo::max_order) {
                                        /* just add to the end */
-                                       r->set_presentation_group_order_explicit (n_routes + added);
+                                       r->set_presentation_order_explicit (n_routes + added);
                                        DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
                                } else {
-                                       r->set_presentation_group_order_explicit (order + added);
+                                       r->set_presentation_order (order + added);
                                        DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
                                }
                        } else {
-                               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().group_order()));
+                               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
                        }
                }
 
-               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 global order %3 type %4 (summary: %5)\n",
+#ifndef __APPLE__
+               /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
+                * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
+                */
+               DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
                                                               r->name(),
-                                                              r->presentation_info().group_order(),
-                                                              r->presentation_info().global_order(),
+                                                              r->presentation_info().order(),
                                                               enum_2_string (r->presentation_info().flags()),
-                                                              r->presentation_info().to_string()));
+                                                              r->presentation_info()));
+#endif
 
 
                if (input_auto_connect || output_auto_connect) {
@@ -3672,7 +3688,7 @@ Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
                return;
        }
 
-       Stripable::PresentationInfoChange(); /* EMIT SIGNAL */
+       PresentationInfo::Change(); /* EMIT SIGNAL */
 
        /* save the new state of the world */
 
@@ -4208,36 +4224,40 @@ Session::track_by_diskstream_id (PBD::ID id) const
 }
 
 boost::shared_ptr<Route>
-Session::get_remote_nth_route (uint16_t n) const
+Session::get_remote_nth_route (PresentationInfo::order_t n) const
 {
        return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
 }
 
-struct GlobalPresentationOrderSorter {
-       bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
-               return a->presentation_info() < b->presentation_info();
-       }
-};
-
 boost::shared_ptr<Stripable>
-Session::get_remote_nth_stripable (uint16_t n, PresentationInfo::Flag flags) const
+Session::get_nth_stripable (PresentationInfo::order_t n) const
 {
        StripableList sl;
-       uint32_t match_cnt = 0;
 
-       /* API is one-based, so adjust n */
+       get_stripables (sl);
 
-       if (n) {
-               --n;
+       for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
+               if ((*s)->presentation_info().order() == n) {
+                       return *s;
+               }
        }
 
+       /* there is no nth stripable */
+
+       return boost::shared_ptr<Stripable>();
+}
+
+boost::shared_ptr<Stripable>
+Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
+{
+       StripableList sl;
+       PresentationInfo::order_t match_cnt = 0;
+
        get_stripables (sl);
-       GlobalPresentationOrderSorter cmp;
-       sl.sort (cmp);
+       sl.sort (Stripable::PresentationOrderSorter());
 
        for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
                if ((*s)->presentation_info().flag_match (flags)) {
-                       cerr << '\t' << (*s)->name() << " matches " << enum_2_string (flags) << endl;
                        if (match_cnt++ == n) {
                                return *s;
                        }
@@ -4265,11 +4285,11 @@ struct PresentationOrderSorter {
                if (a->presentation_info().special() && !b->presentation_info().special()) {
                        /* a is not ordered, b is; b comes before a */
                        return false;
-               } else if (b->presentation_info().unordered() && !a->presentation_info().unordered()) {
+               } else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
                        /* b is not ordered, a is; a comes before b */
                        return true;
                } else {
-                       return a->presentation_info().global_order() < b->presentation_info().global_order();
+                       return a->presentation_info().order() < b->presentation_info().order();
                }
        }
 };
@@ -5366,7 +5386,7 @@ Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::
        if (b->is_monitor()) {
                return false;
        }
-       return a->presentation_info() < b->presentation_info();
+       return a->presentation_info().order() < b->presentation_info().order();
 }
 
 bool
@@ -6183,7 +6203,7 @@ Session::solo_control_mode_changed ()
                   the session's saved solo state). So just explicitly turn
                   them all off.
                */
-               set_controls (route_list_to_control_list (get_routes(), &Route::solo_control), 0.0, Controllable::NoGroup);
+               set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
        }
 }
 
@@ -6713,7 +6733,7 @@ Session::notify_presentation_info_change ()
                return;
        }
 
-       Stripable::PresentationInfoChange (); /* EMIT SIGNAL */
+       PresentationInfo::Change (); /* EMIT SIGNAL */
        reassign_track_numbers();
 
 #ifdef USE_TRACKS_CODE_FEATURES