diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 14b9210d81..5bc5da4065 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1486,6 +1486,8 @@ private: void send_latency_compensation_change (); void update_send_delaylines (); + void setup_engine_resampling (); + void ensure_buffers (ChanCount howmany = ChanCount::ZERO); void process_scrub (pframes_t); diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index 8033e449f2..dc3d8b328b 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -711,26 +711,29 @@ Port::set_state (const XMLNode& node, int) /* static */ bool Port::setup_resampler (uint32_t q) { - /* configure at application start (Ardour::init) */ - if (port_manager && port_manager->session_port_count() > 0) { - return false; - } + uint32_t cur_quality = _resampler_quality; if (q == 0) { /* no vari-speed */ _resampler_quality = 0; _resampler_latency = 0; - return true; + } else { + /* range constrained in VMResampler::setup */ + if (q < 8) { + q = 8; + } + if (q > 96) { + q = 96; + } + _resampler_quality = q; + _resampler_latency = q - 1; } - // range constrained in VMResampler::setup - if (q < 8) { - q = 8; + + if (port_manager && cur_quality != _resampler_quality) { + Glib::Threads::Mutex::Lock lm (port_manager->process_lock ()); + port_manager->reinit (true); + return false; } - if (q > 96) { - q = 96; - } - _resampler_quality = q; - _resampler_latency = q - 1; return true; } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index d300f817c0..7ca57bf657 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -565,6 +565,7 @@ Session::immediately_post_engine () * know that the engine is running, but before we either create a * session or set state for an existing one. */ + Port::setup_resampler (Config->get_port_resampler_quality ()); _process_graph.reset (new Graph (*this)); _rt_tasklist.reset (new RTTaskList (_process_graph)); @@ -6727,11 +6728,22 @@ Session::missing_filesources (DataType dt) const return p; } +void +Session::setup_engine_resampling () +{ + if (_base_sample_rate != AudioEngine::instance()->sample_rate ()) { + Port::setup_resampler (std::max(65, Config->get_port_resampler_quality ())); + } else { + Port::setup_resampler (Config->get_port_resampler_quality ()); + } + Port::set_engine_ratio (_base_sample_rate, AudioEngine::instance()->sample_rate ()); +} + void Session::initialize_latencies () { block_processing (); - Port::set_engine_ratio (_base_sample_rate, AudioEngine::instance()->sample_rate ()); + setup_engine_resampling (); update_latency (false); update_latency (true); unblock_processing (); diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 46bd68ab3d..cff12e388f 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1716,6 +1716,11 @@ Session::set_state (const XMLNode& node, int version) if (_base_sample_rate != _engine.sample_rate ()) { set_sample_rate (_base_sample_rate); + /* post_engine_init() calls initialize_latencies() + * which sets up resampling. However by that time all session + * ports will exist and would be need to be reinitialized. + */ + setup_engine_resampling (); } }