X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fengine_dialog.cc;h=bc378afebe91e96365dfdf6146680fca0b1b4270;hb=007c4ffdc0bb8a6de967e499885284b2d3b3d0c2;hp=d81473bb25f79537e202bb0b9c631b35de9f394e;hpb=6ece6ed40756135dd2da87f298a1a2a66b293f0e;p=ardour.git diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index d81473bb25..bc378afebe 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -27,6 +27,7 @@ #include #include "pbd/error.h" +#include "pbd/locale_guard.h" #include "pbd/xml++.h" #include "pbd/unwind.h" #include "pbd/failed_constructor.h" @@ -63,6 +64,7 @@ using namespace Gtk; using namespace Gtkmm2ext; using namespace PBD; using namespace Glib; +using namespace ArdourWidgets; using namespace ARDOUR_UI_UTILS; #define DEBUG_ECONTROL(msg) DEBUG_TRACE (PBD::DEBUG::EngineControl, string_compose ("%1: %2\n", __LINE__, msg)); @@ -400,8 +402,8 @@ EngineControl::unblock_changed_signals () EngineControl::SignalBlocker::SignalBlocker (EngineControl& engine_control, const std::string& reason) - : ec (engine_control) - , m_reason (reason) + : ec (engine_control) + , m_reason (reason) { DEBUG_ECONTROL (string_compose ("SignalBlocker: %1", m_reason)); ec.block_changed_signals (); @@ -428,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); @@ -801,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); @@ -826,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) { @@ -912,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 @@ -919,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 @@ -1042,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())); } @@ -1049,9 +1062,14 @@ EngineControl::backend_changed () // set driver & devices State state = get_matching_state (backend_combo.get_active_text()); if (state) { + DEBUG_ECONTROL ("backend-changed(): found prior state for backend"); PBD::Unwinder protect_ignore_changes (ignore_changes, ignore_changes + 1); set_current_state (state); + } else { + DEBUG_ECONTROL ("backend-changed(): no prior state for backend"); } + } else { + DEBUG_ECONTROL (string_compose ("backend-changed(): _have_control=%1 ignore_changes=%2", _have_control, ignore_changes)); } if (!ignore_changes) { @@ -1368,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 ()) { @@ -1380,7 +1405,6 @@ EngineControl::set_samplerate_popdown_strings () } else { sample_rate_combo.set_active_text (desired); } - } update_sensitivity (); } @@ -1436,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 (); } @@ -1627,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 (); } @@ -1862,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; } @@ -1872,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)); @@ -2055,28 +2085,13 @@ EngineControl::set_state (const XMLNode& root) state->lru = lru_val; } -#if 1 - /* remove accumulated duplicates (due to bug in ealier version) - * this can be removed again before release - */ - for (StateList::iterator i = states.begin(); i != states.end();) { - if ((*i)->backend == state->backend && - (*i)->driver == state->driver && - (*i)->device == state->device) { - i = states.erase(i); - } else { - ++i; - } - } -#endif - states.push_back (state); } } /* now see if there was an active state and switch the setup to it */ - // purge states of backend that are not available in this built + /* purge states of backend that are not available in this built */ vector backends = ARDOUR::AudioEngine::instance()->available_backends(); vector backend_names; @@ -2093,6 +2108,28 @@ EngineControl::set_state (const XMLNode& root) states.sort (state_sort_cmp); + /* purge old states referring to the same backend */ + const time_t now = time (NULL); + for (vector::const_iterator bi = backend_names.begin(); bi != backend_names.end(); ++bi) { + bool first = true; + for (StateList::iterator i = states.begin(); i != states.end();) { + if ((*i)->backend != *bi) { + ++i; continue; + } + // keep at latest one for every audio-system + if (first) { + first = false; + ++i; continue; + } + // also keep states used in the last 90 days. + if ((now - (*i)->lru) < 86400 * 90) { + ++i; continue; + } + assert (!(*i)->active); + i = states.erase(i); + } + } + for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { if ((*i)->active) { @@ -2190,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)); @@ -2669,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); } } @@ -2824,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"))); @@ -2832,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); @@ -2878,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"))); @@ -2886,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); @@ -2991,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 ()) { @@ -3083,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 @@ -3093,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); } }