C++11 tidying.
[dcpomatic.git] / src / lib / film.cc
index 0b717738d09bfacd7198b870003869123dd7edb7..44c49220b94f6836935d132341dc7ff7d23aabe8 100644 (file)
@@ -505,6 +505,9 @@ Film::metadata (bool with_content_paths) const
        }
        root->add_child("UserExplicitContainer")->add_child_text(_user_explicit_container ? "1" : "0");
        root->add_child("UserExplicitResolution")->add_child_text(_user_explicit_resolution ? "1" : "0");
+       if (_audio_language) {
+               root->add_child("AudioLanguage")->add_child_text(_audio_language->to_string());
+       }
        _playlist->as_xml (root->add_child ("Playlist"), with_content_paths);
 
        return doc;
@@ -685,6 +688,11 @@ Film::read_metadata (optional<boost::filesystem::path> path)
        _user_explicit_container = f.optional_bool_child("UserExplicitContainer").get_value_or(true);
        _user_explicit_resolution = f.optional_bool_child("UserExplicitResolution").get_value_or(true);
 
+       auto audio_language = f.optional_string_child("AudioLanguage");
+       if (audio_language) {
+               _audio_language = dcp::LanguageTag(*audio_language);
+       }
+
        list<string> notes;
        _playlist->set_from_xml (shared_from_this(), f.node_child ("Playlist"), _state_version, notes);
 
@@ -760,23 +768,6 @@ Film::mapped_audio_channels () const
 }
 
 
-vector<dcp::LanguageTag>
-Film::audio_languages () const
-{
-       vector<dcp::LanguageTag> result;
-       for (auto i: content()) {
-               if (i->audio && !i->audio->mapping().mapped_output_channels().empty() && i->audio->language()) {
-                       result.push_back (i->audio->language().get());
-               }
-       }
-
-       std::sort (result.begin(), result.end());
-       auto last = std::unique (result.begin(), result.end());
-       result.erase (last, result.end());
-       return result;
-}
-
-
 pair<optional<dcp::LanguageTag>, vector<dcp::LanguageTag>>
 Film::subtitle_languages () const
 {
@@ -911,23 +902,18 @@ Film::isdcf_name (bool if_created_now) const
 
        /* Interior aspect ratio.  The standard says we don't do this for trailers, for some strange reason */
        if (dcp_content_type() && dcp_content_type()->libdcp_kind() != dcp::ContentKind::TRAILER) {
-               Ratio const* content_ratio = nullptr;
-               for (auto i: content ()) {
-                       if (i->video) {
-                               /* Here's the first piece of video content */
-                               content_ratio = Ratio::nearest_from_ratio(i->video->scaled_size(frame_size()).ratio());
-                               break;
+               auto cl = content();
+               auto first_video = std::find_if(cl.begin(), cl.end(), [](shared_ptr<Content> c) { return static_cast<bool>(c->video); });
+               if (first_video != cl.end()) {
+                       auto first_ratio = lrintf((*first_video)->video->scaled_size(frame_size()).ratio() * 100);
+                       auto container_ratio = lrintf(container()->ratio() * 100);
+                       if (first_ratio != container_ratio) {
+                               d += "-" + dcp::raw_convert<string>(first_ratio);
                        }
                }
-
-               if (content_ratio && content_ratio != container()) {
-                       /* This needs to be the numeric version of the ratio, and ::id() is close enough */
-                       d += "-" + content_ratio->id();
-               }
        }
 
-       auto audio_langs = audio_languages();
-       auto audio_language = (audio_langs.empty() || !audio_langs.front().language()) ? "XX" : audio_langs.front().language()->subtag();
+       auto audio_language = (_audio_language && _audio_language->language()) ? _audio_language->language()->subtag() : "XX";
 
        d += "_" + to_upper (audio_language);
 
@@ -2151,3 +2137,11 @@ Film::set_two_d_version_of_three_d (bool t)
        _two_d_version_of_three_d = t;
 }
 
+
+void
+Film::set_audio_language (optional<dcp::LanguageTag> language)
+{
+       FilmChangeSignaller ch (this, Property::AUDIO_LANGUAGE);
+       _audio_language = language;
+}
+