, _coords (o._coords)
, _angles (o._angles)
{
-
+
}
Speaker &
}
Speakers::Speakers (const Speakers& s)
+ : Stateful ()
{
_speakers = s._speakers;
}
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
update ();
}
-int
+int
Speakers::add_speaker (const AngularVector& position)
{
int id = _speakers.size();
Changed ();
return id;
-}
+}
void
Speakers::remove_speaker (int id)
void
Speakers::setup_default_speakers (uint32_t n)
{
+ double o = 180.0;
+
/* default assignment of speaker position for n speakers */
assert (n>0);
switch (n) {
case 1:
- add_speaker (AngularVector (0.0, 0.0));
+ add_speaker (AngularVector (o +0.0, 0.0));
break;
case 2:
- add_speaker (AngularVector (0.0, 0.0));
- add_speaker (AngularVector (180.0, 0,0));
+ add_speaker (AngularVector (o +60.0, 0.0));
+ add_speaker (AngularVector (o -60.0, 0.0));
break;
case 3:
- /* top, bottom kind-of-left & bottom kind-of-right */
- add_speaker (AngularVector (90.0, 0.0));
- add_speaker (AngularVector (215.0, 0,0));
- add_speaker (AngularVector (335.0, 0,0));
+ add_speaker (AngularVector (o +60.0, 0.0));
+ add_speaker (AngularVector (o -60.0, 0.0));
+ add_speaker (AngularVector (o +180.0, 0.0));
break;
case 4:
- /* clockwise from top left */
- add_speaker (AngularVector (135.0, 0.0));
- add_speaker (AngularVector (45.0, 0.0));
- add_speaker (AngularVector (335.0, 0.0));
- add_speaker (AngularVector (215.0, 0.0));
+ /* 4.0 with regular spacing */
+ add_speaker (AngularVector (o +45.0, 0.0));
+ add_speaker (AngularVector (o -45.0, 0.0));
+ add_speaker (AngularVector (o +135.0, 0.0));
+ add_speaker (AngularVector (o -135.0, 0.0));
+ break;
+ case 5:
+ /* 5.0 with regular spacing */
+ add_speaker (AngularVector (o +72.0, 0.0));
+ add_speaker (AngularVector (o -72.0, 0.0));
+ add_speaker (AngularVector (o +0.0, 0.0));
+ add_speaker (AngularVector (o +144.0, 0.0));
+ add_speaker (AngularVector (o -144.0, 0.0));
+ break;
+ case 6:
+ /* 6.0 with regular spacing */
+ add_speaker (AngularVector (o +60.0, 0.0));
+ add_speaker (AngularVector (o -60.0, 0.0));
+ add_speaker (AngularVector (o +0.0, 0.0));
+ add_speaker (AngularVector (o +120.0, 0.0));
+ add_speaker (AngularVector (o -120.0, 0.0));
+ add_speaker (AngularVector (o +180.0, 0.0));
+ break;
+ case 7:
+ /* 7.0 with regular front spacing */
+ add_speaker (AngularVector (o +45.0, 0.0));
+ add_speaker (AngularVector (o -45.0, 0.0));
+ add_speaker (AngularVector (o +0.0, 0.0));
+ add_speaker (AngularVector (o +90.0, 0.0));
+ add_speaker (AngularVector (o -90.0, 0.0));
+ add_speaker (AngularVector (o +150.0, 0.0));
+ add_speaker (AngularVector (o -150.0, 0.0));
+ break;
+ case 10:
+ /* 5+4 with 45°/90° spacing */
+ add_speaker (AngularVector (o +45.0, 0.0));
+ add_speaker (AngularVector (o -45.0, 0.0));
+ add_speaker (AngularVector (o +0.0, 0.0));
+ add_speaker (AngularVector (o +135.0, 0.0));
+ add_speaker (AngularVector (o -135.0, 0.0));
+ add_speaker (AngularVector (o +45.0, 60.0));
+ add_speaker (AngularVector (o -45.0, 60.0));
+ add_speaker (AngularVector (o +135.0, 60.0));
+ add_speaker (AngularVector (o -135.0, 60.0));
+ add_speaker (AngularVector (o +0.0, 90.0));
break;
- default:
+ default:
{
double degree_step = 360.0 / n;
double deg;
*/
if (n % 2) {
- deg = 90.0 - degree_step;
+ deg = 360 + o + degree_step;
} else {
- deg = 90.0;
+ deg = 360 + o;
}
- for (i = 0; i < n; ++i, deg += degree_step) {
- add_speaker (AngularVector (deg, 0.0));
+ for (i = 0; i < n; ++i, deg -= degree_step) {
+ add_speaker (AngularVector (fmod(deg, 360), 0.0));
}
}
}
}
-
+
XMLNode&
Speakers::get_state ()
{
node->add_child_nocopy (*speaker);
}
-
+
return *node;
}
continue;
}
e = atof (prop->value());
-
+
if ((prop = (*i)->property (X_("distance"))) == 0) {
warning << _("Speaker information is missing distance - speaker ignored") << endmsg;
continue;
}
update ();
-
+
return 0;
}