+void
+EngineControl::update_sensitivity ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ if (!backend) {
+ ok_button->set_sensitive (false);
+ start_stop_button.set_sensitive (false);
+ return;
+ }
+
+ bool valid = true;
+ size_t devices_available = 0;
+
+ if (backend->use_separate_input_and_output_devices ()) {
+ devices_available += get_popdown_string_count (input_device_combo);
+ devices_available += get_popdown_string_count (output_device_combo);
+ } else {
+ devices_available += get_popdown_string_count (device_combo);
+ }
+
+ if (devices_available == 0) {
+ valid = false;
+ input_latency.set_sensitive (false);
+ output_latency.set_sensitive (false);
+ input_channels.set_sensitive (false);
+ output_channels.set_sensitive (false);
+ } else {
+ input_latency.set_sensitive (true);
+ output_latency.set_sensitive (true);
+ input_channels.set_sensitive (true);
+ output_channels.set_sensitive (true);
+ }
+
+ if (get_popdown_string_count (buffer_size_combo) > 0) {
+ if (!ARDOUR::AudioEngine::instance()->running()) {
+ buffer_size_combo.set_sensitive (valid);
+ } else if (backend->can_change_sample_rate_when_running()) {
+ buffer_size_combo.set_sensitive (valid || !_have_control);
+ } else {
+#if 1
+ /* TODO
+ * Currently there is no way to manually stop the
+ * engine in order to re-configure it.
+ * This needs to remain sensitive for now.
+ *
+ * (it's also handy to implicily
+ * re-start the engine)
+ */
+ buffer_size_combo.set_sensitive (true);
+#else
+ buffer_size_combo.set_sensitive (false);
+#endif
+ }
+ } else {
+ buffer_size_combo.set_sensitive (false);
+ valid = false;
+ }
+
+ if (get_popdown_string_count (sample_rate_combo) > 0) {
+ if (!ARDOUR::AudioEngine::instance()->running()) {
+ sample_rate_combo.set_sensitive (true);
+ } else {
+ sample_rate_combo.set_sensitive (false);
+ }
+ } else {
+ sample_rate_combo.set_sensitive (false);
+ valid = false;
+ }
+
+ if (get_popdown_string_count (nperiods_combo) > 0) {
+ if (!ARDOUR::AudioEngine::instance()->running()) {
+ nperiods_combo.set_sensitive (true);
+ } else {
+ nperiods_combo.set_sensitive (false);
+ }
+ } else {
+ nperiods_combo.set_sensitive (false);
+ }
+
+ if (_have_control) {
+ start_stop_button.set_sensitive(true);
+ start_stop_button.show();
+ if (ARDOUR::AudioEngine::instance()->running()) {
+ start_stop_button.set_text("Stop");
+ update_devices_button.set_sensitive(false);
+ use_buffered_io_button.set_sensitive(false);
+ } else {
+ if (backend->can_request_update_devices()) {
+ update_devices_button.show();
+ } else {
+ update_devices_button.hide();
+ }
+ if (backend->can_use_buffered_io()) {
+ use_buffered_io_button.show();
+ } else {
+ use_buffered_io_button.hide();
+ }
+ start_stop_button.set_text("Start");
+ update_devices_button.set_sensitive(true);
+ use_buffered_io_button.set_sensitive(true);
+ }
+ } else {
+ update_devices_button.set_sensitive(false);
+ update_devices_button.hide();
+ use_buffered_io_button.set_sensitive(false);
+ use_buffered_io_button.hide();
+ start_stop_button.set_sensitive(false);
+ start_stop_button.hide();
+ }
+
+ if (ARDOUR::AudioEngine::instance()->running() && _have_control) {
+ input_device_combo.set_sensitive (false);
+ output_device_combo.set_sensitive (false);
+ device_combo.set_sensitive (false);
+ driver_combo.set_sensitive (false);
+ } else {
+ input_device_combo.set_sensitive (true);
+ output_device_combo.set_sensitive (true);
+ device_combo.set_sensitive (true);
+ if (backend->requires_driver_selection() && get_popdown_string_count(driver_combo) > 0) {
+ driver_combo.set_sensitive (true);
+ } else {
+ driver_combo.set_sensitive (false);
+ }
+ }
+
+ if (valid || !_have_control) {
+ ok_button->set_sensitive (true);
+ } else {
+ ok_button->set_sensitive (false);
+ }
+}
+