Fix state features array
[ardour.git] / libs / ardour / export_format_specification.cc
index 5bc10e813c1625b8dcdd8749cf05e969ed6062a1..07bd911e989affbdf80e6a6cbcd33ea019f1da17 100644 (file)
@@ -31,7 +31,7 @@
 #include "pbd/enumwriter.h"
 #include "pbd/convert.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 namespace ARDOUR
 {
@@ -167,12 +167,16 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
        , _silence_end (s)
 
        , _normalize (false)
-       , _normalize_target (GAIN_COEFF_UNITY)
+       , _normalize_loudness (false)
+       , _normalize_dbfs (GAIN_COEFF_UNITY)
+       , _normalize_lufs (-23)
+       , _normalize_dbtp (-1)
        , _with_toc (false)
        , _with_cue (false)
        , _with_mp4chaps (false)
        , _soundcloud_upload (false)
        , _command ("")
+       , _analyse (true)
 {
        format_ids.insert (F_None);
        endiannesses.insert (E_FileDefault);
@@ -183,9 +187,31 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s)
 
 ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const & state)
        : session (s)
+
+       , has_sample_format (false)
+       , supports_tagging (false)
+       , _has_broadcast_info (false)
+       , _channel_limit (0)
+       , _dither_type (D_None)
+       , _src_quality (SRC_SincBest)
+       , _tag (true)
+
+       , _trim_beginning (false)
        , _silence_beginning (s)
+       , _trim_end (false)
        , _silence_end (s)
+
+       , _normalize (false)
+       , _normalize_loudness (false)
+       , _normalize_dbfs (GAIN_COEFF_UNITY)
+       , _normalize_lufs (-23)
+       , _normalize_dbtp (-1)
+       , _with_toc (false)
+       , _with_cue (false)
+       , _with_mp4chaps (false)
        , _soundcloud_upload (false)
+       , _command ("")
+       , _analyse (true)
 {
        _silence_beginning.type = Time::Timecode;
        _silence_end.type = Time::Timecode;
@@ -199,6 +225,7 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
        , _silence_beginning (other.session)
        , _silence_end (other.session)
        , _soundcloud_upload (false)
+       , _analyse (other._analyse)
 {
        if (modify_name) {
                set_name (other.name() + " (copy)");
@@ -225,7 +252,10 @@ ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification
        set_trim_beginning (other.trim_beginning());
        set_trim_end (other.trim_end());
        set_normalize (other.normalize());
-       set_normalize_target (other.normalize_target());
+       set_normalize_loudness (other.normalize_loudness());
+       set_normalize_dbfs (other.normalize_dbfs());
+       set_normalize_lufs (other.normalize_lufs());
+       set_normalize_dbtp (other.normalize_dbtp());
 
        set_tag (other.tag());
 
@@ -242,6 +272,7 @@ ExportFormatSpecification::~ExportFormatSpecification ()
 XMLNode &
 ExportFormatSpecification::get_state ()
 {
+       LocaleGuard lg;
        XMLNode * node;
        XMLNode * root = new XMLNode ("ExportFormatSpecification");
 
@@ -278,7 +309,10 @@ ExportFormatSpecification::get_state ()
 
        node = processing->add_child ("Normalize");
        node->add_property ("enabled", normalize() ? "true" : "false");
-       node->add_property ("target", to_string (normalize_target(), std::dec));
+       node->add_property ("loudness", normalize_loudness() ? "yes" : "no");
+       node->add_property ("dbfs", to_string (normalize_dbfs(), std::dec));
+       node->add_property ("lufs", to_string (normalize_lufs(), std::dec));
+       node->add_property ("dbtp", to_string (normalize_dbtp(), std::dec));
 
        XMLNode * silence = processing->add_child ("Silence");
        XMLNode * start = silence->add_child ("Start");
@@ -307,6 +341,7 @@ ExportFormatSpecification::set_state (const XMLNode & root)
        XMLProperty const * prop;
        XMLNode const * child;
        string value;
+       LocaleGuard lg;
 
        if ((prop = root.property ("name"))) {
                _name = prop->value();
@@ -404,8 +439,25 @@ ExportFormatSpecification::set_state (const XMLNode & root)
                        _normalize = (!prop->value().compare ("true"));
                }
 
+               // old formats before ~ 4.7-930ish
                if ((prop = child->property ("target"))) {
-                       _normalize_target = atof (prop->value());
+                       _normalize_dbfs = atof (prop->value());
+               }
+
+               if ((prop = child->property ("loudness"))) {
+                       _normalize_loudness = string_is_affirmative (prop->value());
+               }
+
+               if ((prop = child->property ("dbfs"))) {
+                       _normalize_dbfs = atof (prop->value());
+               }
+
+               if ((prop = child->property ("lufs"))) {
+                       _normalize_lufs = atof (prop->value());
+               }
+
+               if ((prop = child->property ("dbtp"))) {
+                       _normalize_dbtp = atof (prop->value());
                }
        }
 
@@ -553,7 +605,11 @@ ExportFormatSpecification::description (bool include_name)
        list<string> components;
 
        if (_normalize) {
-               components.push_back (_("normalize"));
+               if (_normalize_loudness) {
+                       components.push_back (_("normalize loudness"));
+               } else {
+                       components.push_back (_("normalize peak"));
+               }
        }
 
        if (_trim_beginning && _trim_end) {
@@ -646,7 +702,7 @@ ExportFormatSpecification::get_option (XMLNode const * node, std::string const &
        XMLNodeList list (node->children ("Option"));
 
        for (XMLNodeList::iterator it = list.begin(); it != list.end(); ++it) {
-               XMLProperty * prop = (*it)->property ("name");
+               XMLProperty const * prop = (*it)->property ("name");
                if (prop && !name.compare (prop->value())) {
                        prop = (*it)->property ("value");
                        if (prop) {