X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fspeakers.cc;h=bbad254f6ec4d0049c70e31a50b863059d351223;hb=7953df93bfec2df8bb0a8568a9dacbd00235aac4;hp=4bb843021c7ef2d9478c6f2e54ed3103e08af211;hpb=cbf530b6b57e391e28f148e8805da817c97c9d1d;p=ardour.git diff --git a/libs/ardour/speakers.cc b/libs/ardour/speakers.cc index 4bb843021c..bbad254f6e 100644 --- a/libs/ardour/speakers.cc +++ b/libs/ardour/speakers.cc @@ -40,7 +40,7 @@ Speaker::Speaker (Speaker const & o) , _coords (o._coords) , _angles (o._angles) { - + } Speaker & @@ -71,6 +71,7 @@ Speakers::Speakers () } Speakers::Speakers (const Speakers& s) + : Stateful () { _speakers = s._speakers; } @@ -92,7 +93,7 @@ void Speakers::dump_speakers (ostream& o) { for (vector::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 @@ -108,7 +109,7 @@ Speakers::clear_speakers () update (); } -int +int Speakers::add_speaker (const AngularVector& position) { int id = _speakers.size(); @@ -119,7 +120,7 @@ Speakers::add_speaker (const AngularVector& position) Changed (); return id; -} +} void Speakers::remove_speaker (int id) @@ -148,35 +149,76 @@ Speakers::move_speaker (int id, const AngularVector& new_position) 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; @@ -187,17 +229,17 @@ Speakers::setup_default_speakers (uint32_t n) */ 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 () { @@ -217,7 +259,7 @@ Speakers::get_state () node->add_child_nocopy (*speaker); } - + return *node; } @@ -245,7 +287,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; @@ -257,6 +299,6 @@ Speakers::set_state (const XMLNode& node, int /*version*/) } update (); - + return 0; }