Warn user if the engine device changed

This prevents accidentally auto-starting the engine (most recently
used device) with a session that recently used different hardware.
This commit is contained in:
Robin Gareus 2021-02-23 19:26:01 +01:00
parent 0b00eabb19
commit 33c596e149
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04
2 changed files with 41 additions and 6 deletions

View File

@ -28,6 +28,7 @@
#include "pbd/file_utils.h"
#include "ardour/audioengine.h"
#include "ardour/audio_backend.h"
#include "ardour/filename_extensions.h"
#include "ardour/filesystem_paths.h"
#include "ardour/profile.h"
@ -69,6 +70,7 @@ using std::vector;
StartupFSM::StartupFSM (EngineControl& amd)
: session_existing_sample_rate (0)
, session_engine_hints ("Engine Hints")
, session_is_new (false)
, session_name_edited (false)
, new_user (NewUserWizard::required())
@ -437,7 +439,8 @@ StartupFSM::start_audio_midi_setup ()
{
bool setup_required = false;
if (AudioEngine::instance()->current_backend() == 0) {
boost::shared_ptr<AudioBackend> backend = AudioEngine::instance()->current_backend();
if (!backend) {
/* backend is unknown ... */
setup_required = true;
@ -457,10 +460,41 @@ StartupFSM::start_audio_midi_setup ()
}
}
bool try_autostart = (Config->get_try_autostart_engine () || g_getenv ("ARDOUR_TRY_AUTOSTART_ENGINE"));
if (session_is_new) {
try_autostart = false;
} else if (!backend) {
try_autostart = false;
} else if (try_autostart) {
/* if user has selected auto-start, check if autostart is possible */
bool ok = true;
std::string backend_name;
std::string input_device;
std::string output_device;
ok &= session_engine_hints.get_property ("backend", backend_name);
ok &= session_engine_hints.get_property ("input-device", input_device);
ok &= session_engine_hints.get_property ("output-device", output_device);
ok &= backend->name () == backend_name;
if (backend->use_separate_input_and_output_devices()) {
ok &= input_device == backend->input_device_name ();
ok &= output_device == backend->output_device_name ();
} else {
ok &= input_device == backend->device_name ();
ok &= output_device == backend->device_name ();
}
if (!ok) {
try_autostart = false;
ArdourMessageDialog msg (
_("Engine I/O device has changed since you last opened this session.\n"
"Please verify that the new device has enough ports, or you may lose some i/o connections."),
false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_OK, true);
msg.run ();
}
}
if (setup_required) {
if (!session_is_new && (Config->get_try_autostart_engine () || g_getenv ("ARDOUR_TRY_AUTOSTART_ENGINE"))) {
if (try_autostart) {
AudioEngine::instance()->set_sample_rate(session_existing_sample_rate);
if (!AudioEngine::instance()->start ()) {
if (ARDOUR::AudioEngine::instance()->running()) {
@ -552,7 +586,7 @@ StartupFSM::get_session_parameters_from_path (string const & path, string const
string program_version;
const string statefile_path = Glib::build_filename (session_path, session_name + ARDOUR::statefile_suffix);
if (Session::get_info_from_path (statefile_path, sr, fmt, program_version)) {
if (Session::get_info_from_path (statefile_path, sr, fmt, program_version, &session_engine_hints)) {
/* exists but we can't read it correctly */
error << string_compose (_("Cannot get existing session information from %1"), statefile_path) << endmsg;
return false;
@ -786,7 +820,7 @@ StartupFSM::check_session_parameters (bool must_be_new)
if (!session_is_new) {
if (Session::get_info_from_path (statefile_path, sr, fmt, program_version)) {
if (Session::get_info_from_path (statefile_path, sr, fmt, program_version, &session_engine_hints)) {
/* exists but we can't read it */
return -1;
}

View File

@ -66,6 +66,7 @@ class StartupFSM : public sigc::trackable
std::string session_name;
std::string session_template;
int session_existing_sample_rate;
XMLNode session_engine_hints;
bool session_is_new;
bool session_name_edited;