X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fengine_dialog.cc;h=69dc179798b71c515494640b1353cdf4d8609365;hb=948c5d07065e862704da2d5f02207ed87ca821aa;hp=dab339641e6be8f73f41f15a55d47197bf885708;hpb=2039fc6fd024672b331809f26ca695f4639c8580;p=ardour.git diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index dab339641e..69dc179798 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 (); @@ -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); @@ -1042,6 +1032,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 +1040,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 +1364,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()->session_loaded) { + 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 +1383,6 @@ EngineControl::set_samplerate_popdown_strings () } else { sample_rate_combo.set_active_text (desired); } - } update_sensitivity (); } @@ -1436,7 +1438,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 +1629,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 +1870,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 +1880,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 +2063,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 +2086,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 +2205,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)); @@ -2824,7 +2839,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 +2847,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 +2893,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 +2901,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); @@ -2985,16 +3000,21 @@ EngineControl::latency_back_button_clicked () void EngineControl::use_latency_button_clicked () { + boost::shared_ptr backend = ARDOUR::AudioEngine::instance()->current_backend(); if (_measure_midi) { ARDOUR::MIDIDM* mididm = ARDOUR::AudioEngine::instance()->mididm (); 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 ()) { + backend->set_systemic_midi_input_latency (_measure_midi->name, one_way); + backend->set_systemic_midi_output_latency (_measure_midi->name, one_way); + } notebook.set_current_page (midi_tab); } else { MTDM* mtdm = ARDOUR::AudioEngine::instance()->mtdm (); @@ -3008,6 +3028,10 @@ EngineControl::use_latency_button_clicked () input_latency_adjustment.set_value (one_way); output_latency_adjustment.set_value (one_way); + if (backend->can_change_systemic_latency_when_running ()) { + backend->set_systemic_input_latency (one_way); + backend->set_systemic_output_latency (one_way); + } /* back to settings page */ notebook.set_current_page (0);