minor code changes
[ardour.git] / gtk2_ardour / engine_dialog.cc
index c22bc5e12e844ce963d3d3b6cd2ac100fda133e5..65fa7227a78eb3fe717ed98946ced7704cbdf441 100644 (file)
@@ -45,6 +45,7 @@
 #include "pbd/convert.h"
 #include "pbd/error.h"
 
+#include "ardour_ui.h"
 #include "engine_dialog.h"
 #include "gui_thread.h"
 #include "i18n.h"
@@ -57,6 +58,7 @@ using namespace Glib;
 
 EngineControl::EngineControl ()
        : ArdourDialog (_("Audio/MIDI Setup"))
+       , basic_packer (9, 3)
        , input_latency_adjustment (0, 0, 99999, 1)
        , input_latency (input_latency_adjustment)
        , output_latency_adjustment (0, 0, 99999, 1)
@@ -72,10 +74,19 @@ EngineControl::EngineControl ()
        , lm_use_button (_("Use results"))
        , lm_table (5, 2)
        , have_lm_results (false)
-       , basic_packer (9, 3)
+       , midi_refresh_button (_("Refresh list"))
+       , aj_button (_("Start MIDI ALSA/JACK bridge"))
        , ignore_changes (0)
        , _desired_sample_rate (0)
 {
+       if (!ARDOUR::AudioEngine::instance()->setup_required()) {
+               _have_control = false;
+       } else {
+               _have_control = true;
+       }
+
+       set_name (X_("AudioMIDISetup"));
+
        build_notebook ();
 
        get_vbox()->set_border_width (12);
@@ -177,14 +188,21 @@ EngineControl::build_notebook ()
        basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
        row++;
 
-
-       input_channels.set_editable (true);
+       input_channels.set_name ("InputChannels");
+       input_channels.set_flags(Gtk::CAN_FOCUS);
+       input_channels.set_digits(0);
+       input_channels.set_wrap(false);
+       output_channels.set_editable (true);
 
        label = manage (left_aligned_label (_("Input Channels:")));
        basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
        basic_packer.attach (input_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0);
        ++row;
 
+       output_channels.set_name ("OutputChannels");
+       output_channels.set_flags(Gtk::CAN_FOCUS);
+       output_channels.set_digits(0);
+       output_channels.set_wrap(false);
        output_channels.set_editable (true);
 
        label = manage (left_aligned_label (_("Output Channels:")));
@@ -192,7 +210,10 @@ EngineControl::build_notebook ()
        basic_packer.attach (output_channels, 1, 2, row, row+1, xopt, (AttachOptions) 0);
        ++row;
 
-       input_latency.set_numeric (true);
+       input_latency.set_name ("InputLatency");
+       input_latency.set_flags(Gtk::CAN_FOCUS);
+       input_latency.set_digits(0);
+       input_latency.set_wrap(false);
        input_latency.set_editable (true);
 
        label = manage (left_aligned_label (_("Hardware input latency:")));
@@ -202,6 +223,12 @@ EngineControl::build_notebook ()
        basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
        ++row;
 
+       output_latency.set_name ("OutputLatency");
+       output_latency.set_flags(Gtk::CAN_FOCUS);
+       output_latency.set_digits(0);
+       output_latency.set_wrap(false);
+       output_latency.set_editable (true);
+
        label = manage (left_aligned_label (_("Hardware output latency:")));
        basic_packer.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
        basic_packer.attach (output_latency, 1, 2, row, row+1, xopt, (AttachOptions) 0);
@@ -219,8 +246,6 @@ EngineControl::build_notebook ()
        control_app_button.show();
        basic_vbox.pack_start (*hpacker);
 
-       midi_packer.set_border_width (12);
-
        /* latency measurement tab */
        
        lm_title.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Latency Measurement Tool")));
@@ -305,7 +330,7 @@ EngineControl::build_notebook ()
        /* pack it all up */
 
        notebook.pages().push_back (TabElem (basic_vbox, _("Audio")));
-       notebook.pages().push_back (TabElem (midi_hbox, _("MIDI")));
+       notebook.pages().push_back (TabElem (midi_vbox, _("MIDI")));
        notebook.pages().push_back (TabElem (lm_vbox, _("Latency")));
        notebook.set_border_width (12);
 
@@ -327,7 +352,6 @@ EngineControl::build_notebook ()
        input_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
        output_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
 
-
        input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels));
        output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels));
 
@@ -365,6 +389,87 @@ EngineControl::enable_latency_tab ()
        lm_measure_button.set_sensitive (true);
 }
 
+void
+EngineControl::setup_midi_tab_for_backend ()
+{
+       string backend = backend_combo.get_active_text ();
+
+       Gtkmm2ext::container_clear (midi_vbox);
+
+       midi_vbox.set_border_width (12);
+       midi_device_table.set_border_width (12);
+
+       if (backend == "JACK") {
+               setup_midi_tab_for_jack ();
+       }
+
+       midi_vbox.pack_start (midi_device_table, true, true);
+       midi_vbox.pack_start (midi_refresh_button, false, false);
+       midi_vbox.show_all ();
+
+       midi_refresh_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::refresh_midi_display));
+}
+
+void
+EngineControl::setup_midi_tab_for_jack ()
+{
+       midi_vbox.pack_start (aj_button, false, false);
+}      
+
+void
+EngineControl::refresh_midi_display ()
+{
+       boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+       assert (backend);
+
+       vector<string> midi_inputs;
+       vector<string> midi_outputs;
+       int row  = 0;
+       AttachOptions xopt = AttachOptions (FILL|EXPAND);
+       Gtk::Label* l;
+
+       Gtkmm2ext::container_clear (midi_device_table);
+
+       backend->get_physical_inputs (ARDOUR::DataType::MIDI, midi_inputs);
+       backend->get_physical_outputs (ARDOUR::DataType::MIDI, midi_outputs);
+
+       midi_device_table.set_spacings (6);
+       midi_device_table.set_homogeneous (true);
+       midi_device_table.resize (midi_inputs.size() + midi_outputs.size() + 3, 1);
+
+       l = manage (new Label);
+       l->set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("MIDI Inputs")));
+       midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0));
+       l->set_alignment (0, 0.5);
+       row++;
+       l->show ();
+       
+       for (vector<string>::iterator p = midi_inputs.begin(); p != midi_inputs.end(); ++p) {
+               l = manage (new Label ((*p).substr ((*p).find_last_of (':') + 1)));
+               l->set_alignment (0, 0.5);
+               midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0));
+               l->show ();
+               row++;
+       }
+
+       row++; // extra row of spacing
+
+       l = manage (new Label);
+       l->set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("MIDI Outputs")));
+       midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0));
+       l->set_alignment (0, 0.5);
+       row++;
+       l->show ();
+
+       for (vector<string>::iterator p = midi_outputs.begin(); p != midi_outputs.end(); ++p) {
+               l = manage (new Label ((*p).substr ((*p).find_last_of (':') + 1)));
+               l->set_alignment (0, 0.5);
+               midi_device_table.attach (*l, 0, 1, row, row + 1, xopt, AttachOptions (0));
+               l->show ();
+               row++;
+       }
+}
+
 void
 EngineControl::backend_changed ()
 {
@@ -380,6 +485,8 @@ EngineControl::backend_changed ()
                return;
        }
 
+       setup_midi_tab_for_backend ();
+
        if (backend->requires_driver_selection()) {
                vector<string> drivers = backend->enumerate_drivers();
                driver_combo.set_sensitive (true);
@@ -500,15 +607,9 @@ EngineControl::device_changed ()
 
        vector<float> sr = backend->available_sample_rates (device_name);
        for (vector<float>::const_iterator x = sr.begin(); x != sr.end(); ++x) {
-               char buf[32];
-               if (fmod (*x, 1000.0f)) {
-                       snprintf (buf, sizeof (buf), "%.1f kHz", (*x)/1000.0);
-               } else {
-                       snprintf (buf, sizeof (buf), "%.0f kHz", (*x)/1000.0);
-               }
-               s.push_back (buf);
+               s.push_back (rate_as_string (*x));
                if (*x == _desired_sample_rate) {
-                       desired = buf;
+                       desired = s.back();
                }
        }
 
@@ -530,12 +631,7 @@ EngineControl::device_changed ()
        vector<uint32_t> bs = backend->available_buffer_sizes(device_name);
        s.clear ();
        for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
-               char buf[32];
-               /* Translators: "samples" is always plural here, so no
-                  need for plural+singular forms.
-               */
-               snprintf (buf, sizeof (buf), _("%u samples"), *x);
-               s.push_back (buf);
+               s.push_back (bufsize_as_string (*x));
        }
 
        if (!s.empty()) {
@@ -561,6 +657,29 @@ EngineControl::device_changed ()
        push_state_to_backend (false);
 }      
 
+string
+EngineControl::rate_as_string (float r)
+{
+       char buf[32];
+       if (fmod (r, 1000.0f)) {
+               snprintf (buf, sizeof (buf), "%.1f kHz", r/1000.0);
+       } else {
+               snprintf (buf, sizeof (buf), "%.0f kHz", r/1000.0);
+       }
+       return buf;
+}
+
+string
+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);
+       return buf;
+}
+
 void 
 EngineControl::sample_rate_changed ()
 {
@@ -573,7 +692,6 @@ EngineControl::sample_rate_changed ()
        */
 
        show_buffer_duration ();
-       push_state_to_backend (false);
        save_state ();
 
 }
@@ -586,7 +704,6 @@ EngineControl::buffer_size_changed ()
        }
 
        show_buffer_duration ();
-       push_state_to_backend (false);
        save_state ();
 }
 
@@ -665,15 +782,7 @@ EngineControl::save_state ()
                state = new State;
        }
        
-       state->backend = backend_combo.get_active_text ();
-       state->driver = driver_combo.get_active_text ();
-       state->device = device_combo.get_active_text ();
-       state->buffer_size = buffer_size_combo.get_active_text ();
-       state->sample_rate = sample_rate_combo.get_active_text ();
-       state->input_latency = (uint32_t) input_latency.get_value();
-       state->output_latency = (uint32_t) output_latency.get_value();
-       state->input_channels = (uint32_t) input_channels.get_value();
-       state->output_channels = (uint32_t) output_channels.get_value();
+       store_state (*state);
 
        if (!existing) {
                states.push_back (*state);
@@ -682,6 +791,20 @@ EngineControl::save_state ()
        return state;
 }
 
+void
+EngineControl::store_state (State& state)
+{
+       state.backend = get_backend ();
+       state.driver = get_driver ();
+       state.device = get_device_name ();
+       state.sample_rate = get_rate ();
+       state.buffer_size = get_buffer_size ();
+       state.input_latency = get_input_latency ();
+       state.output_latency = get_output_latency ();
+       state.input_channels = get_input_channels ();
+       state.output_channels = get_output_channels ();
+}
+
 void
 EngineControl::maybe_display_saved_state ()
 {
@@ -690,9 +813,9 @@ EngineControl::maybe_display_saved_state ()
        if (state) {
                ignore_changes++;
                if (!_desired_sample_rate) {
-                       sample_rate_combo.set_active_text (state->sample_rate);
+                       sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
                }
-               buffer_size_combo.set_active_text (state->buffer_size);
+               buffer_size_combo.set_active_text (bufsize_as_string (state->buffer_size));
                /* call this explicitly because we're ignoring changes to
                   the controls at this point.
                */
@@ -790,12 +913,12 @@ EngineControl::set_state (const XMLNode& root)
                        if ((prop = grandchild->property ("sample-rate")) == 0) {
                                continue;
                        }
-                       state.sample_rate = prop->value ();
+                       state.sample_rate = atof (prop->value ());
                        
                        if ((prop = grandchild->property ("buffer-size")) == 0) {
                                continue;
                        }
-                       state.buffer_size = prop->value ();
+                       state.buffer_size = atoi (prop->value ());
                        
                        if ((prop = grandchild->property ("input-latency")) == 0) {
                                continue;
@@ -834,13 +957,11 @@ EngineControl::set_state (const XMLNode& root)
                        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 ((*i).sample_rate);
-                       buffer_size_combo.set_active_text ((*i).buffer_size);
+                       sample_rate_combo.set_active_text (rate_as_string ((*i).sample_rate));
+                       buffer_size_combo.set_active_text (bufsize_as_string ((*i).buffer_size));
                        input_latency.set_value ((*i).input_latency);
                        output_latency.set_value ((*i).output_latency);
                        ignore_changes--;
-
-                       push_state_to_backend (false);
                        break;
                }
        }
@@ -854,96 +975,246 @@ EngineControl::push_state_to_backend (bool start)
 
        if (!backend) {
                return 0;
-        }
+       }
+       
+       /* figure out what is going to change */
 
-       /* grab the parameters from the GUI and apply them */
+       bool restart_required = false;
+       bool was_running = ARDOUR::AudioEngine::instance()->running();
+       bool change_driver = false;
+       bool change_device = false;
+       bool change_rate = false;
+       bool change_bufsize = false;
+       bool change_latency = false;
+       bool change_channels = false;
+
+       uint32_t ochan = get_output_channels ();
+       uint32_t ichan = get_input_channels ();
+
+       if (_have_control) {
+               
+               /* we can control the backend */
 
-       try {
                if (backend->requires_driver_selection()) {
-                       if (backend->set_driver (get_driver())) {
-                               return -1;
+                       if (get_driver() != backend->driver_name()) {
+                               change_driver = true;
                        }
                }
 
-               if (backend->set_device_name (get_device_name())) {
-                       return -1;
+               if (get_device_name() != backend->device_name()) {
+                       change_device = true;
                }
 
-               if (backend->set_sample_rate (get_rate())) {
-                       error << string_compose (_("Cannot set sample rate to %1"), get_rate()) << endmsg;
-                       return -1;
+               if (get_rate() != backend->sample_rate()) {
+                       change_rate = true;
                }
-               if (backend->set_buffer_size (get_buffer_size())) {
-                       error << string_compose (_("Cannot set buffer size to %1"), get_buffer_size()) << endmsg;
-                       return -1;
+
+               if (get_buffer_size() != backend->buffer_size()) {
+                       change_bufsize = true;
                }
-               if (backend->set_input_channels (get_input_channels())) {
-                       error << string_compose (_("Cannot set input channels to %1"), get_input_channels()) << endmsg;
-                       return -1;
+
+               /* zero-requested channels means "all available" */
+
+               if (ichan == 0) {
+                       ichan = backend->input_channels();
                }
-               if (backend->set_output_channels (get_output_channels())) {
-                       error << string_compose (_("Cannot set output channels to %1"), get_output_channels()) << endmsg;
-                       return -1;
+
+               if (ochan == 0) {
+                       ochan = backend->output_channels();
                }
-               if (backend->set_systemic_input_latency (get_input_latency())) {
-                       error << string_compose (_("Cannot set input latency to %1"), get_input_latency()) << endmsg;
-                       return -1;
+
+               if (ichan != backend->input_channels()) {
+                       change_channels = true;
                }
-               if (backend->set_systemic_output_latency (get_output_latency())) {
-                       error << string_compose (_("Cannot set output latency to %1"), get_output_latency()) << endmsg;
-                       return -1;
+
+               if (ochan != backend->output_channels()) {
+                       change_channels = true;
                }
 
-               /* get a pointer to the current state object, creating one if
-                * necessary
+               if (get_input_latency() != backend->systemic_input_latency() ||
+                   get_output_latency() != backend->systemic_output_latency()) {
+                       change_latency = true;
+               }
+
+       } else {
+
+               /* we have no control over the backend, meaning that we can
+                * only possibly change sample rate and buffer size.
                 */
 
-               State* state = get_saved_state_for_currently_displayed_backend_and_device ();
 
-               if (!state) {
-                       state = save_state ();
-                       assert (state);
+               if (get_rate() != backend->sample_rate()) {
+                       change_bufsize = true;
                }
 
-               /* all off */
-
-               for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
-                       (*i).active = false;
+               if (get_buffer_size() != backend->buffer_size()) {
+                       change_bufsize = true;
                }
+       }
+
+       if (!_have_control) {
 
-               /* mark this one active (to be used next time the dialog is
-                * shown)
+               /* We do not have control over the backend, so the best we can
+                * do is try to change the sample rate and/or bufsize and get
+                * out of here.
                 */
 
-               state->active = true;
+               if (change_rate && !backend->can_change_sample_rate_when_running()) {
+                       return 1;
+               }
+
+               if (change_bufsize && !backend->can_change_buffer_size_when_running()) {
+                       return 1;
+               }
                
-               if (start) {
-                       if (ARDOUR::AudioEngine::instance()->start()) {
-                               return -1;
-                       }
+               if (change_rate) {
+                       backend->set_sample_rate (get_rate());
+               }
+               
+               if (change_bufsize) {
+                       backend->set_buffer_size (get_buffer_size());
                }
 
-               manage_control_app_sensitivity ();
+               post_push ();
+
                return 0;
+       } 
+
+       /* determine if we need to stop the backend before changing parameters */
+
+       if (change_driver || change_device || change_channels || change_latency ||
+           (change_rate && !backend->can_change_sample_rate_when_running()) ||
+           (change_bufsize && !backend->can_change_buffer_size_when_running())) {
+               restart_required = true;
+       } else {
+               restart_required = false;
+       }
+
+       if (was_running) {
+
+               if (!change_driver && !change_device && !change_channels && !change_latency) {
+                       /* no changes in any parameters that absolutely require a
+                        * restart, so check those that might be changeable without a
+                        * restart
+                        */
+                       
+                       if (change_rate && !backend->can_change_sample_rate_when_running()) {
+                               /* can't do this while running ... */
+                               restart_required = true;
+                       }
 
-       } catch (...) {
-               cerr << "exception thrown...\n";
+                       if (change_bufsize && !backend->can_change_buffer_size_when_running()) {
+                               /* can't do this while running ... */
+                               restart_required = true;
+                       }
+               }
+       }
+
+       if (was_running) {
+               if (restart_required) {
+                       if (ARDOUR_UI::instance()->disconnect_from_engine ()) {
+                               return -1;
+                       }
+               }
+       }
+               
+
+       if (change_driver && backend->set_driver (get_driver())) {
+               error << string_compose (_("Cannot set driver to %1"), get_driver()) << endmsg;
+               return -1;
+       }
+       if (change_device && backend->set_device_name (get_device_name())) {
+               error << string_compose (_("Cannot set device name to %1"), get_device_name()) << endmsg;
+               return -1;
+       }
+       if (change_rate && backend->set_sample_rate (get_rate())) {
+               error << string_compose (_("Cannot set sample rate to %1"), get_rate()) << endmsg;
+               return -1;
+       }
+       if (change_bufsize && backend->set_buffer_size (get_buffer_size())) {
+               error << string_compose (_("Cannot set buffer size to %1"), get_buffer_size()) << endmsg;
                return -1;
        }
+
+       if (change_channels || get_input_channels() == 0 || get_output_channels() == 0) {
+               if (backend->set_input_channels (get_input_channels())) {
+                       error << string_compose (_("Cannot set input channels to %1"), get_input_channels()) << endmsg;
+                       return -1;
+               }
+               if (backend->set_output_channels (get_output_channels())) {
+                       error << string_compose (_("Cannot set output channels to %1"), get_output_channels()) << endmsg;
+                       return -1;
+               }
+       }
+       if (change_latency) {
+               if (backend->set_systemic_input_latency (get_input_latency())) {
+                       error << string_compose (_("Cannot set input latency to %1"), get_input_latency()) << endmsg;
+                       return -1;
+               }
+               if (backend->set_systemic_output_latency (get_output_latency())) {
+                       error << string_compose (_("Cannot set output latency to %1"), get_output_latency()) << endmsg;
+                       return -1;
+               }
+       }
+                       
+       if (start || (was_running && restart_required)) {
+               if (ARDOUR_UI::instance()->reconnect_to_engine()) {
+                       return -1;
+               }
+       }
+       
+       post_push ();
+
+       return 0;
 }
 
-uint32_t
+void
+EngineControl::post_push ()
+{
+       /* get a pointer to the current state object, creating one if
+        * necessary
+        */
+       
+       State* state = get_saved_state_for_currently_displayed_backend_and_device ();
+       
+       if (!state) {
+               state = save_state ();
+               assert (state);
+       }
+       
+       /* all off */
+       
+       for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
+               (*i).active = false;
+       }
+       
+       /* mark this one active (to be used next time the dialog is
+        * shown)
+        */
+       
+       state->active = true;
+
+       manage_control_app_sensitivity ();
+
+       /* schedule a redisplay of MIDI ports */
+       
+       Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (*this, &EngineControl::refresh_midi_display), false), 1000);
+}
+
+
+float
 EngineControl::get_rate () const
 {
-       double r = atof (sample_rate_combo.get_active_text ());
+       float r = atof (sample_rate_combo.get_active_text ());
        /* the string may have been translated with an abbreviation for
         * thousands, so use a crude heuristic to fix this.
         */
        if (r < 1000.0) {
                r *= 1000.0;
        }
-       return lrint (r);
+       return r;
 }
+       
 
 uint32_t
 EngineControl::get_buffer_size () const
@@ -982,6 +1253,12 @@ EngineControl::get_output_latency() const
        return (uint32_t) output_latency_adjustment.get_value();
 }
 
+string
+EngineControl::get_backend () const
+{
+       return backend_combo.get_active_text ();
+}
+
 string
 EngineControl::get_driver () const
 {
@@ -1034,6 +1311,21 @@ EngineControl::set_desired_sample_rate (uint32_t sr)
 void
 EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
 {
+       if (page_num == 0) {
+               cancel_button->set_sensitive (true);
+               ok_button->set_sensitive (true);
+               apply_button->set_sensitive (true);
+       } else {
+               cancel_button->set_sensitive (false);
+               ok_button->set_sensitive (false);
+               apply_button->set_sensitive (false);
+       }
+
+       if (page_num == 1) {
+               /* MIDI tab */
+               refresh_midi_display ();
+       }
+
        if (page_num == 2) {
                /* latency tab */
 
@@ -1053,13 +1345,12 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
                        input_latency.set_value (0);
                        output_latency.set_value (0);
                        
-                       push_state_to_backend (false);
-
                        /* reset control */
 
                        input_latency.set_value (il);
                        output_latency.set_value (ol);
-               }
+
+               } 
 
                if (ARDOUR::AudioEngine::instance()->prepare_for_latency_measurement()) {
                        disable_latency_tab ();
@@ -1067,16 +1358,8 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
 
                enable_latency_tab ();
 
-               cancel_button->set_sensitive (false);
-               ok_button->set_sensitive (false);
-               apply_button->set_sensitive (false);
-
        } else {
                ARDOUR::AudioEngine::instance()->stop_latency_detection();
-               
-               cancel_button->set_sensitive (true);
-               ok_button->set_sensitive (true);
-               apply_button->set_sensitive (true);
        }
 }
 
@@ -1107,7 +1390,6 @@ EngineControl::check_latency_measurement ()
         }
 
        uint32_t frames_total = mtdm->del();
-       cerr << "total = " << frames_total << " delay = " << ARDOUR::AudioEngine::instance()->latency_signal_delay() << endl;
        uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay();
 
         snprintf (buf, sizeof (buf), "%u samples %10.3lf ms", extra, extra * 1000.0f/sample_rate);
@@ -1199,3 +1481,4 @@ EngineControl::on_delete_event (GdkEventAny* ev)
        }
        return ArdourDialog::on_delete_event (ev);
 }
+