diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-09-17 10:01:24 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-09-17 10:01:24 -0400 |
commit | 7381390565aba436b1169470c4b1f6a70a80f7b8 (patch) | |
tree | c31e1cb5fb94bae392a3b1e49400331e31b7445e /gtk2_ardour | |
parent | 32452bb3b3c5333af9f57b067e16e5b294effc86 (diff) |
add basic display of existing MIDI ports to audio/MIDI setup
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/engine_dialog.cc | 121 | ||||
-rw-r--r-- | gtk2_ardour/engine_dialog.h | 45 |
2 files changed, 127 insertions, 39 deletions
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 5fff838a6f..5ed438111f 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -57,6 +57,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,7 +73,8 @@ 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) { @@ -237,8 +239,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"))); @@ -323,7 +323,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); @@ -383,6 +383,87 @@ EngineControl::enable_latency_tab () } 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 () { if (ignore_changes) { @@ -397,6 +478,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); @@ -938,6 +1021,10 @@ EngineControl::push_state_to_backend (bool start) if (ARDOUR::AudioEngine::instance()->start()) { return -1; } + + /* schedule a redisplay of MIDI ports */ + + Glib::signal_timeout().connect (sigc::bind_return (sigc::mem_fun (*this, &EngineControl::refresh_midi_display), false), 1000); } manage_control_app_sensitivity (); @@ -1051,6 +1138,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 */ @@ -1076,7 +1178,8 @@ EngineControl::on_switch_page (GtkNotebookPage*, guint page_num) input_latency.set_value (il); output_latency.set_value (ol); - } + + } if (ARDOUR::AudioEngine::instance()->prepare_for_latency_measurement()) { disable_latency_tab (); @@ -1084,16 +1187,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); } } diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 14724c8bfe..a5c9f1d3f5 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -54,7 +54,13 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { /* core fields used by all backends */ + Gtk::Table basic_packer; + Gtk::HBox basic_hbox; + Gtk::VBox basic_vbox; + Gtk::ComboBoxText backend_combo; + Gtk::ComboBoxText driver_combo; + Gtk::ComboBoxText device_combo; Gtk::ComboBoxText sample_rate_combo; Gtk::ComboBoxText buffer_size_combo; Gtk::Label buffer_size_duration_label; @@ -88,34 +94,18 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { Gtk::Button* ok_button; Gtk::Button* apply_button; - /* JACK specific */ - - Gtk::CheckButton realtime_button; - Gtk::CheckButton no_memory_lock_button; - Gtk::CheckButton unlock_memory_button; - Gtk::CheckButton soft_mode_button; - Gtk::CheckButton monitor_button; - Gtk::CheckButton force16bit_button; - Gtk::CheckButton hw_monitor_button; - Gtk::CheckButton hw_meter_button; - Gtk::CheckButton verbose_output_button; + /* MIDI Tab */ + + Gtk::VBox midi_vbox; + Gtk::Button midi_refresh_button; + Gtk::Table midi_device_table; + + /* MIDI ... JACK */ - Gtk::ComboBoxText preset_combo; - Gtk::ComboBoxText serverpath_combo; - Gtk::ComboBoxText driver_combo; - Gtk::ComboBoxText device_combo; - Gtk::ComboBoxText timeout_combo; - Gtk::ComboBoxText dither_mode_combo; - Gtk::ComboBoxText audio_mode_combo; - Gtk::ComboBoxText midi_driver_combo; + Gtk::CheckButton aj_button; - Gtk::Table basic_packer; - Gtk::Table midi_packer; - Gtk::HBox basic_hbox; - Gtk::VBox basic_vbox; - Gtk::HBox midi_hbox; - uint32_t ignore_changes; + uint32_t _desired_sample_rate; static bool engine_running (); @@ -125,6 +115,10 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void buffer_size_changed (); void parameter_changed (); + void setup_midi_tab_for_backend (); + void setup_midi_tab_for_jack (); + void refresh_midi_display (); + uint32_t get_rate() const; uint32_t get_buffer_size() const; uint32_t get_input_channels() const; @@ -173,7 +167,6 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void use_latency_button_clicked (); void manage_control_app_sensitivity (); int push_state_to_backend (bool start); - uint32_t _desired_sample_rate; /* latency measurement */ void latency_button_toggled (); |