13
0

Correctly set sample-rate of plugins when loading a different session

Directly loading a new session (Session > Recent) stops the engine
when the sample-rate mismatches. All is fine.

When closing a session (Session > Close), the engine is kept running.
Loading a different session with different sample-rate shows
the "SR mismatch" dialog. Reconfiguring the engine then does not call
`Session::immediately_post_engine` again.
This commit is contained in:
Robin Gareus 2023-07-03 00:13:20 +02:00
parent 7e121f4e13
commit a36ddb72dd
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -1704,8 +1704,7 @@ Session::set_state (const XMLNode& node, int version)
if (node.get_property (X_("sample-rate"), _base_sample_rate)) {
/* required to convert positions during session load */
Temporal::set_sample_rate (_base_sample_rate);
bool reconfigured = false;
while (!AudioEngine::instance()->running () || _base_sample_rate != AudioEngine::instance()->sample_rate ()) {
boost::optional<int> r = AskAboutSampleRateMismatch (_base_sample_rate, _current_sample_rate);
@ -1715,7 +1714,7 @@ Session::set_state (const XMLNode& node, int version)
break;
} else if (rv == -1 && AudioEngine::instance()->running ()) {
/* retry */
set_block_size (_engine.samples_per_cycle());
reconfigured = true;
continue;
} else {
if (AudioEngine::instance()->running ()) {
@ -1728,14 +1727,32 @@ Session::set_state (const XMLNode& node, int version)
}
}
if (_base_sample_rate != _engine.sample_rate ()) {
if (reconfigured) {
set_block_size (_engine.samples_per_cycle());
}
if (_base_sample_rate != _engine.sample_rate () || reconfigured) {
/* set _current_sample_rate early on. It is used when instantiating plugins.
* This also calls Temporal::set_sample_rate, which is required to
* to convert positions during session load.
*/
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 ();
} else {
/* required to convert positions during session load */
Temporal::set_sample_rate (_base_sample_rate);
/* all other initialization is correctly done by
* Session::immediately_post_engine
*/
}
} else {
error << _("Session: XML state has no sample-rate ") << endmsg;
goto out;
}
/* need the tempo map setup ASAP */