From 6e0a3c4853ae94aebe487161f2c1f2ad9bb8a875 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 15 Oct 2013 13:15:03 -0400 Subject: try to prevent crash if running latency calibration with JACK setup that is lacking input or output ports (re: #5721 and #5719) --- gtk2_ardour/engine_dialog.cc | 41 ++++++++++++++++++++++++++++++++++------- gtk2_ardour/engine_dialog.h | 1 + 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index aff1e22508..c7d996ae55 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -336,7 +336,7 @@ EngineControl::EngineControl () basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0); basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0); - lm_button.signal_clicked.connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), latency_tab)); + lm_button.signal_clicked.connect (sigc::mem_fun (*this, &EngineControl::calibrate_latency)); lm_button.set_name ("record enable button"); if (_have_control) { build_full_control_notebook (); @@ -514,14 +514,34 @@ EngineControl::EngineControl () EngineControl::enable_latency_tab () { vector outputs; - ARDOUR::AudioEngine::instance()->get_physical_outputs (ARDOUR::DataType::AUDIO, outputs); - set_popdown_strings (lm_output_channel_combo, outputs); - lm_output_channel_combo.set_active_text (outputs.front()); - vector inputs; + + ARDOUR::AudioEngine::instance()->get_physical_outputs (ARDOUR::DataType::AUDIO, outputs); ARDOUR::AudioEngine::instance()->get_physical_inputs (ARDOUR::DataType::AUDIO, inputs); - set_popdown_strings (lm_input_channel_combo, inputs); - lm_input_channel_combo.set_active_text (inputs.front()); + + if (inputs.empty() || outputs.empty()) { + MessageDialog msg (_("Your selected audio configuration is playback- or capture-only.\n\nLatency calibration requires playback and capture")); + lm_measure_button.set_sensitive (false); + notebook.set_current_page (0); + msg.run (); + return; + } + + if (!outputs.empty()) { + set_popdown_strings (lm_output_channel_combo, outputs); + lm_output_channel_combo.set_active_text (outputs.front()); + lm_output_channel_combo.set_sensitive (true); + } else { + lm_output_channel_combo.set_sensitive (false); + } + + if (!inputs.empty()) { + set_popdown_strings (lm_input_channel_combo, inputs); + lm_input_channel_combo.set_active_text (inputs.front()); + lm_input_channel_combo.set_sensitive (true); + } else { + lm_input_channel_combo.set_sensitive (false); + } lm_measure_button.set_sensitive (true); } @@ -1795,3 +1815,10 @@ EngineControl::connect_disconnect_click() ARDOUR_UI::instance()->reconnect_to_engine (); } } + +void +EngineControl::calibrate_latency () +{ + notebook.set_current_page (latency_tab); +} + diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 0bf1c3a507..1bf15c2111 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -212,6 +212,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { PBD::ScopedConnection stopped_connection; void connect_disconnect_click (); + void calibrate_latency (); }; #endif /* __gtk2_ardour_engine_dialog_h__ */ -- cgit v1.2.3