From 4d879e836147720bed8208f92d8d39bcbd661221 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 23 Nov 2022 01:05:41 +0100 Subject: [PATCH] Add default audio language configuration (#2375). --- src/lib/config.cc | 10 ++++++++++ src/lib/config.h | 13 +++++++++++++ src/lib/film.cc | 1 + src/wx/full_config_dialog.cc | 30 ++++++++++++++++++++++++++++++ src/wx/wx_util.cc | 19 +++++++++++++++++++ src/wx/wx_util.h | 3 +++ 6 files changed, 76 insertions(+) diff --git a/src/lib/config.cc b/src/lib/config.cc index 235bace7b..d44abdfbf 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -357,6 +357,12 @@ try _default_j2k_bandwidth = f.optional_number_child("DefaultJ2KBandwidth").get_value_or (200000000); _default_audio_delay = f.optional_number_child("DefaultAudioDelay").get_value_or (0); _default_interop = f.optional_bool_child("DefaultInterop").get_value_or (false); + try { + auto al = f.optional_string_child("DefaultAudioLanguage"); + if (al) { + _default_audio_language = dcp::LanguageTag(*al); + } + } catch (std::runtime_error&) {} for (auto const& i: f.node_children("DefaultMetadata")) { _default_metadata[i->string_attribute("key")] = i->content(); @@ -755,6 +761,10 @@ Config::write_config () const root->add_child("DefaultAudioDelay")->add_child_text (raw_convert (_default_audio_delay)); /* [XML] DefaultInterop 1 to default new films to Interop, 0 for SMPTE. */ root->add_child("DefaultInterop")->add_child_text (_default_interop ? "1" : "0"); + if (_default_audio_language) { + /* [XML] DefaultAudioLanguage Default audio language to use for new films */ + root->add_child("DefaultAudioLanguage")->add_child_text(_default_audio_language->to_string()); + } for (auto const& i: _default_metadata) { auto c = root->add_child("DefaultMetadata"); c->set_attribute("key", i.first); diff --git a/src/lib/config.h b/src/lib/config.h index c86622427..c6bf5986b 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -238,6 +238,10 @@ public: return _default_interop; } + boost::optional default_audio_language() const { + return _default_audio_language; + } + std::map default_metadata () const { return _default_metadata; } @@ -762,6 +766,14 @@ public: maybe_set (_default_interop, i); } + void set_default_audio_language(dcp::LanguageTag tag) { + maybe_set(_default_audio_language, tag); + } + + void unset_default_audio_language() { + maybe_set(_default_audio_language, boost::optional()); + } + void set_default_metadata (std::map const& metadata) { maybe_set (_default_metadata, metadata); } @@ -1292,6 +1304,7 @@ private: int _default_j2k_bandwidth; int _default_audio_delay; bool _default_interop; + boost::optional _default_audio_language; std::map _default_metadata; /** Default directory to offer to write KDMs to; if it's not set, the home directory will be offered. diff --git a/src/lib/film.cc b/src/lib/film.cc index 7d713c041..e021c0aa9 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -176,6 +176,7 @@ Film::Film (optional dir) , _name_language (dcp::LanguageTag("en-US")) , _version_number (1) , _status (dcp::Status::FINAL) + , _audio_language(Config::instance()->default_audio_language()) , _state_version (current_state_version) , _dirty (false) , _tolerant (false) diff --git a/src/wx/full_config_dialog.cc b/src/wx/full_config_dialog.cc index ba596162e..899445d42 100644 --- a/src/wx/full_config_dialog.cc +++ b/src/wx/full_config_dialog.cc @@ -35,6 +35,7 @@ #include "filter_dialog.h" #include "full_config_dialog.h" #include "kdm_choice.h" +#include "language_tag_widget.h" #include "make_chain_dialog.h" #include "nag_dialog.h" #include "name_format_editor.h" @@ -315,6 +316,11 @@ private: _standard = new wxChoice (_panel, wxID_ANY); table->Add (_standard); + _enable_audio_language = new CheckBox(_panel, _("Default audio language")); + table->Add(_enable_audio_language, 1, wxEXPAND | wxALIGN_CENTRE_VERTICAL); + _audio_language = new LanguageTagWidget(_panel, _("Default audio language to use for new DCPs"), Config::instance()->default_audio_language(), wxString("cmnr-Hant-")); + table->Add(_audio_language->sizer()); + table->Add (_enable_metadata["facility"] = new CheckBox (_panel, _("Default facility")), 0, wxALIGN_CENTRE_VERTICAL); table->Add (_metadata["facility"] = new wxTextCtrl (_panel, wxID_ANY, wxT("")), 0, wxEXPAND); @@ -391,6 +397,9 @@ private: for (auto const& i: _metadata) { i.second->Bind (wxEVT_TEXT, boost::bind(&DefaultsPage::metadata_changed, this)); } + + _enable_audio_language->bind(&DefaultsPage::enable_audio_language_toggled, this); + _audio_language->Changed.connect(boost::bind(&DefaultsPage::audio_language_changed, this)); } void config_changed () override @@ -414,6 +423,9 @@ private: checked_set (_dcp_audio_channels, locale_convert (config->default_dcp_audio_channels())); checked_set (_audio_delay, config->default_audio_delay ()); checked_set (_standard, config->default_interop() ? 1 : 0); + auto dal = config->default_audio_language(); + checked_set(_enable_audio_language, static_cast(dal)); + checked_set(_audio_language, dal ? dal : boost::none); auto metadata = config->default_metadata(); @@ -547,8 +559,24 @@ private: setup_sensitivity (); } + void enable_audio_language_toggled() + { + setup_sensitivity(); + audio_language_changed(); + } + + void audio_language_changed() + { + if (_enable_audio_language->get()) { + Config::instance()->set_default_audio_language(_audio_language->get().get_value_or(dcp::LanguageTag("en-US"))); + } else { + Config::instance()->unset_default_audio_language(); + } + } + void setup_sensitivity () { + _audio_language->enable(_enable_audio_language->get()); for (auto const& i: _enable_metadata) { _metadata[i.first]->Enable(i.second->GetValue()); } @@ -571,6 +599,8 @@ private: wxChoice* _dcp_content_type; wxChoice* _dcp_audio_channels; wxChoice* _standard; + CheckBox* _enable_audio_language; + LanguageTagWidget* _audio_language; map _enable_metadata; map _metadata; }; diff --git a/src/wx/wx_util.cc b/src/wx/wx_util.cc index 074f47d61..ee6663101 100644 --- a/src/wx/wx_util.cc +++ b/src/wx/wx_util.cc @@ -25,6 +25,7 @@ #include "file_picker_ctrl.h" +#include "language_tag_widget.h" #include "password_entry.h" #include "static_text.h" #include "wx_util.h" @@ -383,6 +384,24 @@ checked_set (wxRadioButton* widget, bool value) } +void +checked_set(LanguageTagWidget* widget, dcp::LanguageTag value) +{ + if (widget->get() != value) { + widget->set(value); + } +} + + +void +checked_set(LanguageTagWidget* widget, optional value) +{ + if (widget->get() != value) { + widget->set(value); + } +} + + void dcpomatic_setup_i18n () { diff --git a/src/wx/wx_util.h b/src/wx/wx_util.h index 50fb7268f..fd87e04d9 100644 --- a/src/wx/wx_util.h +++ b/src/wx/wx_util.h @@ -40,6 +40,7 @@ LIBDCP_ENABLE_WARNINGS class FilePickerCtrl; +class LanguageTagWidget; class wxDirPickerCtrl; class wxSpinCtrl; class wxSpinCtrlDouble; @@ -156,6 +157,8 @@ extern void checked_set (wxCheckBox* widget, bool value); extern void checked_set (wxRadioButton* widget, bool value); extern void checked_set (wxStaticText* widget, std::string value); extern void checked_set (wxStaticText* widget, wxString value); +extern void checked_set(LanguageTagWidget* widget, dcp::LanguageTag value); +extern void checked_set(LanguageTagWidget* widget, boost::optional value); extern int wx_get (wxChoice* widget); extern int wx_get (wxSpinCtrl* widget); -- 2.30.2