X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Fexport_format_specification.cc;h=07bd911e989affbdf80e6a6cbcd33ea019f1da17;hb=c8c6bca6587450ff64303dbc994a4cd28d6ce7aa;hp=619c50b9f98f33a10302403094b9b7329a8f6495;hpb=7468fdb9ca9892cec9b298690bf0edf3655d6453;p=ardour.git diff --git a/libs/ardour/export_format_specification.cc b/libs/ardour/export_format_specification.cc index 619c50b9f9..07bd911e98 100644 --- a/libs/ardour/export_format_specification.cc +++ b/libs/ardour/export_format_specification.cc @@ -31,13 +31,14 @@ #include "pbd/enumwriter.h" #include "pbd/convert.h" -#include "i18n.h" +#include "pbd/i18n.h" namespace ARDOUR { using namespace PBD; using std::string; +using std::list; ExportFormatSpecification::Time & ExportFormatSpecification::Time::operator= (AnyTime const & other) @@ -166,7 +167,16 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s) , _silence_end (s) , _normalize (false) - , _normalize_target (1.0) + , _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); @@ -177,8 +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; @@ -186,13 +219,19 @@ ExportFormatSpecification::ExportFormatSpecification (Session & s, XMLNode const set_state (state); } -ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification const & other) +ExportFormatSpecification::ExportFormatSpecification (ExportFormatSpecification const & other, bool modify_name) : ExportFormatBase(other) , session (other.session) , _silence_beginning (other.session) , _silence_end (other.session) + , _soundcloud_upload (false) + , _analyse (other._analyse) { - set_name (other.name() + " (copy)"); + if (modify_name) { + set_name (other.name() + " (copy)"); + } else { + set_name (other.name()); + } _format_name = other._format_name; has_sample_format = other.has_sample_format; @@ -213,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()); @@ -230,11 +272,16 @@ ExportFormatSpecification::~ExportFormatSpecification () XMLNode & ExportFormatSpecification::get_state () { + LocaleGuard lg; XMLNode * node; XMLNode * root = new XMLNode ("ExportFormatSpecification"); root->add_property ("name", _name); root->add_property ("id", _id.to_s()); + root->add_property ("with-cue", _with_cue ? "true" : "false"); + root->add_property ("with-toc", _with_toc ? "true" : "false"); + root->add_property ("with-mp4chaps", _with_mp4chaps ? "true" : "false"); + root->add_property ("command", _command); node = root->add_child ("Encoding"); node->add_property ("id", enum_2_string (format_id())); @@ -262,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"); @@ -291,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(); @@ -300,6 +351,30 @@ ExportFormatSpecification::set_state (const XMLNode & root) _id = prop->value(); } + if ((prop = root.property ("with-cue"))) { + _with_cue = string_is_affirmative (prop->value()); + } else { + _with_cue = false; + } + + if ((prop = root.property ("with-toc"))) { + _with_toc = string_is_affirmative (prop->value()); + } else { + _with_toc = false; + } + + if ((prop = root.property ("with-mp4chaps"))) { + _with_mp4chaps = string_is_affirmative (prop->value()); + } else { + _with_mp4chaps = false; + } + + if ((prop = root.property ("command"))) { + _command = prop->value(); + } else { + _command = ""; + } + /* Encoding and SRC */ if ((child = root.child ("Encoding"))) { @@ -320,7 +395,11 @@ ExportFormatSpecification::set_state (const XMLNode & root) } if ((prop = child->property ("has-sample-format"))) { - has_sample_format = !prop->value().compare ("true"); + has_sample_format = string_is_affirmative (prop->value()); + } + + if ((prop = child->property ("has-sample-format"))) { + has_sample_format = string_is_affirmative (prop->value()); } if ((prop = child->property ("channel-limit"))) { @@ -360,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()); } } @@ -504,56 +600,91 @@ ExportFormatSpecification::set_format (boost::shared_ptr format) } string -ExportFormatSpecification::description () +ExportFormatSpecification::description (bool include_name) { - string desc; - - desc = _name + ": "; + list components; if (_normalize) { - desc += _("normalize, "); + if (_normalize_loudness) { + components.push_back (_("normalize loudness")); + } else { + components.push_back (_("normalize peak")); + } } if (_trim_beginning && _trim_end) { - desc += _("trim, "); + components.push_back ( _("trim")); } else if (_trim_beginning) { - desc += _("trim start, "); + components.push_back (_("trim start")); } else if (_trim_end) { - desc += _("trim end, "); + components.push_back (_("trim end")); } - desc += _format_name + ", "; + if (_format_name != "") { + components.push_back (_format_name); + } if (has_sample_format) { - desc += HasSampleFormat::get_sample_format_name (sample_format()) + ", "; + components.push_back (HasSampleFormat::get_sample_format_name (sample_format())); } switch (sample_rate()) { - case SR_22_05: - desc += "22,5 kHz"; + case SR_8: + components.push_back ("8 kHz"); break; - case SR_44_1: - desc += "44,1 kHz"; + case SR_22_05: + components.push_back ("22,5 kHz"); break; - case SR_48: - desc += "48 kHz"; + case SR_44_1: + components.push_back ("44,1 kHz"); break; - case SR_88_2: - desc += "88,2 kHz"; + case SR_48: + components.push_back ("48 kHz"); break; - case SR_96: - desc += "96 kHz"; + case SR_88_2: + components.push_back ("88,2 kHz"); break; - case SR_192: - desc += "192 kHz"; + case SR_96: + components.push_back ("96 kHz"); break; - case SR_Session: - desc += _("Session rate"); + case SR_176_4: + components.push_back ("176.4 kHz"); break; - case SR_None: + case SR_192: + components.push_back ("192 kHz"); break; + case SR_Session: + components.push_back (_("Session rate")); + break; + case SR_None: + break; + } + + if (_with_toc) { + components.push_back ("TOC"); + } + + if (_with_cue) { + components.push_back ("CUE"); + } + + if (_with_mp4chaps) { + components.push_back ("MP4ch"); + } + + if (!_command.empty()) { + components.push_back ("+"); } + string desc; + if (include_name) { + desc = _name + ": "; + } + + for (list::const_iterator it = components.begin(); it != components.end(); ++it) { + if (it != components.begin()) { desc += ", "; } + desc += *it; + } return desc; } @@ -571,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) {