diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 82d07c6be1..fc60c36f95 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -442,6 +442,9 @@ Session::Session (AudioEngine &eng, case -5: throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Port registration failed."))); break; + case -6: + throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Audio/MIDI Engine is not running or sample-rate mismatches."))); + break; default: throw SessionException (string_compose (_("Cannot initialize session/engine: %1"), _("Unexpected exception during session setup, possibly invalid audio/midi engine parameters. Please see stdout/stderr for details"))); break; diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 4c3b8d8785..5a73e05b89 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -282,9 +282,16 @@ Session::post_engine_init () if (state_tree) { try { - if (set_state (*state_tree->root(), Stateful::loading_state_version)) { - error << _("Could not set session state from XML") << endmsg; - return -4; + switch (set_state (*state_tree->root(), Stateful::loading_state_version)) { + case 0: + /* OK */ + break; + case -2: + /* SR mismatch */ + return -6; + default: + error << _("Could not set session state from XML") << endmsg; + return -4; } } catch (PBD::unknown_enumeration& e) { error << _("Session state: ") << e.what() << endmsg; @@ -1674,11 +1681,29 @@ Session::set_state (const XMLNode& node, int version) _nominal_sample_rate = _base_sample_rate; - assert (AudioEngine::instance()->running ()); - if (_base_sample_rate != AudioEngine::instance()->sample_rate ()) { + while (!AudioEngine::instance()->running () || _base_sample_rate != AudioEngine::instance()->sample_rate ()) { boost::optional r = AskAboutSampleRateMismatch (_base_sample_rate, _current_sample_rate); - if (r.value_or (0)) { - goto out; + switch (r.value_or (0)) { + case 0: + if (AudioEngine::instance()->running ()) { + /* continue with rate mismatch */ + break; + } + /* fallthrough */ + case -1: + if (AudioEngine::instance()->running ()) { + /* retry */ + continue; + } + /* fallthrough */ + default: + if (AudioEngine::instance()->running ()) { + error << _("Session: Load aborted due to sample-rate mismatch") << endmsg; + } else { + error << _("Session: Load aborted since engine if offline") << endmsg; + } + ret = -2; + goto out; } } }