X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession.cc;h=043d72d1283bed0edb34d445094a579f4ce5d25f;hb=2afaa517170fe18c3448ba7378621d80ee5667cf;hp=677aca249e01d21545492539483c130e98e8c07c;hpb=a2f249d1d7a14498f9b1c0b46f89be4a7e611c37;p=ardour.git diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 677aca249e..043d72d128 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -148,7 +148,6 @@ PBD::Signal0 Session::Quit; PBD::Signal0 Session::FeedbackDetected; PBD::Signal0 Session::SuccessfulGraphSort; PBD::Signal2 Session::VersionMismatch; -PBD::Signal0 Session::EditorMixerChanged; const framecnt_t Session::bounce_chunk_size = 8192; static void clean_up_session_event (SessionEvent* ev) { delete ev; } @@ -214,6 +213,7 @@ Session::Session (AudioEngine &eng, , _exporting (false) , _export_rolling (false) , _export_preroll (0) + , _export_latency (0) , _pre_export_mmc_enabled (false) , _name (snapshot_name) , _is_new (true) @@ -250,6 +250,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) @@ -2581,6 +2582,7 @@ Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name route_group->add (bus); } + bus->add_internal_return (); ret.push_back (bus); } @@ -3418,6 +3420,7 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool 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; @@ -3450,7 +3453,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); @@ -6838,6 +6841,16 @@ Session::auto_connect_route (boost::shared_ptr route, bool connect_inputs } } +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) { @@ -7003,59 +7016,21 @@ Session::auto_connect_thread_run () } } - 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 s) -{ - s->presentation_info().set_selected (!s->presentation_info().selected()); -} - -void -Session::add_stripable_selection (boost::shared_ptr s) -{ - if (!s->presentation_info().selected ()) { - s->presentation_info().set_selected (true); - } -} - -void -Session::set_stripable_selection (boost::shared_ptr 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); }