hide "turn down volume" label for midi-latency measurement
[ardour.git] / gtk2_ardour / engine_dialog.cc
index 51f2add40f4899691fb4c57e9e5ae22489f51d85..a89ddddb1a9ec7e5ff295ef4c0055bd96922f446 100644 (file)
@@ -62,7 +62,7 @@ using namespace Glib;
 static const unsigned int midi_tab = 2;
 static const unsigned int latency_tab = 1; /* zero-based, page zero is the main setup page */
 
-static const char* results_markup = X_("<span foreground=\"red\" style=\"italic\" size=\"larger\">%1</span>");
+static const char* results_markup = X_("<span weight=\"bold\" size=\"larger\">%1</span>");
 
 EngineControl::EngineControl ()
        : ArdourDialog (_("Audio/MIDI Setup"))
@@ -141,16 +141,14 @@ EngineControl::EngineControl ()
        lm_table.attach (lm_title, 0, 3, row, row+1, xopt, (AttachOptions) 0);
        row++;
 
-       Gtk::Label* preamble;
-
-       preamble = manage (new Label);
-       preamble->set_width_chars (60);
-       preamble->set_line_wrap (true);
-       preamble->set_markup (_("<span weight=\"bold\">Turn down the volume on your audio equipment to a very low level.</span>"));
+       lm_preamble.set_width_chars (60);
+       lm_preamble.set_line_wrap (true);
+       lm_preamble.set_markup (_("<span weight=\"bold\">Turn down the volume on your audio equipment to a very low level.</span>"));
 
-       lm_table.attach (*preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+       lm_table.attach (lm_preamble, 0, 3, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
        row++;
 
+       Gtk::Label* preamble;
        preamble = manage (new Label);
        preamble->set_width_chars (60);
        preamble->set_line_wrap (true);
@@ -533,6 +531,12 @@ EngineControl::enable_latency_tab ()
        ARDOUR::AudioEngine::instance()->get_physical_outputs (type, outputs);
        ARDOUR::AudioEngine::instance()->get_physical_inputs (type, inputs);
 
+       if (_measure_midi) {
+               lm_preamble.set_markup (_(""));
+       } else {
+               lm_preamble.set_markup (_("<span weight=\"bold\">Turn down the volume on your audio equipment to a very low level.</span>"));
+       }
+
        if (inputs.empty() || outputs.empty()) {
                MessageDialog msg (_("Your selected audio configuration is playback- or capture-only.\n\nLatency calibration requires playback and capture"));
                lm_measure_button.set_sensitive (false);
@@ -1041,23 +1045,23 @@ EngineControl::parameter_changed ()
        }
 }
 
-EngineControl::State*
+EngineControl::State
 EngineControl::get_matching_state (
                const string& backend,
                const string& driver,
                const string& device)
 {
        for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
-               if ((*i).backend == backend &&
-                               (*i).driver == driver &&
-                               (*i).device == device) {
-                       return &(*i);
+               if ((*i)->backend == backend &&
+                               (*i)->driver == driver &&
+                               (*i)->device == device) {
+                       return (*i);
                }
        }
-       return 0;
+       return State();
 }
 
-EngineControl::State*
+EngineControl::State
 EngineControl::get_saved_state_for_currently_displayed_backend_and_device ()
 {
        boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
@@ -1074,44 +1078,44 @@ EngineControl::get_saved_state_for_currently_displayed_backend_and_device ()
                        device_combo.get_active_text());
 }
 
-EngineControl::State*
+EngineControl::State
 EngineControl::save_state ()
 {
        if (!_have_control) {
-               return 0;
+               return State();
        }
-       State* state = new State;
-       store_state (*state);
+       State state (new StateStruct);
+       store_state (state);
 
        for (StateList::iterator i = states.begin(); i != states.end();) {
-               if ((*i).backend == state->backend &&
-                               (*i).driver == state->driver &&
-                               (*i).device == state->device) {
+               if ((*i)->backend == state->backend &&
+                               (*i)->driver == state->driver &&
+                               (*i)->device == state->device) {
                        i =  states.erase(i);
                } else {
                        ++i;
                }
        }
 
-       states.push_back (*state);
+       states.push_back (state);
 
        return state;
 }
 
 void
-EngineControl::store_state (State& state)
+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 ();
-       state.midi_option = get_midi_option ();
-       state.midi_devices = _midi_devices;
+       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 ();
+       state->midi_option = get_midi_option ();
+       state->midi_devices = _midi_devices;
 }
 
 void
@@ -1121,7 +1125,7 @@ EngineControl::maybe_display_saved_state ()
                return;
        }
 
-       State* state = get_saved_state_for_currently_displayed_backend_and_device ();
+       State state = get_saved_state_for_currently_displayed_backend_and_device ();
 
        if (state) {
                PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
@@ -1157,20 +1161,20 @@ EngineControl::get_state ()
 
                        XMLNode* node = new XMLNode ("State");
 
-                       node->add_property ("backend", (*i).backend);
-                       node->add_property ("driver", (*i).driver);
-                       node->add_property ("device", (*i).device);
-                       node->add_property ("sample-rate", (*i).sample_rate);
-                       node->add_property ("buffer-size", (*i).buffer_size);
-                       node->add_property ("input-latency", (*i).input_latency);
-                       node->add_property ("output-latency", (*i).output_latency);
-                       node->add_property ("input-channels", (*i).input_channels);
-                       node->add_property ("output-channels", (*i).output_channels);
-                       node->add_property ("active", (*i).active ? "yes" : "no");
-                       node->add_property ("midi-option", (*i).midi_option);
+                       node->add_property ("backend", (*i)->backend);
+                       node->add_property ("driver", (*i)->driver);
+                       node->add_property ("device", (*i)->device);
+                       node->add_property ("sample-rate", (*i)->sample_rate);
+                       node->add_property ("buffer-size", (*i)->buffer_size);
+                       node->add_property ("input-latency", (*i)->input_latency);
+                       node->add_property ("output-latency", (*i)->output_latency);
+                       node->add_property ("input-channels", (*i)->input_channels);
+                       node->add_property ("output-channels", (*i)->output_channels);
+                       node->add_property ("active", (*i)->active ? "yes" : "no");
+                       node->add_property ("midi-option", (*i)->midi_option);
 
                        XMLNode* midi_devices = new XMLNode ("MIDIDevices");
-                       for (std::vector<MidiDeviceSettings>::const_iterator p = (*i).midi_devices.begin(); p != (*i).midi_devices.end(); ++p) {
+                       for (std::vector<MidiDeviceSettings>::const_iterator p = (*i)->midi_devices.begin(); p != (*i)->midi_devices.end(); ++p) {
                                XMLNode* midi_device_stuff = new XMLNode ("MIDIDevice");
                                midi_device_stuff->add_property (X_("name"), (*p)->name);
                                midi_device_stuff->add_property (X_("enabled"), (*p)->enabled);
@@ -1217,7 +1221,7 @@ EngineControl::set_state (const XMLNode& root)
                cclist = child->children();
 
                for (cciter = cclist.begin(); cciter != cclist.end(); ++cciter) {
-                       State state;
+                       State state (new StateStruct);
 
                        grandchild = *cciter;
 
@@ -1228,59 +1232,59 @@ EngineControl::set_state (const XMLNode& root)
                        if ((prop = grandchild->property ("backend")) == 0) {
                                continue;
                        }
-                       state.backend = prop->value ();
+                       state->backend = prop->value ();
 
                        if ((prop = grandchild->property ("driver")) == 0) {
                                continue;
                        }
-                       state.driver = prop->value ();
+                       state->driver = prop->value ();
 
                        if ((prop = grandchild->property ("device")) == 0) {
                                continue;
                        }
-                       state.device = prop->value ();
+                       state->device = prop->value ();
 
                        if ((prop = grandchild->property ("sample-rate")) == 0) {
                                continue;
                        }
-                       state.sample_rate = atof (prop->value ());
+                       state->sample_rate = atof (prop->value ());
 
                        if ((prop = grandchild->property ("buffer-size")) == 0) {
                                continue;
                        }
-                       state.buffer_size = atoi (prop->value ());
+                       state->buffer_size = atoi (prop->value ());
 
                        if ((prop = grandchild->property ("input-latency")) == 0) {
                                continue;
                        }
-                       state.input_latency = atoi (prop->value ());
+                       state->input_latency = atoi (prop->value ());
 
                        if ((prop = grandchild->property ("output-latency")) == 0) {
                                continue;
                        }
-                       state.output_latency = atoi (prop->value ());
+                       state->output_latency = atoi (prop->value ());
 
                        if ((prop = grandchild->property ("input-channels")) == 0) {
                                continue;
                        }
-                       state.input_channels = atoi (prop->value ());
+                       state->input_channels = atoi (prop->value ());
 
                        if ((prop = grandchild->property ("output-channels")) == 0) {
                                continue;
                        }
-                       state.output_channels = atoi (prop->value ());
+                       state->output_channels = atoi (prop->value ());
 
                        if ((prop = grandchild->property ("active")) == 0) {
                                continue;
                        }
-                       state.active = string_is_affirmative (prop->value ());
+                       state->active = string_is_affirmative (prop->value ());
 
                        if ((prop = grandchild->property ("midi-option")) == 0) {
                                continue;
                        }
-                       state.midi_option = prop->value ();
+                       state->midi_option = prop->value ();
 
-                       state.midi_devices.clear();
+                       state->midi_devices.clear();
                        XMLNode* midinode;
                        if ((midinode = find_named_node (*grandchild, "MIDIDevices")) != 0) {
                                const XMLNodeList mnc = midinode->children();
@@ -1299,7 +1303,7 @@ EngineControl::set_state (const XMLNode& root)
                                                                atoi ((*n)->property (X_("input-latency"))->value ()),
                                                                atoi ((*n)->property (X_("output-latency"))->value ())
                                                                ));
-                                       state.midi_devices.push_back (ptr);
+                                       state->midi_devices.push_back (ptr);
                                }
                        }
 
@@ -1308,9 +1312,9 @@ EngineControl::set_state (const XMLNode& root)
                         * 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) {
+                               if ((*i)->backend == state->backend &&
+                                               (*i)->driver == state->driver &&
+                                               (*i)->device == state->device) {
                                        i =  states.erase(i);
                                } else {
                                        ++i;
@@ -1326,16 +1330,16 @@ EngineControl::set_state (const XMLNode& root)
 
        for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) {
 
-               if ((*i).active) {
+               if ((*i)->active) {
                        ignore_changes++;
-                       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 (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);
-                       midi_option_combo.set_active_text ((*i).midi_option);
+                       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 (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);
+                       midi_option_combo.set_active_text ((*i)->midi_option);
                        ignore_changes--;
                        break;
                }
@@ -1601,7 +1605,7 @@ EngineControl::post_push ()
         */
 
        if (_have_control) {
-               State* state = get_saved_state_for_currently_displayed_backend_and_device ();
+               State state = get_saved_state_for_currently_displayed_backend_and_device ();
 
                if (!state) {
                        state = save_state ();
@@ -1611,7 +1615,7 @@ EngineControl::post_push ()
                /* all off */
 
                for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
-                       (*i).active = false;
+                       (*i)->active = false;
                }
 
                /* mark this one active (to be used next time the dialog is
@@ -1806,6 +1810,7 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num)
 
        } else {
                if (lm_running) {
+                       end_latency_detection ();
                        ARDOUR::AudioEngine::instance()->stop_latency_detection();
                }
        }
@@ -1919,6 +1924,12 @@ EngineControl::check_midi_latency_measurement ()
                end_latency_detection ();
                lm_use_button.set_sensitive (true);
                have_lm_results = true;
+               return false;
+       } else if (mididm->processed () > 400) {
+               have_lm_results = false;
+               end_latency_detection ();
+               lm_results.set_markup (string_compose (results_markup, _("Timeout - large MIDI jitter.")));
+               return false;
        }
 
        lm_results.set_markup (string_compose (results_markup, buf));
@@ -2067,7 +2078,10 @@ EngineControl::connect_disconnect_click()
 void
 EngineControl::calibrate_audio_latency ()
 {
-       _measure_midi.reset();
+       _measure_midi.reset ();
+       have_lm_results = false;
+       lm_use_button.set_sensitive (false);
+       lm_results.set_markup (string_compose (results_markup, _("No measurement results yet")));
        notebook.set_current_page (latency_tab);
 }
 
@@ -2075,6 +2089,9 @@ void
 EngineControl::calibrate_midi_latency (MidiDeviceSettings s)
 {
        _measure_midi = s;
+       have_lm_results = false;
+       lm_use_button.set_sensitive (false);
+       lm_results.set_markup (string_compose (results_markup, _("No measurement results yet")));
        notebook.set_current_page (latency_tab);
 }