Prepare export-format codec-quality setting
[ardour.git] / libs / ardour / speakers.cc
index 71e524f49007c75573d3cdc3b382be20bf593d8a..928fb0be50e1fa519dcd96d87cf3a4c7b96c01f7 100644 (file)
 */
 
 #include "pbd/error.h"
-#include "pbd/convert.h"
-#include "pbd/locale_guard.h"
 
 #include "ardour/speaker.h"
 #include "ardour/speakers.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace PBD;
@@ -71,6 +69,7 @@ Speakers::Speakers ()
 }
 
 Speakers::Speakers (const Speakers& s)
+       : Stateful ()
 {
         _speakers = s._speakers;
 }
@@ -148,32 +147,73 @@ 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:
@@ -187,12 +227,12 @@ 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));
                }
        }
         }
@@ -202,18 +242,13 @@ 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);
+                speaker->set_property (X_("azimuth"), (*i).angles().azi);
+                speaker->set_property (X_("elevation"), (*i).angles().ele);
+                speaker->set_property (X_("distance"), (*i).angles().length);
 
                 node->add_child_nocopy (*speaker);
         }
@@ -225,32 +260,18 @@ 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) {
+        for (i = node.children().begin(); i != node.children().end(); ++i) {
                 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;
+                        double a, e, d;
+                        if (!(*i)->get_property (X_("azimuth"), a) ||
+                            !(*i)->get_property (X_("elevation"), e) ||
+                            !(*i)->get_property (X_("distance"), d)) {
+                                warning << _("Speaker information is missing - speaker ignored") << endmsg;
                                 continue;
                         }
-                        d = atof (prop->value());
 
                         add_speaker (AngularVector (a, e, d));
                 }