From 4f4a86fb43b00d251e44a7f4463fcb390c605212 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 23 Sep 2020 17:05:01 +0200 Subject: [PATCH] Add audio language configuration and pass it to libdcp. --- src/lib/film.cc | 14 ++++++++++++++ src/lib/film.h | 7 +++++++ src/lib/reel_writer.cc | 9 ++++++++- src/wx/smpte_metadata_dialog.cc | 26 ++++++++++++++++++++++++-- src/wx/smpte_metadata_dialog.h | 2 ++ 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/lib/film.cc b/src/lib/film.cc index 79ee20cfb..ea0a2bdd7 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -166,6 +166,7 @@ Film::Film (optional 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(_version_number)); root->add_child("Status")->add_child_text(dcp::status_to_string(_status)); @@ -636,6 +638,10 @@ Film::read_metadata (optional path) if (name_language) { _name_language = dcp::LanguageTag (*name_language); } + optional audio_language = f.optional_string_child("AudioLanguage"); + if (audio_language) { + _audio_language = dcp::LanguageTag (*audio_language); + } optional 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 ch (this, AUDIO_LANGUAGE); + _audio_language = lang; +} + + void Film::set_release_territory (dcp::LanguageTag::RegionSubtag region) { diff --git a/src/lib/film.h b/src/lib/film.h index 174805713..66bcce806 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -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 r); void set_content_versions (std::vector 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 _ratings; std::vector _content_versions; dcp::LanguageTag _name_language; + dcp::LanguageTag _audio_language; dcp::LanguageTag::RegionSubtag _release_territory; int _version_number; dcp::Status _status; diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index f5f21f2ea..9272bfa30 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -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 active; + BOOST_FOREACH (int i, _film->mapped_audio_channels()) { + active.push_back (static_cast(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() ); } diff --git a/src/wx/smpte_metadata_dialog.cc b/src/wx/smpte_metadata_dialog.cc index 52796991d..6b567de75 100644 --- a/src/wx/smpte_metadata_dialog.cc +++ b/src/wx/smpte_metadata_dialog.cc @@ -64,8 +64,6 @@ SMPTEMetadataDialog::SMPTEMetadataDialog (wxWindow* parent, weak_ptr 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 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 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 () { diff --git a/src/wx/smpte_metadata_dialog.h b/src/wx/smpte_metadata_dialog.h index 260d54de4..4859002e1 100644 --- a/src/wx/smpte_metadata_dialog.h +++ b/src/wx/smpte_metadata_dialog.h @@ -43,6 +43,7 @@ private: std::vector content_versions () const; void set_content_versions (std::vector 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; wxStaticText* _name_language; + wxStaticText* _audio_language; wxStaticText* _release_territory; wxSpinCtrl* _version_number; wxChoice* _status; -- 2.30.2