mp4chaps Lua script: don't clutter global environment
[ardour.git] / gtk2_ardour / engine_dialog.cc
index dab339641e6be8f73f41f15a55d47197bf885708..3939fec8cb3541ace7f54052a5e8e6818f44ab18 100644 (file)
@@ -27,6 +27,7 @@
 #include <gtkmm/messagedialog.h>
 
 #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<uint32_t> 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) {
@@ -1436,7 +1432,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 +1623,12 @@ void
 EngineControl::buffer_size_changed ()
 {
        DEBUG_ECONTROL ("buffer_size_changed");
+       if (ARDOUR::AudioEngine::instance()->running()) {
+               boost::shared_ptr<ARDOUR::AudioBackend> 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 +1864,7 @@ EngineControl::store_state (State state)
 void
 EngineControl::maybe_display_saved_state ()
 {
-       if (!_have_control) {
+       if (!_have_control || ARDOUR::AudioEngine::instance()->running ()) {
                return;
        }
 
@@ -2055,28 +2057,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<const ARDOUR::AudioBackendInfo*> backends = ARDOUR::AudioEngine::instance()->available_backends();
        vector<std::string> backend_names;
 
@@ -2093,6 +2080,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<std::string>::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) {
@@ -2985,6 +2994,7 @@ EngineControl::latency_back_button_clicked ()
 void
 EngineControl::use_latency_button_clicked ()
 {
+       boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
        if (_measure_midi) {
                ARDOUR::MIDIDM* mididm = ARDOUR::AudioEngine::instance()->mididm ();
                if (!mididm) {
@@ -2995,6 +3005,10 @@ EngineControl::use_latency_button_clicked ()
                uint32_t one_way = max ((ARDOUR::framecnt_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 +3022,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);