switch from std::auto_ptr<> (deprecated) to boost::scoped_ptr<>
[ardour.git] / libs / ardour / solo_isolate_control.cc
index d85a973ba33ef511935c46175297125cfa0e2e08..9be6e1a7d586e2513c043c3353e384dc51ccf411 100644 (file)
 #include "ardour/session.h"
 #include "ardour/solo_isolate_control.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
 using namespace PBD;
 
 SoloIsolateControl::SoloIsolateControl (Session& session, std::string const & name, Soloable& s, Muteable& m)
-       : SlavableAutomationControl (session, SoloAutomation, ParameterDescriptor (SoloIsolateAutomation),
+       : SlavableAutomationControl (session, SoloIsolateAutomation, ParameterDescriptor (SoloIsolateAutomation),
                                     boost::shared_ptr<AutomationList>(new AutomationList(Evoral::Parameter(SoloIsolateAutomation))),
                                     name)
        , _soloable (s)
@@ -42,7 +42,7 @@ SoloIsolateControl::SoloIsolateControl (Session& session, std::string const & na
 }
 
 void
-SoloIsolateControl::master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd)
+SoloIsolateControl::master_changed (bool from_self, PBD::Controllable::GroupControlDisposition gcd, boost::weak_ptr<AutomationControl>)
 {
        if (!_soloable.can_solo()) {
                return;
@@ -84,8 +84,6 @@ SoloIsolateControl::mod_solo_isolated_by_upstream (int32_t delta)
        }
 
        if (solo_isolated() != old) {
-               /* solo isolated status changed */
-               _muteable.mute_master()->set_solo_ignore (solo_isolated());
                Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
        }
 }
@@ -97,20 +95,19 @@ SoloIsolateControl::actually_set_value (double val, PBD::Controllable::GroupCont
                return;
        }
 
-       set_solo_isolated (val == 0.0 ? false : true, gcd);
+       set_solo_isolated (val, gcd);
 
        /* this sets the Evoral::Control::_user_value for us, which will
           be retrieved by AutomationControl::get_value (), and emits Changed
        */
 
        AutomationControl::actually_set_value (val, gcd);
-       _session.set_dirty ();
 }
 
 void
 SoloIsolateControl::set_solo_isolated (bool yn, Controllable::GroupControlDisposition group_override)
 {
-       if (_soloable.can_solo()) {
+       if (!_soloable.can_solo()) {
                return;
        }
 
@@ -118,19 +115,16 @@ SoloIsolateControl::set_solo_isolated (bool yn, Controllable::GroupControlDispos
 
        if (yn) {
                if (_solo_isolated == false) {
-                       _muteable.mute_master()->set_solo_ignore (true);
                        changed = true;
                }
                _solo_isolated = true;
        } else {
                if (_solo_isolated == true) {
                        _solo_isolated = false;
-                       _muteable.mute_master()->set_solo_ignore (false);
                        changed = true;
                }
        }
 
-
        if (!changed) {
                return;
        }
@@ -147,8 +141,7 @@ double
 SoloIsolateControl::get_value () const
 {
        if (slaved()) {
-               Glib::Threads::RWLock::ReaderLock lm (master_lock);
-               return get_masters_value_locked () ? 1.0 : 0.0;
+               return solo_isolated() || get_masters_value ();
        }
 
        if (_list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback()) {
@@ -156,18 +149,17 @@ SoloIsolateControl::get_value () const
                return AutomationControl::get_value();
        }
 
-       return solo_isolated () ? 1.0 : 0.0;
+       return solo_isolated ();
 }
 
 int
-SoloIsolateControl::set_state (XMLNode const & node, int)
+SoloIsolateControl::set_state (XMLNode const & node, int version)
 {
-       XMLProperty const * prop;
-
-       if ((prop = node.property ("solo-isolated")) != 0) {
-               _solo_isolated = string_is_affirmative (prop->value());
+       if (SlavableAutomationControl::set_state(node, version)) {
+               return -1;
        }
 
+       node.get_property ("solo-isolated", _solo_isolated);
        return 0;
 }
 
@@ -175,6 +167,6 @@ XMLNode&
 SoloIsolateControl::get_state ()
 {
        XMLNode& node (SlavableAutomationControl::get_state());
-       node.add_property (X_("solo-isolated"), _solo_isolated ? X_("yes") : X_("no"));
+       node.set_property (X_("solo-isolated"), _solo_isolated);
        return node;
 }