configurable midi audition synth
[ardour.git] / gtk2_ardour / rc_option_editor.cc
index ed9ffda4efc221cb7c22ca506fad0a5c020b17d3..fc6978275772219a44170f25def153a96cf6733c 100644 (file)
@@ -35,6 +35,7 @@
 #include "ardour/dB.h"
 #include "ardour/rc_configuration.h"
 #include "ardour/control_protocol_manager.h"
+#include "ardour/plugin_manager.h"
 #include "control_protocol/control_protocol.h"
 
 #include "ardour_window.h"
@@ -648,6 +649,7 @@ class ControlSurfacesOptions : public OptionEditorBox
 public:
        ControlSurfacesOptions (Gtk::Window& parent)
                : _parent (parent)
+               , _ignore_view_change (0)
        {
                _store = ListStore::create (_model);
                _view.set_model (_store);
@@ -700,9 +702,14 @@ private:
         void protocol_status_changed (ControlProtocolInfo* cpi) {
                /* find the row */
                TreeModel::Children rows = _store->children();
+               
                for (TreeModel::Children::iterator x = rows.begin(); x != rows.end(); ++x) {
+                       string n = ((*x)[_model.name]);
+
                        if ((*x)[_model.protocol_info] == cpi) {
+                               _ignore_view_change++;
                                (*x)[_model.enabled] = (cpi->protocol || cpi->requested);
+                               _ignore_view_change--;
                                break;
                        }
                }
@@ -712,6 +719,10 @@ private:
        {
                TreeModel::Row r = *i;
 
+               if (_ignore_view_change) {
+                       return;
+               }
+
                ControlProtocolInfo* cpi = r[_model.protocol_info];
                if (!cpi) {
                        return;
@@ -720,22 +731,23 @@ private:
                bool const was_enabled = (cpi->protocol != 0);
                bool const is_enabled = r[_model.enabled];
 
+
                if (was_enabled != is_enabled) {
+
                        if (!was_enabled) {
-                               ControlProtocolManager::instance().instantiate (*cpi);
+                               ControlProtocolManager::instance().activate (*cpi);
                        } else {
                                Gtk::Window* win = r[_model.editor];
                                if (win) {
                                        win->hide ();
                                }
 
-                               ControlProtocolManager::instance().teardown (*cpi);
+                               ControlProtocolManager::instance().deactivate (*cpi);
                                        
                                if (win) {
                                        delete win;
+                                       r[_model.editor] = 0;
                                }
-                               r[_model.editor] = 0;
-                               cpi->requested = false;
                        }
                }
 
@@ -805,6 +817,7 @@ private:
        TreeView _view;
         Gtk::Window& _parent;
         PBD::ScopedConnection protocol_status_connection;
+        uint32_t _ignore_view_change;
 };
 
 class VideoTimelineOptions : public OptionEditorBox
@@ -1146,7 +1159,7 @@ RCOptionEditor::RCOptionEditor ()
 
        tsf = new BoolOption (
                     "seamless-loop",
-                    _("Do seamless looping (not possible when slaved to MTC, JACK etc)"),
+                    _("Do seamless looping (not possible when slaved to MTC, LTC etc)"),
                     sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop),
                     sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop)
                     );
@@ -1414,14 +1427,6 @@ RCOptionEditor::RCOptionEditor ()
                            sigc::mem_fun (*_rc_config, &RCConfiguration::set_update_editor_during_summary_drag)
                            ));
 
-       add_option (_("Editor"),
-            new BoolOption (
-                    "sync-all-route-ordering",
-                    _("Synchronise editor and mixer track order"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_sync_all_route_ordering),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_all_route_ordering)
-                    ));
-
        add_option (_("Editor"),
             new BoolOption (
                     "link-editor-and-mixer-selection",
@@ -1464,12 +1469,10 @@ RCOptionEditor::RCOptionEditor ()
                sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model)
                );
 
-#ifndef __APPLE__
-        /* no JACK monitoring on CoreAudio */
         if (AudioEngine::instance()->port_engine().can_monitor_input()) {
                 mm->add (HardwareMonitoring, _("via Audio Driver"));
         }
-#endif
+
        mm->add (SoftwareMonitoring, _("ardour"));
        mm->add (ExternalMonitoring, _("audio hardware"));
 
@@ -1589,6 +1592,8 @@ RCOptionEditor::RCOptionEditor ()
 
        /* SOLO AND MUTE */
 
+       add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo")));
+
        add_option (_("Solo / mute"),
             new FaderOption (
                     "solo-mute-gain",
@@ -1702,6 +1707,16 @@ RCOptionEditor::RCOptionEditor ()
                     sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs)
                     ));
 
+       add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing")));
+
+       add_option (_("Solo / mute"),
+            new BoolOption (
+                    "link-send-and-route-panner",
+                    _("Link panners of Aux and External Sends with main panner by default"),
+                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner),
+                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner)
+                    ));
+
        add_option (_("MIDI"),
                    new BoolOption (
                            "send-midi-clock",
@@ -1802,6 +1817,31 @@ RCOptionEditor::RCOptionEditor ()
                     sigc::mem_fun (*_rc_config, &RCConfiguration::set_sound_midi_notes)
                     ));
 
+       add_option (_("MIDI"), new OptionEditorHeading (_("Midi Audition")));
+
+       ComboOption<std::string>* audition_synth = new ComboOption<std::string> (
+               "midi-audition-synth-uri",
+               _("Midi Audition Synth (LV2)"),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_audition_synth_uri),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_audition_synth_uri)
+               );
+
+       audition_synth->add(X_(""), _("None"));
+       PluginInfoList all_plugs;
+       PluginManager& manager (PluginManager::instance());
+#ifdef LV2_SUPPORT
+       all_plugs.insert (all_plugs.end(), manager.lv2_plugin_info().begin(), manager.lv2_plugin_info().end());
+
+       for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
+               if (manager.get_status (*i) == PluginManager::Hidden) continue;
+               if (!(*i)->is_instrument()) continue;
+               if ((*i)->type != ARDOUR::LV2) continue;
+               audition_synth->add((*i)->unique_id, (*i)->name);
+       }
+#endif
+
+       add_option (_("MIDI"), audition_synth);
+
        /* USER INTERACTION */
 
        if (getenv ("ARDOUR_BUNDLED")) {
@@ -1832,7 +1872,6 @@ RCOptionEditor::RCOptionEditor ()
 
        rm->add (UserOrdered, _("assigned by user"));
        rm->add (MixerOrdered, _("follows order of mixer"));
-       rm->add (EditorOrdered, _("follows order of editor"));
 
        add_option (_("Control Surfaces"), rm);