X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fengine_dialog.cc;h=c88c836dfe72ab2b9087caa4bc0092c02004b29e;hb=edb9a24727e27b9873cbb06ebc72d94381f41ea9;hp=4e65ef828f78b71c67bc1ad13fb7aa10474e9295;hpb=37b8412aa3cbc4169c6a7cab4e9b89c75524d8fd;p=ardour.git diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 4e65ef828f..c88c836dfe 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -68,6 +68,7 @@ static const char* results_markup = X_("%1 EngineControl::EngineControl () : ArdourDialog (_("Audio/MIDI Setup")) + , engine_status ("") , basic_packer (9, 4) , input_latency_adjustment (0, 0, 99999, 1) , input_latency (input_latency_adjustment) @@ -92,9 +93,10 @@ EngineControl::EngineControl () , ignore_changes (0) , _desired_sample_rate (0) , started_at_least_once (false) + , queue_device_changed (false) { using namespace Notebook_Helpers; - vector strings; + vector backend_names; Label* label; AttachOptions xopt = AttachOptions (FILL|EXPAND); int row; @@ -112,11 +114,10 @@ EngineControl::EngineControl () } for (vector::const_iterator b = backends.begin(); b != backends.end(); ++b) { - strings.push_back ((*b)->name); + backend_names.push_back ((*b)->name); } - set_popdown_strings (backend_combo, strings); - backend_combo.set_active_text (strings.front()); + 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 @@ -248,6 +249,9 @@ EngineControl::EngineControl () get_vbox()->set_border_width (12); get_vbox()->pack_start (notebook); + get_action_area()->pack_start (engine_status); + engine_status.show(); + /* need a special function to print "all available channels" when the * channel counts hit zero. */ @@ -263,9 +267,9 @@ EngineControl::EngineControl () control_app_button.signal_clicked().connect (mem_fun (*this, &EngineControl::control_app_button_clicked)); manage_control_app_sensitivity (); - cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - ok_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); + cancel_button = add_button (Gtk::Stock::CLOSE, Gtk::RESPONSE_CANCEL); apply_button = add_button (Gtk::Stock::APPLY, Gtk::RESPONSE_APPLY); + ok_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_OK); /* Pick up any existing audio setup configuration, if appropriate */ @@ -274,17 +278,28 @@ EngineControl::EngineControl () ARDOUR::AudioEngine::instance()->Running.connect (running_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_running, this), gui_context()); ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context()); + ARDOUR::AudioEngine::instance()->DeviceListChanged.connect (devicelist_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::device_list_changed, this), gui_context()); - if (audio_setup) - { + if (audio_setup) { set_state (*audio_setup); } - { + + if (backend_combo.get_active_text().empty()) { + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); + backend_combo.set_active_text (backend_names.front()); + } + + backend_changed (); + + /* in case the setting the backend failed, e.g. stale config, from set_state(), try again */ + if (0 == ARDOUR::AudioEngine::instance()->current_backend()) { + backend_combo.set_active_text (backend_names.back()); /* ignore: don't save state */ PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); backend_changed (); } + /* Connect to signals */ driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed)); @@ -309,6 +324,10 @@ void EngineControl::on_show () { ArdourDialog::on_show (); + if (!ARDOUR::AudioEngine::instance()->current_backend() || !ARDOUR::AudioEngine::instance()->running()) { + // re-check _have_control (jackd running) see #6041 + backend_changed (); + } device_changed (); ok_button->grab_focus(); } @@ -475,7 +494,7 @@ EngineControl::build_full_control_notebook () basic_packer.attach (lm_button_audio, 3, 4, row-1, row+1, xopt, xopt); ++row; - label = manage (left_aligned_label (_("MIDI System"))); + label = manage (left_aligned_label (_("MIDI System:"))); basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0); basic_packer.attach (midi_option_combo, 1, 2, row, row + 1, SHRINK, (AttachOptions) 0); basic_packer.attach (midi_devices_button, 3, 4, row, row+1, xopt, xopt); @@ -704,6 +723,7 @@ EngineControl::backend_changed () 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; } @@ -776,7 +796,6 @@ bool EngineControl::print_channel_count (Gtk::SpinButton* sb) { if (ARDOUR::Profile->get_mixbus()) { - cout << "Mixbus crash trap. sb->get_value(): " << sb->get_value(); return true; } @@ -821,15 +840,22 @@ EngineControl::list_devices () update_sensitivity (); { - string current_device; - current_device = backend->device_name (); + string current_device, found_device; + current_device = device_combo.get_active_text (); if (current_device == "") { - // device might not have been set yet - current_device = device_combo.get_active_text (); - if (current_device == "") - // device has never been set, make sure it's not blank - current_device = available_devices.front (); + current_device = backend->device_name (); + } + + // Make sure that the active text is still relevant for this + // device (it might only be relevant to the previous device!!) + for (vector::const_iterator i = available_devices.begin(); i != available_devices.end(); ++i) { + if (*i == current_device) + found_device = current_device; } + if (found_device == "") + // device has never been set (or was not relevant + // for this backend) Let's make sure it's not blank + current_device = available_devices.front (); PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); set_popdown_strings (device_combo, available_devices); @@ -895,6 +921,18 @@ EngineControl::device_changed () string device_name = device_combo.get_active_text (); vector s; + if (device_name != backend->device_name()) { + /* we set the backend-device to query various device related intormation. + * This has the side effect that backend->device_name() will match + * the device_name and 'change_device' will never be true. + * so work around this by setting... + */ + queue_device_changed = true; + } + + //the device name must be set FIRST so ASIO can populate buffersizes and the control panel button + backend->set_device_name(device_name); + { PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); @@ -976,7 +1014,7 @@ EngineControl::device_changed () if (0 == period) { period = backend->default_buffer_size(device_name); } - buffer_size_combo.set_active_text (bufsize_as_string (period)); + set_active_text_if_present (buffer_size_combo, bufsize_as_string (period)); show_buffer_duration (); } else { buffer_size_combo.set_sensitive (false); @@ -1001,8 +1039,8 @@ EngineControl::bufsize_as_string (uint32_t sz) /* Translators: "samples" is always plural here, so no need for plural+singular forms. */ - char buf[32]; - snprintf (buf, sizeof (buf), _("%u samples"), sz); + char buf[64]; + snprintf (buf, sizeof (buf), "%u %s", sz, P_("sample", "samples", sz)); return buf; } @@ -1014,9 +1052,6 @@ EngineControl::sample_rate_changed () */ show_buffer_duration (); - if (!ignore_changes) { - save_state (); - } } @@ -1024,9 +1059,6 @@ void EngineControl::buffer_size_changed () { show_buffer_duration (); - if (!ignore_changes) { - save_state (); - } } void @@ -1100,18 +1132,11 @@ EngineControl::midi_option_changed () } else { midi_devices_button.set_sensitive (true); } - - if (!ignore_changes) { - save_state (); - } } void EngineControl::parameter_changed () { - if (!ignore_changes) { - save_state (); - } } EngineControl::State @@ -1210,7 +1235,7 @@ EngineControl::maybe_display_saved_state () if (!_desired_sample_rate) { sample_rate_combo.set_active_text (rate_as_string (state->sample_rate)); } - buffer_size_combo.set_active_text (bufsize_as_string (state->buffer_size)); + set_active_text_if_present (buffer_size_combo, bufsize_as_string (state->buffer_size)); /* call this explicitly because we're ignoring changes to the controls at this point. */ @@ -1423,16 +1448,15 @@ EngineControl::set_state (const XMLNode& root) for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { if ((*i)->active) { - ignore_changes++; + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); backend_combo.set_active_text ((*i)->backend); driver_combo.set_active_text ((*i)->driver); device_combo.set_active_text ((*i)->device); sample_rate_combo.set_active_text (rate_as_string ((*i)->sample_rate)); - buffer_size_combo.set_active_text (bufsize_as_string ((*i)->buffer_size)); + set_active_text_if_present (buffer_size_combo, bufsize_as_string ((*i)->buffer_size)); input_latency.set_value ((*i)->input_latency); output_latency.set_value ((*i)->output_latency); midi_option_combo.set_active_text ((*i)->midi_option); - ignore_changes--; break; } } @@ -1474,7 +1498,7 @@ EngineControl::push_state_to_backend (bool start) } } - if (get_device_name() != backend->device_name()) { + if (queue_device_changed || get_device_name() != backend->device_name()) { change_device = true; } @@ -1543,6 +1567,8 @@ EngineControl::push_state_to_backend (bool start) } } + queue_device_changed = false; + if (!_have_control) { /* We do not have control over the backend, so the best we can @@ -1701,6 +1727,8 @@ EngineControl::post_push () if (!state) { state = save_state (); assert (state); + } else { + store_state(state); } /* all off */ @@ -1745,6 +1773,8 @@ EngineControl::get_buffer_size () const uint32_t samples; if (sscanf (txt.c_str(), "%d", &samples) != 1) { + fprintf(stderr, "Find a trout and repeatedly slap the nearest C++ who throws exceptions without catching them.\n"); + fprintf(stderr, "Ardour will likely crash now, giving you time to get the trout.\n"); throw exception (); } @@ -2136,7 +2166,7 @@ EngineControl::engine_running () boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); assert (backend); - buffer_size_combo.set_active_text (bufsize_as_string (backend->buffer_size())); + set_active_text_if_present (buffer_size_combo, bufsize_as_string (backend->buffer_size())); sample_rate_combo.set_active_text (rate_as_string (backend->sample_rate())); buffer_size_combo.set_sensitive (true); @@ -2146,6 +2176,7 @@ EngineControl::engine_running () connect_disconnect_button.show(); started_at_least_once = true; + engine_status.set_markup(string_compose ("%1", _("Active"))); } void @@ -2160,6 +2191,15 @@ EngineControl::engine_stopped () sample_rate_combo.set_sensitive (true); buffer_size_combo.set_sensitive (true); + engine_status.set_markup(string_compose ("%1", _("Inactive"))); +} + +void +EngineControl::device_list_changed () +{ + PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); // ?? + list_devices (); + midi_option_changed(); } void