PBD::Signal0<void> Session::FeedbackDetected;
PBD::Signal0<void> Session::SuccessfulGraphSort;
PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
-PBD::Signal0<void> Session::EditorMixerChanged;
const framecnt_t Session::bounce_chunk_size = 8192;
static void clean_up_session_event (SessionEvent* ev) { delete ev; }
, _exporting (false)
, _export_rolling (false)
, _export_preroll (0)
+ , _export_latency (0)
, _pre_export_mmc_enabled (false)
, _name (snapshot_name)
, _is_new (true)
, _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)
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;
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);
}
}
+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);
}