summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-09-17 10:01:24 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-09-17 10:01:24 -0400
commit7381390565aba436b1169470c4b1f6a70a80f7b8 (patch)
treec31e1cb5fb94bae392a3b1e49400331e31b7445e
parent32452bb3b3c5333af9f57b067e16e5b294effc86 (diff)
add basic display of existing MIDI ports to audio/MIDI setup
-rw-r--r--gtk2_ardour/engine_dialog.cc121
-rw-r--r--gtk2_ardour/engine_dialog.h45
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 ();