From 2437bbbe2315a4f9991874ea8baa5d91230bc139 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Wed, 29 Jul 2015 15:46:26 +1000 Subject: [PATCH] Fix state restoration in Engine dialog for Backends with driver selection Connect to the backend_combo changed signal after setting state as calling backend_combo.set_active_text() in set_state was triggering backend_changed(), which would then see the driver_combo had not been set and set it to the incorrect value. The value/name of the backend needs to be restored first then we can populate the driver combo and set the correct active entry from the saved state. After which backend_changed() will populate the device combo's etc so they can then be set to the correct active values from the saved state. --- gtk2_ardour/engine_dialog.cc | 31 ++++++++++++++++++++++++++++--- gtk2_ardour/engine_dialog.h | 1 + 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 3e9b123485..866f6e563f 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -119,7 +119,6 @@ EngineControl::EngineControl () } set_popdown_strings (backend_combo, backend_names); - backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed)); /* setup basic packing characteristics for the table used on the main * tab of the notebook @@ -303,6 +302,7 @@ EngineControl::EngineControl () /* Connect to signals */ + backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed)); driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed)); sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed)); buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed)); @@ -851,6 +851,23 @@ EngineControl::print_channel_count (Gtk::SpinButton* sb) return true; } +bool +EngineControl::set_driver_popdown_strings () +{ + string backend_name = backend_combo.get_active_text(); + boost::shared_ptr backend; + + if (!(backend = ARDOUR::AudioEngine::instance()->set_backend (backend_name, "ardour", ""))) { + /* eh? setting the backend failed... how ? */ + /* A: stale config contains a backend that does not exist in current build */ + return false; + } + + vector drivers = backend->enumerate_drivers(); + set_popdown_strings (driver_combo, drivers); + return true; +} + // @return true if there are devices available bool EngineControl::set_device_popdown_strings () @@ -1750,11 +1767,19 @@ EngineControl::set_state (const XMLNode& root) if ((*i)->active) { PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); backend_combo.set_active_text ((*i)->backend); + + /* The driver popdown strings need to be populated now so that + * set_active_text will actually set a valid entry. Then + * backend_changed() will populate all the other combo's so they + * can also be set to valid entries and the state will be restored + * correctly. + */ + set_driver_popdown_strings (); driver_combo.set_active_text ((*i)->driver); + backend_changed (); + device_combo.set_active_text ((*i)->device); - fprintf (stderr, "setting input device to: %s ", (*i)->input_device.c_str()); input_device_combo.set_active_text ((*i)->input_device); - fprintf (stderr, "setting output device to: %s ", (*i)->output_device.c_str()); output_device_combo.set_active_text ((*i)->output_device); sample_rate_combo.set_active_text (rate_as_string ((*i)->sample_rate)); set_active_text_if_present (buffer_size_combo, bufsize_as_string ((*i)->buffer_size)); diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 1ca9937324..4d7d54163c 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -152,6 +152,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void device_changed (); void input_device_changed (); void output_device_changed (); + bool set_driver_popdown_strings (); bool set_device_popdown_strings (); bool set_input_device_popdown_strings (); bool set_output_device_popdown_strings ();