Fix stub LV2 persist implementation.
[ardour.git] / libs / ardour / mute_master.cc
index bc3cca787ab7c0e326588ecb48efa1babd3293ef..5a261fb44fabd20543f6fd3ebb736fc8ad8c3a49 100644 (file)
 using namespace ARDOUR;
 using namespace std;
 
-const MuteMaster::MutePoint MuteMaster::AllPoints = MutePoint (MuteMaster::PreFader|
-                                                              MuteMaster::PostFader|
-                                                              MuteMaster::Listen|
-                                                              MuteMaster::Main);
-
 MuteMaster::MuteMaster (Session& s, const std::string&)
-       : SessionHandleRef (s) 
-        , _mute_point (AllPoints)
-        , _muted (false)
+       : SessionHandleRef (s)
+       , _mute_point (MutePoint (0))
+        , _muted_by_self (false)
         , _soloed (false)
         , _solo_ignore (false)
 {
+       
+       if (Config->get_mute_affects_pre_fader ()) {
+               _mute_point = MutePoint (_mute_point | PreFader);
+       }
+
+       if (Config->get_mute_affects_post_fader ()) {
+               _mute_point = MutePoint (_mute_point | PostFader);
+       }
+
+       if (Config->get_mute_affects_control_outs ()) {
+               _mute_point = MutePoint (_mute_point | Listen);
+       }
+
+       if (Config->get_mute_affects_main_outs ()) {
+               _mute_point = MutePoint (_mute_point | Main);
+       }
 }
 
 void
@@ -76,22 +87,22 @@ MuteMaster::mute_gain_at (MutePoint mp) const
         if (Config->get_solo_mute_override()) {
                 if (_soloed) {
                         gain = 1.0;
-                } else if (muted_at (mp)) { // self-muted 
+                } else if (muted_by_self_at (mp)) {
                         gain = Config->get_solo_mute_gain ();
                 } else {
-                        if (!_solo_ignore && _session.soloing()) {
+                        if (muted_by_others_at (mp)) {
                                 gain = 0.0;
                         } else {
                                 gain = 1.0;
                         }
                 }
         } else {
-                if (muted_at (mp)) { // self-muted 
+                if (muted_by_self_at (mp)) {
                         gain = Config->get_solo_mute_gain ();
                 } else if (_soloed) {
                         gain = 1.0;
                 } else {
-                        if (!_solo_ignore && _session.soloing()) {
+                        if (muted_by_others_at (mp)) {
                                 gain = 0.0;
                         } else {
                                 gain = 1.0;
@@ -133,9 +144,9 @@ MuteMaster::set_state (const XMLNode& node, int /*version*/)
        }
 
        if ((prop = node.property ("muted")) != 0) {
-               _muted = string_is_affirmative (prop->value());
+               _muted_by_self = string_is_affirmative (prop->value());
        } else {
-                _muted = (_mute_point != MutePoint (0));
+                _muted_by_self = (_mute_point != MutePoint (0));
         }
 
        return 0;
@@ -146,6 +157,13 @@ MuteMaster::get_state()
 {
        XMLNode* node = new XMLNode (X_("MuteMaster"));
        node->add_property ("mute-point", enum_2_string (_mute_point));
-       node->add_property ("muted", (_muted ? X_("yes") : X_("no")));
+       node->add_property ("muted", (_muted_by_self ? X_("yes") : X_("no")));
        return *node;
 }
+
+bool
+MuteMaster::muted_by_others_at (MutePoint mp) const
+{
+       return (!_solo_ignore && _session.soloing() && (_mute_point & mp));
+}
+