bring back full mute control (pre/post/control/main) via mute button context click
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 18 Nov 2009 13:25:13 +0000 (13:25 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 18 Nov 2009 13:25:13 +0000 (13:25 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6116 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/route_ui.cc
gtk2_ardour/route_ui.h
libs/ardour/ardour/mute_master.h
libs/ardour/ardour/rc_configuration_vars.h
libs/ardour/ardour/route.h
libs/ardour/mute_master.cc
libs/ardour/route.cc
libs/ardour/session.cc

index 68c84bb1e7537eb2d2c7e5b22f26cf366cf41ad9..5104601ba727976aa59f48e10b37b1733abb2520 100644 (file)
@@ -31,6 +31,7 @@
 #include "pbd/stacktrace.h"
 #include "pbd/shiva.h"
 #include "pbd/controllable.h"
+#include "pbd/enumwriter.h"
 
 #include "ardour_ui.h"
 #include "editor.h"
@@ -96,6 +97,10 @@ RouteUI::init ()
        mute_menu = 0;
        solo_menu = 0;
        sends_menu = 0;
+       pre_fader_mute_check = 0;
+       post_fader_mute_check = 0;
+       listen_mute_check = 0;
+       main_mute_check = 0;
        ignore_toggle = false;
        wait_for_release = false;
        route_active_menu_item = 0;
@@ -806,52 +811,85 @@ RouteUI::build_mute_menu(void)
        mute_menu = new Menu;
        mute_menu->set_name ("ArdourContextMenu");
 
-#if FIX_ME_IN_3_0
        MenuList& items = mute_menu->items();
-       CheckMenuItem* check;
-
-       check = new CheckMenuItem(_("Pre Fader"));
-       init_mute_menu(PRE_FADER, check);
-       check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), PRE_FADER, check));
-       _route->pre_fader_changed.connect(bind (mem_fun (*this, &RouteUI::pre_fader_toggle), check));
-       items.push_back (CheckMenuElem(*check));
-       check->show_all();
 
-       check = new CheckMenuItem(_("Post Fader"));
-       init_mute_menu(POST_FADER, check);
-       check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), POST_FADER, check));
-       _route->post_fader_changed.connect(bind (mem_fun (*this, &RouteUI::post_fader_toggle), check));
-       items.push_back (CheckMenuElem(*check));
-       check->show_all();
-
-       check = new CheckMenuItem(_("Control Outs"));
-       init_mute_menu(CONTROL_OUTS, check);
-       check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), CONTROL_OUTS, check));
-       _route->control_outs_changed.connect(bind (mem_fun (*this, &RouteUI::control_outs_toggle), check));
-       items.push_back (CheckMenuElem(*check));
-       check->show_all();
+       pre_fader_mute_check = manage (new CheckMenuItem(_("Pre Fader")));
+       init_mute_menu(MuteMaster::PreFader, pre_fader_mute_check);
+       pre_fader_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PreFader, pre_fader_mute_check));
+       items.push_back (CheckMenuElem(*pre_fader_mute_check));
+       pre_fader_mute_check->show_all();
+
+       post_fader_mute_check = manage (new CheckMenuItem(_("Post Fader")));
+       init_mute_menu(MuteMaster::PostFader, post_fader_mute_check);
+       post_fader_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::PostFader, post_fader_mute_check));
+       items.push_back (CheckMenuElem(*post_fader_mute_check));
+       post_fader_mute_check->show_all();
+
+       listen_mute_check = manage (new CheckMenuItem(_("Control Outs")));
+       init_mute_menu(MuteMaster::Listen, listen_mute_check);
+       listen_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Listen, listen_mute_check));
+       items.push_back (CheckMenuElem(*listen_mute_check));
+       listen_mute_check->show_all();
+
+       main_mute_check = manage (new CheckMenuItem(_("Main Outs")));
+       init_mute_menu(MuteMaster::Main, main_mute_check);
+       main_mute_check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MuteMaster::Main, main_mute_check));
+       items.push_back (CheckMenuElem(*main_mute_check));
+       main_mute_check->show_all();
 
-       check = new CheckMenuItem(_("Main Outs"));
-       init_mute_menu(MAIN_OUTS, check);
-       check->signal_toggled().connect(bind (mem_fun (*this, &RouteUI::toggle_mute_menu), MAIN_OUTS, check));
-       _route->main_outs_changed.connect(bind (mem_fun (*this, &RouteUI::main_outs_toggle), check));
-       items.push_back (CheckMenuElem(*check));
-       check->show_all();
-#endif
        //items.push_back (SeparatorElem());
        // items.push_back (MenuElem (_("MIDI Bind"), mem_fun (*mute_button, &BindableToggleButton::midi_learn)));
+
+       _route->mute_points_changed.connect (mem_fun (*this, &RouteUI::muting_change));
 }
 
 void
 RouteUI::init_mute_menu(MuteMaster::MutePoint mp, CheckMenuItem* check)
 {
-       check->set_active (_route->mute_master()->muted_at (mp));
+       check->set_active (_route->mute_points() & mp);
+}
+
+void
+RouteUI::toggle_mute_menu(MuteMaster::MutePoint mp, Gtk::CheckMenuItem* check)
+{
+       if (check->get_active()) {
+               _route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() | mp));
+       } else {
+               _route->set_mute_points (MuteMaster::MutePoint (_route->mute_points() & ~mp));
+       }
 }
 
 void
-RouteUI::toggle_mute_menu(MuteMaster::MutePoint /*mp*/, Gtk::CheckMenuItem* /*check*/)
+RouteUI::muting_change ()
 {
-       // _route->set_mute_config(type, check->get_active(), this);
+       ENSURE_GUI_THREAD(mem_fun (*this, &RouteUI::muting_change));
+
+       bool yn;
+       MuteMaster::MutePoint current = _route->mute_points ();
+
+       yn = (current & MuteMaster::PreFader);
+
+       if (pre_fader_mute_check->get_active() != yn) {
+               pre_fader_mute_check->set_active (yn);
+       }
+
+       yn = (current & MuteMaster::PostFader);
+
+       if (post_fader_mute_check->get_active() != yn) {
+               post_fader_mute_check->set_active (yn);
+       }
+
+       yn = (current & MuteMaster::Listen);
+
+       if (listen_mute_check->get_active() != yn) {
+               listen_mute_check->set_active (yn);
+       }
+
+       yn = (current & MuteMaster::Main);
+
+       if (main_mute_check->get_active() != yn) {
+               main_mute_check->set_active (yn);
+       }
 }
 
 void
@@ -1164,52 +1202,6 @@ RouteUI::solo_isolated_toggle(void* /*src*/, Gtk::CheckMenuItem* check)
        }
 }
 
-#ifdef FIX_THIS_FOR_3_0
-void
-RouteUI::pre_fader_toggle(void* src, Gtk::CheckMenuItem* check)
-{
-       ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::pre_fader_toggle), src, check));
-
-       bool yn = _route->get_mute_config(PRE_FADER);
-       if (check->get_active() != yn) {
-               check->set_active (yn);
-       }
-}
-
-void
-RouteUI::post_fader_toggle(void* src, Gtk::CheckMenuItem* check)
-{
-       ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::post_fader_toggle), src, check));
-
-       bool yn = _route->get_mute_config(POST_FADER);
-       if (check->get_active() != yn) {
-               check->set_active (yn);
-       }
-}
-
-void
-RouteUI::control_outs_toggle(void* src, Gtk::CheckMenuItem* check)
-{
-       ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::control_outs_toggle), src, check));
-
-       bool yn = _route->get_mute_config(CONTROL_OUTS);
-       if (check->get_active() != yn) {
-               check->set_active (yn);
-       }
-}
-
-void
-RouteUI::main_outs_toggle(void* src, Gtk::CheckMenuItem* check)
-{
-       ENSURE_GUI_THREAD(bind (mem_fun (*this, &RouteUI::main_outs_toggle), src, check));
-
-       bool yn = _route->get_mute_config(MAIN_OUTS);
-       if (check->get_active() != yn) {
-               check->set_active (yn);
-       }
-}
-#endif
-
 void
 RouteUI::disconnect_input ()
 {
index 3b611d23a045ca137e16bf6dcf5a96ed7d340c8b..1b2aca16896ec6c6ae7efea14964b1ba546f342b 100644 (file)
@@ -99,6 +99,7 @@ class RouteUI : public virtual AxisView
        Gtk::Menu* solo_menu;
        Gtk::Menu* sends_menu;
 
+
        XMLNode *xml_node;
        void ensure_xml_node ();
 
@@ -137,12 +138,13 @@ class RouteUI : public virtual AxisView
        void solo_isolated_toggle (void*, Gtk::CheckMenuItem*);
        void toggle_solo_isolated (Gtk::CheckMenuItem*);
 
-       void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
-       void pre_fader_toggle(void*, Gtk::CheckMenuItem*);
-       void post_fader_toggle(void*, Gtk::CheckMenuItem*);
-       void control_outs_toggle(void*, Gtk::CheckMenuItem*);
-       void main_outs_toggle(void*, Gtk::CheckMenuItem*);
+       Gtk::CheckMenuItem* pre_fader_mute_check;
+       Gtk::CheckMenuItem* post_fader_mute_check;
+       Gtk::CheckMenuItem* listen_mute_check;
+       Gtk::CheckMenuItem* main_mute_check;
 
+       void toggle_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
+       void muting_change ();
        void build_mute_menu(void);
        void init_mute_menu(ARDOUR::MuteMaster::MutePoint, Gtk::CheckMenuItem*);
 
index 70015f3a35877bef2e78c6e240540aa252ae70b6..ef65e69aba6b70b4c088c12203513c8864dd6175 100644 (file)
@@ -38,6 +38,8 @@ class MuteMaster : public AutomationControl
                Main      = 0x8
        };
 
+       static const MutePoint AllPoints;
+
        MuteMaster (Session& s, const std::string& name);
        ~MuteMaster() {}
 
index f8e61bff79f659c92c4abedb1351a3f08188d0ce..b0e0c94b84225791ad917bb6e0d7ed1b604921f0 100644 (file)
@@ -83,7 +83,7 @@ CONFIG_VARIABLE (bool, solo_control_is_listen_control, "solo-control-is-listen-c
 CONFIG_VARIABLE (bool, solo_latched, "solo-latched", true)
 CONFIG_VARIABLE (bool, latched_record_enable, "latched-record-enable", false)
 CONFIG_VARIABLE (bool, all_safe, "all-safe", false)
-CONFIG_VARIABLE (bool, show_solo_mutes, "show-solo-mutes", false)
+CONFIG_VARIABLE (bool, show_solo_mutes, "show-solo-mutes", true)
 CONFIG_VARIABLE (bool, solo_mute_override, "solo-mute-override", false)
 CONFIG_VARIABLE (bool, tape_machine_mode, "tape-machine-mode", false)
 CONFIG_VARIABLE (gain_t, solo_mute_gain, "solo-mute-gain", 0.0)
index 47430585749b87227e36d36f7e2adb291c64a2b1..1a60e2f8cd7a093215d72a8a1057a24d450626f9 100644 (file)
@@ -120,10 +120,11 @@ class Route : public SessionObject, public AutomatableControls
        void set_gain (gain_t val, void *src);
        void inc_gain (gain_t delta, void *src);
 
+       void set_mute_points (MuteMaster::MutePoint);
+       MuteMaster::MutePoint mute_points() const { return _mute_points; }
        void set_mute (bool yn, void* src);
        bool muted () const;
 
-
        /* controls use set_solo() to modify this route's solo state
         */
 
@@ -232,10 +233,7 @@ class Route : public SessionObject, public AutomatableControls
        sigc::signal<void,void*> solo_isolated_changed;
        sigc::signal<void,void*> comment_changed;
        sigc::signal<void,void*> mute_changed;
-       sigc::signal<void,void*> pre_fader_changed;
-       sigc::signal<void,void*> post_fader_changed;
-       sigc::signal<void,void*> control_outs_changed;
-       sigc::signal<void,void*> main_outs_changed;
+       sigc::signal<void>       mute_points_changed;
        sigc::signal<void>       processors_changed;
        sigc::signal<void,void*> record_enable_changed;
        sigc::signal<void,void*> route_group_changed;
@@ -360,6 +358,7 @@ class Route : public SessionObject, public AutomatableControls
 
        boost::shared_ptr<SoloControllable> _solo_control;
        boost::shared_ptr<MuteMaster> _mute_master;
+       MuteMaster::MutePoint _mute_points;
 
        RouteGroup*    _route_group;
        std::string    _comment;
index 224eccdd515b55dc2975f6136a7b8550234ac905..1d0b2dda0690b23b725e1acca08890a4e33fa899 100644 (file)
 
 using namespace ARDOUR;
 
+const MuteMaster::MutePoint MuteMaster::AllPoints = MutePoint (MuteMaster::PreFader|
+                                                              MuteMaster::PostFader|
+                                                              MuteMaster::Listen|
+                                                              MuteMaster::Main);
+
 MuteMaster::MuteMaster (Session& s, const std::string& name)
        : AutomationControl (s, Evoral::Parameter (MuteAutomation), boost::shared_ptr<AutomationList>(), name)
        , _mute_point (MutePoint (0))
index 009adce9c8311df5bd73f1f4999847a461960e8b..38bed70dfa7bf7777d974a20ac11c736f3e8629c 100644 (file)
@@ -130,6 +130,7 @@ Route::init ()
        _pending_declick = true;
        _remote_control_id = 0;
        _in_configure_processors = false;
+       _mute_points = MuteMaster::AllPoints;
 
        _route_group = 0;
 
@@ -583,6 +584,18 @@ Route::solo_isolated () const
        return _solo_isolated;
 }
 
+void
+Route::set_mute_points (MuteMaster::MutePoint mp)
+{
+       _mute_points = mp;
+       mute_points_changed (); /* EMIT SIGNAL */
+
+       if (_mute_master->muted()) {
+               _mute_master->mute_at (_mute_points);
+               mute_changed (this); /* EMIT SIGNAL */
+       }
+}
+
 void
 Route::set_mute (bool yn, void *src)
 {
@@ -592,8 +605,13 @@ Route::set_mute (bool yn, void *src)
        }
 
        if (muted() != yn) {
-               _mute_master->mute (yn);
-               mute_changed (src);
+               if (yn) {
+                       _mute_master->mute_at (_mute_points);
+               } else {
+                       _mute_master->clear_mute ();
+               }
+
+               mute_changed (src); /* EMIT SIGNAL */
        }
 }
 
index 6c26e99a9cdd517ecd2888c8ae2f756033756fb5..dfa9b9077611649c42614ddbf2b201412594dbac 100644 (file)
@@ -2439,7 +2439,7 @@ Session::route_solo_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
                        if (!via_sends_only) {
                                /* do it */
                                (*i)->mod_solo_level (delta);
-                       }
+                       } 
                }
        }