another TLSF vs realloc-pool shootout
[ardour.git] / libs / ardour / session.cc
index 74f20306d2e54a9e6133d69c1b1a828a46b69a1d..444989789866504a85257be2c0b044fc9ef84cc0 100644 (file)
 
 #include "LuaBridge/LuaBridge.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 #include <glibmm/checksum.h>
 
@@ -178,6 +178,7 @@ Session::Session (AudioEngine &eng,
        , _record_status (Disabled)
        , _transport_frame (0)
        , _session_range_location (0)
+       , _session_range_end_is_free (true)
        , _slave (0)
        , _silent (false)
        , _transport_speed (0)
@@ -212,7 +213,9 @@ Session::Session (AudioEngine &eng,
        , post_export_position (0)
        , _exporting (false)
        , _export_rolling (false)
+       , _realtime_export (false)
        , _export_preroll (0)
+       , _export_latency (0)
        , _pre_export_mmc_enabled (false)
        , _name (snapshot_name)
        , _is_new (true)
@@ -249,6 +252,7 @@ Session::Session (AudioEngine &eng,
        , _rt_thread_active (false)
        , _rt_emit_pending (false)
        , _ac_thread_active (false)
+       , _latency_recompute_pending (0)
        , step_speed (0)
        , outbound_mtc_timecode_frame (0)
        , next_quarter_frame_to_send (-1)
@@ -279,7 +283,6 @@ Session::Session (AudioEngine &eng,
        , _reconnecting_routes_in_progress (false)
        , _route_deletion_in_progress (false)
        , destructive_index (0)
-       , _latency_recompute_pending (0)
        , _track_number_decimals(1)
        , default_fade_steepness (0)
        , default_fade_msecs (0)
@@ -3452,7 +3455,7 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
 
                                if (order == PresentationInfo::max_order) {
                                        /* just add to the end */
-                                       r->set_presentation_order_explicit (n_routes + added);
+                                       r->set_presentation_order (n_routes + added, false);
                                        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_order (order + added);
@@ -4388,12 +4391,18 @@ Session::maybe_update_session_range (framepos_t a, framepos_t b)
                        _session_range_location->set_start (a);
                }
 
-               if (b > _session_range_location->end()) {
+               if (_session_range_end_is_free && (b > _session_range_location->end())) {
                        _session_range_location->set_end (b);
                }
        }
 }
 
+void
+Session::set_end_is_free (bool yn)
+{
+       _session_range_end_is_free = yn;
+}
+
 void
 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
 {
@@ -7015,11 +7024,32 @@ Session::auto_connect_thread_run ()
                        }
                }
 
-               while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
-                       update_latency_compensation ();
+               if (!actively_recording ()) { // might not be needed,
+                       /* this is only used for updating plugin latencies, the
+                        * graph does not change. so it's safe in general.
+                        * BUT..
+                        * .. update_latency_compensation () entails set_capture_offset()
+                        * which calls Diskstream::set_capture_offset () which
+                        * modifies the capture offset... which can be a proplem
+                        * in "prepare_to_stop"
+                        */
+                       while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
+                               update_latency_compensation ();
+                       }
                }
 
                pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
        }
        pthread_mutex_unlock (&_auto_connect_mutex);
 }
+
+void
+Session::cancel_all_solo ()
+{
+       StripableList sl;
+
+       get_stripables (sl);
+
+       set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
+       clear_all_solo_state (routes.reader());
+}