+
+AngularVector
+VBAPanner::signal_position (uint32_t n) const
+{
+ if (n < _signals.size()) {
+ return _signals[n]->direction;
+ }
+
+ return AngularVector();
+}
+
+boost::shared_ptr<Speakers>
+VBAPanner::get_speakers () const
+{
+ return _speakers->parent();
+}
+
+void
+VBAPanner::set_position (double p)
+{
+ /* map into 0..1 range */
+ int over = p;
+ over -= (p >= 0) ? 0 : 1;
+ p -= (double)over;
+ _pannable->pan_azimuth_control->set_value (p);
+}
+
+void
+VBAPanner::set_width (double w)
+{
+ _pannable->pan_width_control->set_value (min (1.0, max (-1.0, w)));
+}
+
+void
+VBAPanner::set_elevation (double e)
+{
+ _pannable->pan_elevation_control->set_value (min (1.0, max (0.0, e)));
+}
+
+void
+VBAPanner::reset ()
+{
+ set_position (.5);
+ if (_signals.size() > 1) {
+ set_width (1.0 - (1.0 / (double)_signals.size()));
+ } else {
+ set_width (1.0);
+ }
+ set_elevation (0);
+
+ update ();
+}