GUI to allow aux-send feedback loops
authorRobin Gareus <robin@gareus.org>
Fri, 14 Oct 2016 14:07:30 +0000 (16:07 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 14 Oct 2016 14:07:30 +0000 (16:07 +0200)
gtk2_ardour/processor_box.cc
gtk2_ardour/processor_box.h
gtk2_ardour/themes/dark-ardour.colors

index 8a34405e235fdced47ccac5f78403cf57bdf1821..97f8f1a91867fffb995217abaced83bb3c2f47d7 100644 (file)
@@ -390,6 +390,14 @@ ProcessorEntry::setup_visuals ()
                }
        }
 
+       boost::shared_ptr<InternalSend> aux;
+       if ((aux = boost::dynamic_pointer_cast<InternalSend> (_processor))) {
+               if (aux->allow_feedback ()) {
+                       _button.set_name ("processor auxfeedback");
+                       return;
+               }
+       }
+
        switch (_position) {
        case PreFader:
                if (_plugin_display) { _plugin_display->set_name ("processor prefader"); }
@@ -746,14 +754,22 @@ ProcessorEntry::build_send_options_menu ()
        Menu* menu = manage (new Menu);
        MenuList& items = menu->items ();
 
-       boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (_processor);
-       if (send) {
+       if (!ARDOUR::Profile->get_mixbus()) {
+               boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (_processor);
+               if (send) {
+                       items.push_back (CheckMenuElem (_("Link panner controls")));
+                       Gtk::CheckMenuItem* c = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
+                       c->set_active (send->panner_shell()->is_linked_to_route());
+                       c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_panner_link));
+               }
+       }
 
-               items.push_back (CheckMenuElem (_("Link panner controls")));
+       boost::shared_ptr<InternalSend> aux = boost::dynamic_pointer_cast<InternalSend> (_processor);
+       if (aux) {
+               items.push_back (CheckMenuElem (_("Allow Feedback Loop")));
                Gtk::CheckMenuItem* c = dynamic_cast<Gtk::CheckMenuItem*> (&items.back ());
-               c->set_active (send->panner_shell()->is_linked_to_route());
-               c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_panner_link));
-
+               c->set_active (aux->allow_feedback());
+               c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_allow_feedback));
        }
        return menu;
 }
@@ -767,6 +783,15 @@ ProcessorEntry::toggle_panner_link ()
        }
 }
 
+void
+ProcessorEntry::toggle_allow_feedback ()
+{
+       boost::shared_ptr<InternalSend> aux = boost::dynamic_pointer_cast<InternalSend> (_processor);
+       if (aux) {
+               aux->set_allow_feedback (!aux->allow_feedback ());
+       }
+}
+
 ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string const & n)
        : _control (c)
        , _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0, 1, 0.01, 0.1)
@@ -2135,21 +2160,19 @@ ProcessorBox::show_processor_menu (int arg)
        }
 
 
-       if (!ARDOUR::Profile->get_mixbus()) {
-               Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options"));
-               if (send_menu_item) {
-                       if (single_selection && !_route->is_monitor()) {
-                               Menu* m = single_selection->build_send_options_menu ();
-                               if (m && !m->items().empty()) {
-                                       send_menu_item->set_submenu (*m);
-                                       send_menu_item->set_sensitive (true);
-                               } else {
-                                       gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
-                                       send_menu_item->set_sensitive (false);
-                               }
+       Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options"));
+       if (send_menu_item) {
+               if (single_selection && !_route->is_monitor()) {
+                       Menu* m = single_selection->build_send_options_menu ();
+                       if (m && !m->items().empty()) {
+                               send_menu_item->set_submenu (*m);
+                               send_menu_item->set_sensitive (true);
                        } else {
+                               gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
                                send_menu_item->set_sensitive (false);
                        }
+               } else {
+                       send_menu_item->set_sensitive (false);
                }
        }
 
index 5f0115529cfb1f7b0944976d7dc87f64652e8071..d7517d9e83da924eaa07e05bc2e961ca4bc95c45 100644 (file)
@@ -239,6 +239,7 @@ private:
        void toggle_inline_display_visibility ();
        void toggle_control_visibility (Control *);
        void toggle_panner_link ();
+       void toggle_allow_feedback ();
 
        class PluginDisplay : public Gtk::DrawingArea {
        public:
index d4639277d867045891e7e7eb816190442a455f82..e77401b6d7998d0b1faf76aa452e087858259841 100644 (file)
     <ColorAlias name="processor stub: fill active" alias="color 46"/>
     <ColorAlias name="processor sidechain: fill" alias="color 68"/>
     <ColorAlias name="processor sidechain: led active" alias="color 37"/>
+    <ColorAlias name="processor auxfeedback: fill" alias="color 89"/>
+    <ColorAlias name="processor auxfeedback: led active" alias="color 37"/>
     <ColorAlias name="pinrouting custom: led active" alias="color 86"/>
     <ColorAlias name="pinrouting sidechain: led active" alias="color 50"/>
     <ColorAlias name="punch button: fill" alias="color 20"/>