X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fengine_dialog.cc;h=bc378afebe91e96365dfdf6146680fca0b1b4270;hb=007c4ffdc0bb8a6de967e499885284b2d3b3d0c2;hp=f96bcf1b8b68cca75d2383cb99c8efaed241ff9f;hpb=5c926136988757f1f11a14c11720ed3daac3195f;p=ardour.git diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index f96bcf1b8b..bc378afebe 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -430,7 +430,7 @@ EngineControl::on_show () void EngineControl::on_map () { - if (!ARDOUR_UI::instance()->session_loaded && !PublicEditor::_instance) { + if (!ARDOUR_UI::instance()->the_session () && !PublicEditor::_instance) { set_type_hint (Gdk::WINDOW_TYPE_HINT_NORMAL); } else if (UIConfiguration::instance().get_all_floating_windows_are_dialogs()) { set_type_hint (Gdk::WINDOW_TYPE_HINT_DIALOG); @@ -803,22 +803,10 @@ EngineControl::update_sensitivity () if (get_popdown_string_count (buffer_size_combo) > 0) { if (!engine_running) { buffer_size_combo.set_sensitive (valid); - } else if (backend->can_change_sample_rate_when_running()) { + } else if (backend->can_change_buffer_size_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); @@ -828,7 +816,7 @@ EngineControl::update_sensitivity () if (get_popdown_string_count (sample_rate_combo) > 0) { bool allow_to_set_rate = false; if (!engine_running) { - if (!ARDOUR_UI::instance()->session_loaded) { + if (!ARDOUR_UI::instance()->the_session ()) { // engine is not running, no session loaded -> anything goes. allow_to_set_rate = true; } else if (_desired_sample_rate > 0 && get_rate () != _desired_sample_rate) { @@ -914,6 +902,18 @@ EngineControl::midi_latency_adjustment_changed (Gtk::Adjustment *a, MidiDeviceSe } else { device->output_latency = a->get_value(); } + + if (ARDOUR::AudioEngine::instance()->running() && !_measure_midi) { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + if (backend->can_change_systemic_latency_when_running () && device->enabled) { + if (for_input) { + backend->set_systemic_midi_input_latency (device->name, device->input_latency); + } else { + backend->set_systemic_midi_output_latency (device->name, device->output_latency); + } + } + } } void @@ -921,6 +921,16 @@ EngineControl::midi_device_enabled_toggled (ArdourButton *b, MidiDeviceSettings b->set_active (!b->get_active()); device->enabled = b->get_active(); refresh_midi_display(device->name); + + if (ARDOUR::AudioEngine::instance()->running()) { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + assert (backend); + backend->set_midi_device_enabled (device->name, device->enabled); + if (backend->can_change_systemic_latency_when_running () && device->enabled) { + backend->set_systemic_midi_input_latency (device->name, device->input_latency); + backend->set_systemic_midi_output_latency (device->name, device->output_latency); + } + } } void @@ -1044,6 +1054,7 @@ EngineControl::backend_changed () if (!_have_control) { // set settings from backend that we do have control over + set_buffersize_popdown_strings (); set_active_text_if_present (buffer_size_combo, bufsize_as_string (backend->buffer_size())); } @@ -1375,8 +1386,15 @@ EngineControl::set_samplerate_popdown_strings () if (!s.empty()) { if (ARDOUR::AudioEngine::instance()->running()) { sample_rate_combo.set_active_text (rate_as_string (backend->sample_rate())); - } - else if (desired.empty ()) { + } else if (ARDOUR_UI::instance()->the_session ()) { + float active_sr = ARDOUR_UI::instance()->the_session()->nominal_sample_rate (); + + if (std::find (sr.begin (), sr.end (), active_sr) == sr.end ()) { + active_sr = sr.front (); + } + + sample_rate_combo.set_active_text (rate_as_string (active_sr)); + } else if (desired.empty ()) { float new_active_sr = backend->default_sample_rate (); if (std::find (sr.begin (), sr.end (), new_active_sr) == sr.end ()) { @@ -1387,7 +1405,6 @@ EngineControl::set_samplerate_popdown_strings () } else { sample_rate_combo.set_active_text (desired); } - } update_sensitivity (); } @@ -1443,7 +1460,7 @@ EngineControl::set_buffersize_popdown_strings () s.push_back (bufsize_as_string (*x)); } - uint32_t previous_size = 0; + uint32_t previous_size = backend->buffer_size (); if (!buffer_size_combo.get_active_text().empty()) { previous_size = get_buffer_size (); } @@ -1634,6 +1651,12 @@ void EngineControl::buffer_size_changed () { DEBUG_ECONTROL ("buffer_size_changed"); + if (ARDOUR::AudioEngine::instance()->running()) { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); + if (backend && backend->can_change_buffer_size_when_running ()) { + backend->set_buffer_size (get_buffer_size()); + } + } show_buffer_duration (); } @@ -1869,7 +1892,7 @@ EngineControl::store_state (State state) void EngineControl::maybe_display_saved_state () { - if (!_have_control) { + if (!_have_control || ARDOUR::AudioEngine::instance()->running ()) { return; } @@ -1879,7 +1902,7 @@ EngineControl::maybe_display_saved_state () DEBUG_ECONTROL ("Restoring saved state"); PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); - if (!_desired_sample_rate) { + if (0 == _desired_sample_rate && sample_rate_combo.get_sensitive ()) { sample_rate_combo.set_active_text (rate_as_string (state->sample_rate)); } set_active_text_if_present (buffer_size_combo, bufsize_as_string (state->buffer_size)); @@ -2204,7 +2227,7 @@ EngineControl::set_current_state (const State& state) device_combo.set_active_text (state->device); input_device_combo.set_active_text (state->input_device); output_device_combo.set_active_text (state->output_device); - if (!_desired_sample_rate) { + if (0 == _desired_sample_rate && sample_rate_combo.get_sensitive ()) { sample_rate_combo.set_active_text (rate_as_string (state->sample_rate)); } set_active_text_if_present (buffer_size_combo, bufsize_as_string (state->buffer_size)); @@ -2683,13 +2706,13 @@ EngineControl::start_stop_button_clicked () if (ARDOUR::AudioEngine::instance()->running()) { ARDOUR::AudioEngine::instance()->stop (); } else { - if (!ARDOUR_UI::instance()->session_loaded) { + if (!ARDOUR_UI::instance()->the_session ()) { pop_splash (); hide (); ARDOUR::GUIIdle (); } start_engine (); - if (!ARDOUR_UI::instance()->session_loaded) { + if (!ARDOUR_UI::instance()->the_session ()) { ArdourDialog::on_response (RESPONSE_OK); } } @@ -2838,7 +2861,7 @@ EngineControl::check_audio_latency_measurement () } char buf[256]; - ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); + ARDOUR::samplecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); if (sample_rate == 0) { lm_results.set_markup (string_compose (results_markup, _("Disconnected from audio engine"))); @@ -2846,12 +2869,12 @@ EngineControl::check_audio_latency_measurement () return false; } - int frames_total = mtdm->del(); - int extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); + int samples_total = mtdm->del(); + int extra = samples_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); snprintf (buf, sizeof (buf), "%s%d samples (%.3lf ms)\n%s%d samples (%.3lf ms)", _("Detected roundtrip latency: "), - frames_total, frames_total * 1000.0f/sample_rate, + samples_total, samples_total * 1000.0f/sample_rate, _("Systemic latency: "), extra, extra * 1000.0f/sample_rate); @@ -2892,7 +2915,7 @@ EngineControl::check_midi_latency_measurement () } char buf[256]; - ARDOUR::framecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); + ARDOUR::samplecnt_t const sample_rate = ARDOUR::AudioEngine::instance()->sample_rate(); if (sample_rate == 0) { lm_results.set_markup (string_compose (results_markup, _("Disconnected from audio engine"))); @@ -2900,11 +2923,11 @@ EngineControl::check_midi_latency_measurement () return false; } - ARDOUR::framecnt_t frames_total = mididm->latency(); - ARDOUR::framecnt_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); + ARDOUR::samplecnt_t samples_total = mididm->latency(); + ARDOUR::samplecnt_t extra = samples_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); snprintf (buf, sizeof (buf), "%s%" PRId64" samples (%.1lf ms) dev: %.2f[spl]\n%s%" PRId64" samples (%.1lf ms)", _("Detected roundtrip latency: "), - frames_total, frames_total * 1000.0f / sample_rate, mididm->deviation (), + samples_total, samples_total * 1000.0f / sample_rate, mididm->deviation (), _("Systemic latency: "), extra, extra * 1000.0f / sample_rate); @@ -3005,9 +3028,9 @@ EngineControl::use_latency_button_clicked () if (!mididm) { return; } - ARDOUR::framecnt_t frames_total = mididm->latency(); - ARDOUR::framecnt_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); - uint32_t one_way = max ((ARDOUR::framecnt_t) 0, extra / 2); + ARDOUR::samplecnt_t samples_total = mididm->latency(); + ARDOUR::samplecnt_t extra = samples_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); + uint32_t one_way = max ((ARDOUR::samplecnt_t) 0, extra / 2); _measure_midi->input_latency = one_way; _measure_midi->output_latency = one_way; if (backend->can_change_systemic_latency_when_running ()) { @@ -3097,8 +3120,19 @@ EngineControl::device_list_changed () return; } PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); // ?? - list_devices (); + if (!ARDOUR::AudioEngine::instance()->running()) { + list_devices (); + } + midi_option_changed(); + + if (notebook.get_current_page() == midi_tab) { + if (_midi_devices.empty ()) { + notebook.set_current_page (0); + } else { + refresh_midi_display (); + } + } } void @@ -3107,13 +3141,13 @@ EngineControl::connect_disconnect_click() if (ARDOUR::AudioEngine::instance()->running()) { stop_engine (); } else { - if (!ARDOUR_UI::instance()->session_loaded) { + if (!ARDOUR_UI::instance()->the_session ()) { pop_splash (); hide (); ARDOUR::GUIIdle (); } start_engine (); - if (!ARDOUR_UI::instance()->session_loaded) { + if (!ARDOUR_UI::instance()->the_session ()) { ArdourDialog::on_response (RESPONSE_OK); } }