Add default audio language configuration (#2375).
authorCarl Hetherington <cth@carlh.net>
Wed, 23 Nov 2022 00:05:41 +0000 (01:05 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 28 Nov 2022 23:15:02 +0000 (00:15 +0100)
src/lib/config.cc
src/lib/config.h
src/lib/film.cc
src/wx/full_config_dialog.cc
src/wx/wx_util.cc
src/wx/wx_util.h

index 235bace7b78f6b9c62cc30e450ee9c0a233c747e..d44abdfbf7685dc0d2641cc0ad105ef5c8854ab7 100644 (file)
@@ -357,6 +357,12 @@ try
        _default_j2k_bandwidth = f.optional_number_child<int>("DefaultJ2KBandwidth").get_value_or (200000000);
        _default_audio_delay = f.optional_number_child<int>("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<string> (_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);
index c86622427360ee2833e9c7ad129dab56cbbb43ec..c6bf5986bc7626de1bbbf37aec4ec26755b9d645 100644 (file)
@@ -238,6 +238,10 @@ public:
                return _default_interop;
        }
 
+       boost::optional<dcp::LanguageTag> default_audio_language() const {
+               return _default_audio_language;
+       }
+
        std::map<std::string, std::string> 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<dcp::LanguageTag>());
+       }
+
        void set_default_metadata (std::map<std::string, std::string> 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<dcp::LanguageTag> _default_audio_language;
        std::map<std::string, std::string> _default_metadata;
        /** Default directory to offer to write KDMs to; if it's not set,
            the home directory will be offered.
index 7d713c0411ec22fd26b0199328532056c4c1ebd5..e021c0aa91801949a980d85242b7b2af96f7e8bd 100644 (file)
@@ -176,6 +176,7 @@ Film::Film (optional<boost::filesystem::path> 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)
index ba596162ec6c432dabe10838e8122c1dfe5b80e2..899445d4219867d3108c9bde63ee7e6565ea2114 100644 (file)
@@ -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<string> (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<bool>(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<string, CheckBox*> _enable_metadata;
        map<string, wxTextCtrl*> _metadata;
 };
index 074f47d61bebd2a61ff77ee4d76bbe730ee7aff5..ee666310199754184c89c014634f28a9499b77b1 100644 (file)
@@ -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<dcp::LanguageTag> value)
+{
+       if (widget->get() != value) {
+               widget->set(value);
+       }
+}
+
+
 void
 dcpomatic_setup_i18n ()
 {
index 50fb7268f9d0724314276e98c51869132d0dcc75..fd87e04d9a8d38783242881b4562fee6be7fcced 100644 (file)
@@ -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<dcp::LanguageTag> value);
 
 extern int wx_get (wxChoice* widget);
 extern int wx_get (wxSpinCtrl* widget);