, pending_locate_flush (false)
, pending_abort (false)
, pending_auto_loop (false)
- , _mempool ("Session", 1048576)
+ , _mempool ("Session", 2097152)
, lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
, _n_lua_scripts (0)
, _butler (new Butler (*this))
, _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)
route_group->add (bus);
}
+ bus->add_internal_return ();
ret.push_back (bus);
}
r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
+ r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
if (r->is_master()) {
_master_out = r;
Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
if (tm.locked ()) {
try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
+ lua.collect_garbage_step ();
}
}
#ifndef NDEBUG
lua.Print.connect (&_lua_print);
#endif
+ lua.tweak_rt_gc ();
lua.do_command (
"function ArdourSession ()"
" local self = { scripts = {}, instances = {} }"
}
}
+void
+Session::queue_latency_recompute ()
+{
+ g_atomic_int_inc (&_latency_recompute_pending);
+ if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
+ pthread_cond_signal (&_auto_connect_cond);
+ pthread_mutex_unlock (&_auto_connect_mutex);
+ }
+}
+
void
Session::auto_connect (const AutoConnectRequest& ar)
{
}
}
- pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
- }
- pthread_mutex_unlock (&_auto_connect_mutex);
-}
-
-void
-Session::clear_stripable_selection ()
-{
- StripableList sl;
- get_stripables (sl);
-
- for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
- (*si)->presentation_info().set_selected (false);
- }
-
-}
-
-void
-Session::toggle_stripable_selection (boost::shared_ptr<Stripable> s)
-{
- s->presentation_info().set_selected (!s->presentation_info().selected());
-}
-
-void
-Session::add_stripable_selection (boost::shared_ptr<Stripable> s)
-{
- if (!s->presentation_info().selected ()) {
- s->presentation_info().set_selected (true);
- }
-}
-
-void
-Session::set_stripable_selection (boost::shared_ptr<Stripable> s)
-{
- StripableList sl;
- bool change = false;
-
- get_stripables (sl);
-
- for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
- if ((*si)->presentation_info().selected()) {
- change = true;
+ 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 ();
+ }
}
- (*si)->presentation_info().set_selected (false);
- }
-
- if (!s->presentation_info().selected()) {
- change = true;
- s->presentation_info().set_selected (true);
- }
-
- if (change) {
- // PresentationInfo::SelectionChange (); /* EMIT SIGNAL */
+ pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
}
+ pthread_mutex_unlock (&_auto_connect_mutex);
}