diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-01-27 01:31:03 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-01-27 01:31:03 +0000 |
commit | 15b5fce90480490455237da917167b0bcb5ce946 (patch) | |
tree | 5c1c5929a83c05db1a901e775fefe4f6cf8dc1b7 /libs/ardour/speakers.cc | |
parent | 1385643131a2b2231bbbc0c584c76883fcfb580a (diff) |
merge 3.0-panexp (pan experiments) branch, revisions 8534-8585 into 3.0, thus ending 3.0-panexp. THIS COMMIT WILL BREAK ALL EXISTING 3.0 SESSIONS IN SOME WAY (possibly not fatally).
git-svn-id: svn://localhost/ardour2/branches/3.0@8586 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/speakers.cc')
-rw-r--r-- | libs/ardour/speakers.cc | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/libs/ardour/speakers.cc b/libs/ardour/speakers.cc index 7d0461ff52..4229e77c65 100644 --- a/libs/ardour/speakers.cc +++ b/libs/ardour/speakers.cc @@ -16,9 +16,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include "pbd/error.h" +#include "pbd/convert.h" +#include "pbd/locale_guard.h" + #include "ardour/speaker.h" #include "ardour/speakers.h" +#include "i18n.h" + using namespace ARDOUR; using namespace PBD; using namespace std; @@ -103,3 +109,119 @@ Speakers::move_speaker (int id, const AngularVector& new_position) } } } + +void +Speakers::setup_default_speakers (uint32_t n) +{ + /* default assignment of speaker position for n speakers */ + + assert (n>0); + + switch (n) { + case 1: + add_speaker (AngularVector (0.0, 0.0)); + break; + + case 2: + add_speaker (AngularVector (0.0, 0.0)); + add_speaker (AngularVector (180.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)); + 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)); + break; + + default: + { + double degree_step = 360.0 / n; + double deg; + uint32_t i; + + /* even number of speakers? make sure the top two are either side of "top". + otherwise, just start at the "top" (90.0 degrees) and rotate around + */ + + if (n % 2) { + deg = 90.0 - degree_step; + } else { + deg = 90.0; + } + for (i = 0; i < n; ++i, deg += degree_step) { + add_speaker (AngularVector (deg, 0.0)); + } + } + } +} + +XMLNode& +Speakers::get_state () +{ + XMLNode* node = new XMLNode (X_("Speakers")); + char buf[32]; + LocaleGuard lg (X_("POSIX")); + + for (vector<Speaker>::const_iterator i = _speakers.begin(); i != _speakers.end(); ++i) { + XMLNode* speaker = new XMLNode (X_("Speaker")); + + snprintf (buf, sizeof (buf), "%.12g", (*i).angles().azi); + speaker->add_property (X_("azimuth"), buf); + snprintf (buf, sizeof (buf), "%.12g", (*i).angles().ele); + speaker->add_property (X_("elevation"), buf); + snprintf (buf, sizeof (buf), "%.12g", (*i).angles().length); + speaker->add_property (X_("distance"), buf); + + node->add_child_nocopy (*speaker); + } + + return *node; +} + +int +Speakers::set_state (const XMLNode& node, int /*version*/) +{ + XMLNodeConstIterator i; + const XMLProperty* prop; + double a, e, d; + LocaleGuard lg (X_("POSIX")); + int n = 0; + + _speakers.clear (); + + for (i = node.children().begin(); i != node.children().end(); ++i, ++n) { + if ((*i)->name() == X_("Speaker")) { + if ((prop = (*i)->property (X_("azimuth"))) == 0) { + warning << _("Speaker information is missing azimuth - speaker ignored") << endmsg; + continue; + } + a = atof (prop->value()); + + if ((prop = (*i)->property (X_("elevation"))) == 0) { + warning << _("Speaker information is missing elevation - speaker ignored") << endmsg; + continue; + } + e = atof (prop->value()); + + if ((prop = (*i)->property (X_("distance"))) == 0) { + warning << _("Speaker information is missing distance - speaker ignored") << endmsg; + continue; + } + d = atof (prop->value()); + + add_speaker (AngularVector (a, e, d)); + } + } + + update (); + + return 0; +} |