diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-19 17:44:54 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-19 17:49:35 -0400 |
commit | 05bc96f4d2bf5f68f5416f287034e86f4e59c11d (patch) | |
tree | 929c77d9c3bc0f7667ebb76e61b2692427f40fbc | |
parent | f96b6982344dd390b3ee4882e96d1a7b83374b0f (diff) |
move MIDI port options out of engine dialog and into prefs
-rw-r--r-- | gtk2_ardour/engine_dialog.cc | 163 | ||||
-rw-r--r-- | gtk2_ardour/engine_dialog.h | 39 | ||||
-rw-r--r-- | gtk2_ardour/rc_option_editor.cc | 220 |
3 files changed, 234 insertions, 188 deletions
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 145b6812ec..8a6c42fd8c 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -239,21 +239,6 @@ EngineControl::EngineControl () midi_back_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (notebook, &Gtk::Notebook::set_current_page), 0)); - pretty_name_column = midi_input_view.append_column (_("Pretty Name"), midi_port_columns.pretty_name) - 1; - use_column = midi_input_view.append_column (_("Use"), midi_port_columns.in_use) - 1; - music_column = midi_input_view.append_column (_("Use for Music"), midi_port_columns.music_data) - 1; - control_column = midi_input_view.append_column (_("Use for Control"), midi_port_columns.control_data) - 1; - selection_column = midi_input_view.append_column (_("Follow Selection"), midi_port_columns.control_data) - 1; - - midi_output_view.append_column (_("Pretty Name"), midi_port_columns.pretty_name); - midi_output_view.append_column (_("Use"), midi_port_columns.in_use); - midi_output_view.append_column (_("Use for Music"), midi_port_columns.music_data); - midi_output_view.append_column (_("Use for Control"), midi_port_columns.control_data); - midi_output_view.append_column (_("Follow Selection"), midi_port_columns.control_data); - - midi_input_view.get_selection()->set_mode (SELECTION_NONE); - midi_output_view.get_selection()->set_mode (SELECTION_NONE); - /* pack it all up */ notebook.pages().push_back (TabElem (basic_vbox, _("Audio"))); @@ -261,7 +246,7 @@ EngineControl::EngineControl () notebook.pages().push_back (TabElem (midi_vbox, _("MIDI"))); notebook.set_border_width (12); - //notebook.set_show_tabs (false); + notebook.set_show_tabs (false); notebook.show_all (); notebook.set_name ("SettingsNotebook"); @@ -792,147 +777,23 @@ 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_input_view); - midi_vbox.pack_start (midi_output_view); midi_vbox.pack_start (midi_back_button, false, false); - midi_vbox.show_all (); } void -EngineControl::refill_midi_ports (bool for_input) -{ - using namespace ARDOUR; - - std::vector<string> ports; - - AudioEngine::instance()->get_ports (string(), DataType::MIDI, for_input ? IsInput : IsOutput, ports); - - Glib::RefPtr<ListStore> model = Gtk::ListStore::create (midi_port_columns); - - for (vector<string>::const_iterator s = ports.begin(); s != ports.end(); ++s) { - - if (AudioEngine::instance()->port_is_mine (*s)) { - continue; - } - - TreeModel::Row row = *(model->append()); - - string pretty = AudioEngine::instance()->get_pretty_name_by_name (*s); - row[midi_port_columns.name] = *s; - row[midi_port_columns.pretty_name] = (pretty.empty() ? *s : pretty); - row[midi_port_columns.in_use] = true; - row[midi_port_columns.music_data] = true; - row[midi_port_columns.control_data] = true; - } - - Gtk::TreeView& view (for_input ? midi_input_view : midi_output_view); - - view.set_model (model); - - CellRendererText* pretty_name_cell = dynamic_cast<CellRendererText*> (view.get_column_cell_renderer (pretty_name_column)); - pretty_name_cell->property_editable() = true; - pretty_name_cell->signal_edited().connect (sigc::bind (sigc::mem_fun (*this, &EngineControl::pretty_name_edit), &view)); - - CellRendererToggle* toggle_cell; - - toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (use_column)); - toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &EngineControl::midi_use_column_toggled), &view)); - - toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (music_column)); - toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &EngineControl::midi_music_column_toggled), &view)); - - toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (control_column)); - toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &EngineControl::midi_control_column_toggled), &view)); - - toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (selection_column)); - toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &EngineControl::midi_selection_column_toggled), &view)); -} - -void -EngineControl::midi_use_column_toggled (string const & path, TreeView* view) -{ - TreeIter iter = view->get_model()->get_iter (path); - - if (!iter) { - return; - } - - bool value ((*iter)[midi_port_columns.in_use]); - (*iter)[midi_port_columns.in_use] = !value; - -} - -void -EngineControl::midi_music_column_toggled (string const & path, TreeView* view) -{ - TreeIter iter = view->get_model()->get_iter (path); - - if (!iter) { - return; - } - - bool value ((*iter)[midi_port_columns.music_data]); - (*iter)[midi_port_columns.music_data] = !value; -} - -void -EngineControl::midi_control_column_toggled (string const & path, TreeView* view) -{ - TreeIter iter = view->get_model()->get_iter (path); - - if (!iter) { - return; - } - - bool value ((*iter)[midi_port_columns.control_data]); - (*iter)[midi_port_columns.control_data] = !value; - - if (!value) { - // ARDOUR::AudioEngine::instance()->remove_port_purpose (PortFlags (ControlData)); - } else { - // ARDOUR::AudioEngine::instance()->add_port_purpose (PortFlags (ControlData)); - } -} - -void -EngineControl::midi_selection_column_toggled (string const & path, TreeView* view) -{ - TreeIter iter = view->get_model()->get_iter (path); - - if (!iter) { - return; - } - bool value ((*iter)[midi_port_columns.selection]); - (*iter)[midi_port_columns.selection] = !value; -} - -void -EngineControl::pretty_name_edit (std::string const & path, string const & new_text, Gtk::TreeView* view) -{ - TreeIter iter = view->get_model()->get_iter (path); - - if (!iter) { - return; - } - - boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); - if (backend) { - ARDOUR::PortEngine::PortHandle ph = backend->get_port_by_name ((*iter)[midi_port_columns.name]); - if (ph) { - backend->set_port_property (ph, "http://jackaudio.org/metadata/pretty-name", new_text, ""); - (*iter)[midi_port_columns.pretty_name] = new_text; - } - } -} - -void EngineControl::update_sensitivity () { boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); @@ -1072,6 +933,11 @@ EngineControl::update_sensitivity () } void +EngineControl::setup_midi_tab_for_jack () +{ +} + +void EngineControl::midi_latency_adjustment_changed (Gtk::Adjustment *a, MidiDeviceSettings device, bool for_input) { if (for_input) { device->input_latency = a->get_value(); @@ -1654,7 +1520,7 @@ EngineControl::set_nperiods_popdown_strings () set_popdown_strings (nperiods_combo, s); if (!s.empty()) { - set_active_text_if_present (nperiods_combo, nperiods_as_string (backend->period_size())); // XXX + set_active_text_if_present (nperiods_combo, nperiods_as_string (backend->period_size())); // XXX } update_sensitivity (); @@ -3231,9 +3097,6 @@ EngineControl::engine_running () engine_status.set_markup(string_compose ("<span foreground=\"green\">%1</span>", _("Connected"))); } update_sensitivity(); - - refill_midi_ports (true); - refill_midi_ports (false); } void diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 6a90d3b055..8f47f2b5a3 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -137,6 +137,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void midi_option_changed (); void setup_midi_tab_for_backend (); + void setup_midi_tab_for_jack (); void refresh_midi_display (std::string focus = ""); void update_midi_options (); @@ -349,44 +350,6 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void midi_latency_adjustment_changed(Gtk::Adjustment *, MidiDeviceSettings, bool); void midi_device_enabled_toggled(ArdourButton *, MidiDeviceSettings); sigc::connection lm_back_button_signal; - - /* MIDI port management */ - struct MidiPortColumns : public Gtk::TreeModel::ColumnRecord { - - MidiPortColumns () { - add (name); - add (pretty_name); - add (in_use); - add (music_data); - add (control_data); - add (selection); - add (port); - } - - Gtk::TreeModelColumn<std::string> name; - Gtk::TreeModelColumn<std::string> pretty_name; - Gtk::TreeModelColumn<bool> in_use; - Gtk::TreeModelColumn<bool> music_data; - Gtk::TreeModelColumn<bool> control_data; - Gtk::TreeModelColumn<bool> selection; - Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Port> > port; - }; - - MidiPortColumns midi_port_columns; - Gtk::TreeView midi_input_view; - Gtk::TreeView midi_output_view; - int pretty_name_column; - int use_column; - int music_column; - int control_column; - int selection_column; - - void refill_midi_ports (bool for_input); - void pretty_name_edit (std::string const & path, std::string const & new_text, Gtk::TreeView*); - void midi_use_column_toggled (std::string const & path, Gtk::TreeView*); - void midi_music_column_toggled (std::string const & path, Gtk::TreeView*); - void midi_control_column_toggled (std::string const & path, Gtk::TreeView*); - void midi_selection_column_toggled (std::string const & path, Gtk::TreeView*); }; #endif /* __gtk2_ardour_engine_dialog_h__ */ diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 940c675bb6..5bda3222d2 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -42,11 +42,13 @@ #include "pbd/fpu.h" #include "pbd/cpus.h" +#include "ardour/audio_backend.h" #include "ardour/audioengine.h" #include "ardour/profile.h" #include "ardour/dB.h" #include "ardour/rc_configuration.h" #include "ardour/control_protocol_manager.h" +#include "ardour/port_manager.h" #include "ardour/plugin_manager.h" #include "control_protocol/control_protocol.h" @@ -1852,6 +1854,214 @@ private: }; +class MidiPortOptions : public OptionEditorBox +{ + public: + MidiPortOptions() { + setup_midi_port_view (midi_output_view, false); + setup_midi_port_view (midi_input_view, true); + + _box->pack_start (midi_input_view); + _box->pack_start (midi_output_view); + + midi_output_view.show (); + midi_input_view.show (); + } + + void parameter_changed (string const&) {} + void set_state_from_config() {} + + private: + + /* MIDI port management */ + struct MidiPortColumns : public Gtk::TreeModel::ColumnRecord { + + MidiPortColumns () { + add (pretty_name); + add (in_use); + add (music_data); + add (control_data); + add (selection); + add (name); + } + + Gtk::TreeModelColumn<std::string> pretty_name; + Gtk::TreeModelColumn<bool> in_use; + Gtk::TreeModelColumn<bool> music_data; + Gtk::TreeModelColumn<bool> control_data; + Gtk::TreeModelColumn<bool> selection; + Gtk::TreeModelColumn<std::string> name; + }; + + MidiPortColumns midi_port_columns; + Gtk::TreeView midi_input_view; + Gtk::TreeView midi_output_view; + + void setup_midi_port_view (Gtk::TreeView&, bool with_selection); + void refill_midi_ports (bool for_input, Gtk::TreeView&); + void pretty_name_edit (std::string const & path, std::string const & new_text, Gtk::TreeView*); + void midi_use_column_toggled (std::string const & path, Gtk::TreeView*); + void midi_music_column_toggled (std::string const & path, Gtk::TreeView*); + void midi_control_column_toggled (std::string const & path, Gtk::TreeView*); + void midi_selection_column_toggled (std::string const & path, Gtk::TreeView*); +}; + +void +MidiPortOptions::setup_midi_port_view (Gtk::TreeView& view, bool with_selection) +{ + int pretty_name_column; + int use_column; + int music_column; + int control_column; + int selection_column; + + pretty_name_column = view.append_column_editable (_("Name (editable)"), midi_port_columns.pretty_name) - 1; + use_column = view.append_column_editable (_("Use"), midi_port_columns.in_use) - 1; + music_column = view.append_column_editable (_("Use for Music"), midi_port_columns.music_data) - 1; + control_column = view.append_column_editable (_("Use for Control"), midi_port_columns.control_data) - 1; + + if (with_selection) { + selection_column = view.append_column_editable (_("Follow Selection"), midi_port_columns.selection) - 1; + } + + CellRendererText* pretty_name_cell = dynamic_cast<CellRendererText*> (view.get_column_cell_renderer (pretty_name_column)); + pretty_name_cell->signal_edited().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::pretty_name_edit), &view)); + + CellRendererToggle* toggle_cell; + + toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (use_column)); + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_use_column_toggled), &view)); + + toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (music_column)); + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_music_column_toggled), &view)); + + toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (control_column)); + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_control_column_toggled), &view)); + + if (with_selection) { + toggle_cell = dynamic_cast<CellRendererToggle*> (view.get_column_cell_renderer (selection_column)); + toggle_cell->signal_toggled().connect (sigc::bind (sigc::mem_fun (*this, &MidiPortOptions::midi_selection_column_toggled), &view)); + } + + view.get_selection()->set_mode (SELECTION_NONE); + view.set_tooltip_column (5); /* port "real" name */ +} + +void +MidiPortOptions::refill_midi_ports (bool for_input, Gtk::TreeView& view) +{ + using namespace ARDOUR; + + std::vector<string> ports; + + AudioEngine::instance()->get_ports (string(), DataType::MIDI, for_input ? IsOutput : IsInput, ports); + + Glib::RefPtr<ListStore> model = Gtk::ListStore::create (midi_port_columns); + + for (vector<string>::const_iterator s = ports.begin(); s != ports.end(); ++s) { + + if (AudioEngine::instance()->port_is_mine (*s)) { + continue; + } + + TreeModel::Row row = *(model->append()); + + string pretty = AudioEngine::instance()->get_pretty_name_by_name (*s); + row[midi_port_columns.pretty_name] = (pretty.empty() ? *s : pretty); + row[midi_port_columns.in_use] = true; + row[midi_port_columns.music_data] = true; + row[midi_port_columns.control_data] = true; + row[midi_port_columns.name] = *s; + } + + view.set_model (model); +} + +void +MidiPortOptions::midi_use_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + bool value ((*iter)[midi_port_columns.in_use]); + (*iter)[midi_port_columns.in_use] = !value; + +} + +void +MidiPortOptions::midi_music_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + bool value ((*iter)[midi_port_columns.music_data]); + (*iter)[midi_port_columns.music_data] = !value; +} + +void +MidiPortOptions::midi_control_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + bool value ((*iter)[midi_port_columns.control_data]); + (*iter)[midi_port_columns.control_data] = !value; + + if (!value) { + // ARDOUR::AudioEngine::instance()->remove_port_purpose (PortFlags (ControlData)); + } else { + // ARDOUR::AudioEngine::instance()->add_port_purpose (PortFlags (ControlData)); + } +} + +void +MidiPortOptions::midi_selection_column_toggled (string const & path, TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + bool value ((*iter)[midi_port_columns.selection]); + (*iter)[midi_port_columns.selection] = !value; + + if (!value) { + ARDOUR::AudioEngine::instance()->add_to_midi_selection_ports ((*iter)[midi_port_columns.name]); + } else { + ARDOUR::AudioEngine::instance()->remove_from_midi_selection_ports ((*iter)[midi_port_columns.name]); + } +} + +void +MidiPortOptions::pretty_name_edit (std::string const & path, string const & new_text, Gtk::TreeView* view) +{ + TreeIter iter = view->get_model()->get_iter (path); + + if (!iter) { + return; + } + + boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend(); + if (backend) { + ARDOUR::PortEngine::PortHandle ph = backend->get_port_by_name ((*iter)[midi_port_columns.name]); + if (ph) { + backend->set_port_property (ph, "http://jackaudio.org/metadata/pretty-name", new_text, ""); + (*iter)[midi_port_columns.pretty_name] = new_text; + } + } +} + +/*============*/ + RCOptionEditor::RCOptionEditor () : OptionEditorContainer (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME)) @@ -2719,6 +2929,16 @@ if (!ARDOUR::Profile->get_mixbus()) { sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_feedback) )); + add_option (_("MIDI/Ports"), + new BoolOption ( + "get-midi-input-follows-selection", + _("MIDI input follows MIDI track selection"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_input_follows_selection), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_input_follows_selection) + )); + + add_option (_("MIDI/Ports"), new MidiPortOptions ()); + add_option (_("MIDI/Sync"), new OptionEditorHeading (_("MIDI Clock"))); add_option (_("MIDI/Sync"), |