Fix uninitialised variable causing garbage output from panners in some cases.
[ardour.git] / libs / ardour / speakers.cc
index 0120e56bfa4b356a6b19e8cdf8284d43df907a12..51bae165852a61e37552beb8d1033a7e0e03fecd 100644 (file)
@@ -35,11 +35,35 @@ Speaker::Speaker (int i, const AngularVector& position)
        move (position);
 }
 
+Speaker::Speaker (Speaker const & o)
+       : id (o.id)
+       , _coords (o._coords)
+       , _angles (o._angles)
+{
+
+}
+
+Speaker &
+Speaker::operator= (Speaker const & o)
+{
+       if (&o == this) {
+               return *this;
+       }
+
+       id = o.id;
+       _coords = o._coords;
+       _angles = o._angles;
+
+       return *this;
+}
+
 void
 Speaker::move (const AngularVector& new_position)
 {
        _angles = new_position;
        _angles.cartesian (_coords);
+
+       PositionChanged (); /* EMIT SIGNAL */
 }
 
 Speakers::Speakers ()
@@ -47,6 +71,7 @@ Speakers::Speakers ()
 }
 
 Speakers::Speakers (const Speakers& s)
+       : Stateful ()
 {
         _speakers = s._speakers;
 }
@@ -68,7 +93,7 @@ void
 Speakers::dump_speakers (ostream& o)
 {
        for (vector<Speaker>::iterator i = _speakers.begin(); i != _speakers.end(); ++i) {
-               o << "Speaker " << (*i).id << " @ " 
+               o << "Speaker " << (*i).id << " @ "
                  << (*i).coords().x << ", " << (*i).coords().y << ", " << (*i).coords().z
                  << " azimuth " << (*i).angles().azi
                  << " elevation " << (*i).angles().ele
@@ -84,7 +109,7 @@ Speakers::clear_speakers ()
        update ();
 }
 
-int 
+int
 Speakers::add_speaker (const AngularVector& position)
 {
        int id = _speakers.size();
@@ -95,17 +120,17 @@ Speakers::add_speaker (const AngularVector& position)
        Changed ();
 
        return id;
-}        
+}
 
 void
 Speakers::remove_speaker (int id)
 {
-       for (vector<Speaker>::iterator i = _speakers.begin(); i != _speakers.end(); ) {
-               if ((*i).id == id) {
+       for (vector<Speaker>::iterator i = _speakers.begin(); i != _speakers.end(); ++i) {
+               if (i->id == id) {
                        i = _speakers.erase (i);
                        update ();
                        break;
-               } 
+               }
        }
 }
 
@@ -152,7 +177,7 @@ Speakers::setup_default_speakers (uint32_t n)
                 add_speaker (AngularVector (215.0, 0.0));
                break;
 
-       default: 
+       default:
        {
                double degree_step = 360.0 / n;
                double deg;
@@ -173,7 +198,7 @@ Speakers::setup_default_speakers (uint32_t n)
        }
         }
 }
-        
+
 XMLNode&
 Speakers::get_state ()
 {
@@ -193,7 +218,7 @@ Speakers::get_state ()
 
                 node->add_child_nocopy (*speaker);
         }
-        
+
         return *node;
 }
 
@@ -221,7 +246,7 @@ Speakers::set_state (const XMLNode& node, int /*version*/)
                                 continue;
                         }
                         e = atof (prop->value());
-                                            
+
                         if ((prop = (*i)->property (X_("distance"))) == 0) {
                                 warning << _("Speaker information is missing distance - speaker ignored") << endmsg;
                                 continue;
@@ -233,6 +258,6 @@ Speakers::set_state (const XMLNode& node, int /*version*/)
         }
 
         update ();
-        
+
         return 0;
 }