Add audio language configuration and pass it to libdcp.
authorCarl Hetherington <cth@carlh.net>
Wed, 23 Sep 2020 15:05:01 +0000 (17:05 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 23 Sep 2020 15:05:01 +0000 (17:05 +0200)
src/lib/film.cc
src/lib/film.h
src/lib/reel_writer.cc
src/wx/smpte_metadata_dialog.cc
src/wx/smpte_metadata_dialog.h

index 79ee20cfb791f03b2b402bebb398013bbd4d8ac7..ea0a2bdd7d7ab7059fe884a788bad37e84f6a59c 100644 (file)
@@ -166,6 +166,7 @@ Film::Film (optional<boost::filesystem::path> dir)
        , _user_explicit_container (false)
        , _user_explicit_resolution (false)
        , _name_language (dcp::LanguageTag("en-US"))
+       , _audio_language (dcp::LanguageTag("en-US"))
        , _release_territory (dcp::LanguageTag::RegionSubtag("US"))
        , _version_number (1)
        , _status (dcp::FINAL)
@@ -473,6 +474,7 @@ Film::metadata (bool with_content_paths) const
                root->add_child("ContentVersion")->add_child_text(i);
        }
        root->add_child("NameLanguage")->add_child_text(_name_language.to_string());
+       root->add_child("AudioLanguage")->add_child_text(_audio_language.to_string());
        root->add_child("ReleaseTerritory")->add_child_text(_release_territory.subtag());
        root->add_child("VersionNumber")->add_child_text(raw_convert<string>(_version_number));
        root->add_child("Status")->add_child_text(dcp::status_to_string(_status));
@@ -636,6 +638,10 @@ Film::read_metadata (optional<boost::filesystem::path> path)
        if (name_language) {
                _name_language = dcp::LanguageTag (*name_language);
        }
+       optional<string> audio_language = f.optional_string_child("AudioLanguage");
+       if (audio_language) {
+               _audio_language = dcp::LanguageTag (*audio_language);
+       }
        optional<string> release_territory = f.optional_string_child("ReleaseTerritory");
        if (release_territory) {
                _release_territory = dcp::LanguageTag::RegionSubtag (*release_territory);
@@ -1944,6 +1950,14 @@ Film::set_name_language (dcp::LanguageTag lang)
 }
 
 
+void
+Film::set_audio_language (dcp::LanguageTag lang)
+{
+       ChangeSignaller<Film> ch (this, AUDIO_LANGUAGE);
+       _audio_language = lang;
+}
+
+
 void
 Film::set_release_territory (dcp::LanguageTag::RegionSubtag region)
 {
index 1748057130ee8edbf8c1edfabe154873dd1303cc..66bcce80628830db9d977a1c4dcd3b42ecb7da7e 100644 (file)
@@ -233,6 +233,7 @@ public:
                RATINGS,
                CONTENT_VERSIONS,
                NAME_LANGUAGE,
+               AUDIO_LANGUAGE,
                RELEASE_TERRITORY,
                VERSION_NUMBER,
                STATUS,
@@ -343,6 +344,10 @@ public:
                return _name_language;
        }
 
+       dcp::LanguageTag audio_language () const {
+               return _audio_language;
+       }
+
        dcp::LanguageTag::RegionSubtag release_territory () const {
                return _release_territory;
        }
@@ -404,6 +409,7 @@ public:
        void set_ratings (std::vector<dcp::Rating> r);
        void set_content_versions (std::vector<std::string> v);
        void set_name_language (dcp::LanguageTag lang);
+       void set_audio_language (dcp::LanguageTag lang);
        void set_release_territory (dcp::LanguageTag::RegionSubtag region);
        void set_version_number (int v);
        void set_status (dcp::Status s);
@@ -506,6 +512,7 @@ private:
        std::vector<dcp::Rating> _ratings;
        std::vector<std::string> _content_versions;
        dcp::LanguageTag _name_language;
+       dcp::LanguageTag _audio_language;
        dcp::LanguageTag::RegionSubtag _release_territory;
        int _version_number;
        dcp::Status _status;
index f5f21f2eac92e5799a901370ecd44c394d654ee2..9272bfa30fedea9608826c03335828cf31109fde 100644 (file)
@@ -60,6 +60,7 @@ using std::string;
 using std::cout;
 using std::exception;
 using std::map;
+using std::vector;
 using boost::shared_ptr;
 using boost::optional;
 using boost::dynamic_pointer_cast;
@@ -155,7 +156,7 @@ ReelWriter::ReelWriter (
 
        if (_film->audio_channels ()) {
                _sound_asset.reset (
-                       new dcp::SoundAsset (dcp::Fraction (_film->video_frame_rate(), 1), _film->audio_frame_rate (), _film->audio_channels (), standard)
+                       new dcp::SoundAsset (dcp::Fraction(_film->video_frame_rate(), 1), _film->audio_frame_rate(), _film->audio_channels(), _film->audio_language(), standard)
                        );
 
                _sound_asset->set_metadata (mxf_metadata());
@@ -166,11 +167,17 @@ ReelWriter::ReelWriter (
 
                DCPOMATIC_ASSERT (_film->directory());
 
+               vector<dcp::Channel> active;
+               BOOST_FOREACH (int i, _film->mapped_audio_channels()) {
+                       active.push_back (static_cast<dcp::Channel>(i));
+               }
+
                /* Write the sound asset into the film directory so that we leave the creation
                   of the DCP directory until the last minute.
                */
                _sound_asset_writer = _sound_asset->start_write (
                        _film->directory().get() / audio_asset_filename (_sound_asset, _reel_index, _reel_count, _content_summary),
+                       active,
                        _film->contains_atmos_content()
                        );
        }
index 52796991d826a5f1a4af2f43da82afcfa808ff4a..6b567de75fbf326e1969bd715bff58b3251adcd2 100644 (file)
@@ -64,8 +64,6 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr<Film> weak_
        sizer->AddGrowableCol (1, 1);
 
        wxButton* edit_name_language = 0;
-       Button* edit_release_territory = 0;
-
        add_label_to_sizer(sizer, this, _("Title language"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
        {
                wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
@@ -77,6 +75,19 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr<Film> weak_
                sizer->Add (s, 0, wxEXPAND);
        }
 
+       wxButton* edit_audio_language = 0;
+       add_label_to_sizer(sizer, this, _("Audio language"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
+       {
+               wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+               _audio_language = new wxStaticText (this, wxID_ANY, wxT(""));
+               _audio_language->SetToolTip (_("The main language that is spoken in the film's soundtrack"));
+               s->Add (_audio_language, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_X_GAP);
+               edit_audio_language = new Button (this, _("Edit..."));
+               s->Add (edit_audio_language, 0, wxLEFT, DCPOMATIC_SIZER_GAP);
+               sizer->Add (s, 0, wxEXPAND);
+       }
+
+       Button* edit_release_territory = 0;
        add_label_to_sizer (sizer, this, _("Release territory"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL);
        {
                wxSizer* s = new wxBoxSizer (wxHORIZONTAL);
@@ -182,6 +193,7 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr<Film> weak_
        _luminance_unit->Append (_("foot lambert"));
 
        edit_name_language->Bind (wxEVT_BUTTON, boost::bind(&SMPTEMetadataDialog::edit_name_language, this));
+       edit_audio_language->Bind (wxEVT_BUTTON, boost::bind(&SMPTEMetadataDialog::edit_audio_language, this));
        edit_release_territory->Bind (wxEVT_BUTTON, boost::bind(&SMPTEMetadataDialog::edit_release_territory, this));
        _version_number->Bind (wxEVT_SPINCTRL, boost::bind(&SMPTEMetadataDialog::version_number_changed, this));
        _status->Bind (wxEVT_CHOICE, boost::bind(&SMPTEMetadataDialog::status_changed, this));
@@ -290,6 +302,16 @@ SMPTEMetadataDialog::edit_name_language ()
 }
 
 
+void
+SMPTEMetadataDialog::edit_audio_language ()
+{
+       LanguageTagDialog* d = new LanguageTagDialog(this, film()->audio_language());
+       d->ShowModal ();
+       film()->set_audio_language (d->get());
+       d->Destroy ();
+}
+
+
 void
 SMPTEMetadataDialog::edit_release_territory ()
 {
index 260d54de47d5019c262a9359e210e8ee04f066c3..4859002e1a8b50d097424e9270d6c263e316254e 100644 (file)
@@ -43,6 +43,7 @@ private:
        std::vector<std::string> content_versions () const;
        void set_content_versions (std::vector<std::string> v);
        void edit_name_language ();
+       void edit_audio_language ();
        void edit_release_territory ();
        void version_number_changed ();
        void status_changed ();
@@ -55,6 +56,7 @@ private:
 
        boost::weak_ptr<Film> _film;
        wxStaticText* _name_language;
+       wxStaticText* _audio_language;
        wxStaticText* _release_territory;
        wxSpinCtrl* _version_number;
        wxChoice* _status;