X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fconfig.cc;h=cb2ec8885569daf56736690c70b52b6f5b725905;hp=0de19f70f866d8214529033ebd2e5534e10bf6ac;hb=f706bbb9afd10472e81a051cd5db601d6404377c;hpb=450602739388811a6378314d6c309b99f7b28b60 diff --git a/src/lib/config.cc b/src/lib/config.cc index 0de19f70f..cb2ec8885 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2021 Carl Hetherington + Copyright (C) 2012-2022 Carl Hetherington This file is part of DCP-o-matic. @@ -18,21 +18,22 @@ */ + +#include "cinema.h" +#include "colour_conversion.h" +#include "compose.hpp" #include "config.h" +#include "cross.h" +#include "crypto.h" +#include "dcp_content_type.h" +#include "dkdm_recipient.h" +#include "dkdm_wrapper.h" +#include "film.h" #include "filter.h" +#include "log.h" #include "ratio.h" #include "types.h" -#include "log.h" -#include "dcp_content_type.h" -#include "colour_conversion.h" -#include "cinema.h" #include "util.h" -#include "cross.h" -#include "film.h" -#include "dkdm_wrapper.h" -#include "compose.hpp" -#include "crypto.h" -#include "dkdm_recipient.h" #include "zipper.h" #include #include @@ -49,31 +50,36 @@ #include "i18n.h" -using std::vector; + using std::cout; +using std::dynamic_pointer_cast; using std::ifstream; -using std::string; using std::list; -using std::min; +using std::make_shared; using std::max; +using std::min; using std::remove; using std::shared_ptr; -using std::make_shared; -using boost::optional; -using std::dynamic_pointer_cast; +using std::string; +using std::vector; using boost::algorithm::trim; +using boost::optional; using dcp::raw_convert; + Config* Config::_instance = 0; int const Config::_current_version = 3; boost::signals2::signal Config::FailedToLoad; boost::signals2::signal Config::Warning; boost::signals2::signal Config::Bad; + /** Construct default configuration */ Config::Config () /* DKDMs are not considered a thing to reset on set_defaults() */ : _dkdms (new DKDMGroup ("root")) + , _default_kdm_duration (1, RoughDuration::Unit::WEEKS) + , _export(this) { set_defaults (); } @@ -94,6 +100,8 @@ Config::set_defaults () _tms_password = ""; _allow_any_dcp_frame_rate = false; _allow_any_container = false; + _allow_96khz_audio = false; + _use_all_audio_channels = false; _show_experimental_audio_processors = false; _language = optional (); _default_still_length = 10; @@ -180,6 +188,12 @@ Config::set_defaults () _custom_languages.clear (); _add_files_path = boost::none; _use_isdcf_name_by_default = true; + _write_kdms_to_disk = true; + _email_kdms = false; + _default_kdm_type = dcp::Formulation::MODIFIED_TRANSITIONAL_1; + _default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS); + _auto_crop_threshold = 0.1; + _last_release_notes_version = boost::none; _allowed_dcp_frame_rates.clear (); _allowed_dcp_frame_rates.push_back (24); @@ -192,6 +206,8 @@ Config::set_defaults () set_kdm_email_to_default (); set_notification_email_to_default (); set_cover_sheet_to_default (); + + _export.set_defaults(); } void @@ -399,6 +415,8 @@ try _maximum_j2k_bandwidth = f.optional_number_child ("MaximumJ2KBandwidth").get_value_or (250000000); _allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate").get_value_or (false); _allow_any_container = f.optional_bool_child ("AllowAnyContainer").get_value_or (false); + _allow_96khz_audio = f.optional_bool_child("Allow96kHzAudio").get_value_or(false); + _use_all_audio_channels = f.optional_bool_child("UseAllAudioChannels").get_value_or(false); _show_experimental_audio_processors = f.optional_bool_child ("ShowExperimentalAudioProcessors").get_value_or (false); _log_types = f.optional_number_child ("LogTypes").get_value_or (LogEntry::TYPE_GENERAL | LogEntry::TYPE_WARNING | LogEntry::TYPE_ERROR); @@ -474,7 +492,7 @@ try _dkdms = dynamic_pointer_cast (DKDMBase::read (f.node_child("DKDMGroup"))); } else { /* Old-style: one or more DKDM nodes */ - _dkdms.reset (new DKDMGroup ("root")); + _dkdms = make_shared("root"); for (auto i: f.node_children("DKDM")) { _dkdms->add (DKDMBase::read (i)); } @@ -567,6 +585,18 @@ try _add_files_path = f.optional_string_child("AddFilesPath"); _use_isdcf_name_by_default = f.optional_bool_child("UseISDCFNameByDefault").get_value_or(true); + _write_kdms_to_disk = f.optional_bool_child("WriteKDMsToDisk").get_value_or(true); + _email_kdms = f.optional_bool_child("EmailKDMs").get_value_or(false); + _default_kdm_type = dcp::string_to_formulation(f.optional_string_child("DefaultKDMType").get_value_or("modified-transitional-1")); + if (auto duration = f.optional_node_child("DefaultKDMDuration")) { + _default_kdm_duration = RoughDuration(duration); + } else { + _default_kdm_duration = RoughDuration(1, RoughDuration::Unit::WEEKS); + } + _auto_crop_threshold = f.optional_number_child("AutoCropThreshold").get_value_or(0.1); + _last_release_notes_version = f.optional_string_child("LastReleaseNotesVersion"); + + _export.read(f.optional_node_child("Export")); if (boost::filesystem::exists (_cinemas_file)) { cxml::Document f ("Cinemas"); @@ -598,7 +628,7 @@ catch (...) { Config * Config::instance () { - if (_instance == 0) { + if (_instance == nullptr) { _instance = new Config; _instance->read (); } @@ -711,6 +741,7 @@ Config::write_config () const /* [XML:opt] DefaultKDMDirectory Default directory to write KDMs to. */ root->add_child("DefaultKDMDirectory")->add_child_text (_default_kdm_directory->string ()); } + _default_kdm_duration.as_xml(root->add_child("DefaultKDMDuration")); /* [XML] MailServer Hostname of SMTP server to use. */ root->add_child("MailServer")->add_child_text (_mail_server); /* [XML] MailPort Port number to use on SMTP server. */ @@ -774,6 +805,10 @@ Config::write_config () const root->add_child("AllowAnyDCPFrameRate")->add_child_text (_allow_any_dcp_frame_rate ? "1" : "0"); /* [XML] AllowAnyContainer 1 to allow users to user any container ratio for their DCP, 0 to limit the GUI to DCI Flat/Scope */ root->add_child("AllowAnyContainer")->add_child_text (_allow_any_container ? "1" : "0"); + /* [XML] Allow96kHzAudio 1 to allow users to make DCPs with 96kHz audio, 0 to always make 48kHz DCPs */ + root->add_child("Allow96kHzAudio")->add_child_text(_allow_96khz_audio ? "1" : "0"); + /* [XML] UseAllAudioChannels 1 to allow users to map audio to all 16 DCP channels, 0 to limit to the channels used in standard DCPs */ + root->add_child("UseAllAudioChannels")->add_child_text(_use_all_audio_channels ? "1" : "0"); /* [XML] ShowExperimentalAudioProcessors 1 to offer users the (experimental) audio upmixer processors, 0 to hide them */ root->add_child("ShowExperimentalAudioProcessors")->add_child_text (_show_experimental_audio_processors ? "1" : "0"); /* [XML] LogTypes Types of logging to write; a bitfield where 1 is general notes, 2 warnings, 4 errors, 8 debug information related @@ -997,18 +1032,27 @@ Config::write_config () const root->add_child("AddFilesPath")->add_child_text(_add_files_path->string()); } root->add_child("UseISDCFNameByDefault")->add_child_text(_use_isdcf_name_by_default ? "1" : "0"); + root->add_child("WriteKDMsToDisk")->add_child_text(_write_kdms_to_disk ? "1" : "0"); + root->add_child("EmailKDMs")->add_child_text(_email_kdms ? "1" : "0"); + root->add_child("DefaultKDMType")->add_child_text(dcp::formulation_to_string(_default_kdm_type)); + root->add_child("AutoCropThreshold")->add_child_text(raw_convert(_auto_crop_threshold)); + if (_last_release_notes_version) { + root->add_child("LastReleaseNotesVersion")->add_child_text(*_last_release_notes_version); + } + + _export.write(root->add_child("Export")); auto target = config_write_file(); try { auto const s = doc.write_to_string_formatted (); boost::filesystem::path tmp (string(target.string()).append(".tmp")); - auto f = fopen_boost (tmp, "w"); + dcp::File f(tmp, "w"); if (!f) { throw FileError (_("Could not open file for writing"), tmp); } - checked_fwrite (s.c_str(), s.bytes(), f, tmp); - fclose (f); + f.checked_write(s.c_str(), s.bytes()); + f.close(); boost::filesystem::remove (target); boost::filesystem::rename (tmp, target); } catch (xmlpp::exception& e) { @@ -1142,6 +1186,7 @@ Config::set_cover_sheet_to_default () { _cover_sheet = _( "$CPL_NAME\n\n" + "CPL Filename: $CPL_FILENAME\n" "Type: $TYPE\n" "Format: $CONTAINER\n" "Audio: $AUDIO\n" @@ -1255,7 +1300,7 @@ Config::read_dkdm_recipients (cxml::Document const & f) { _dkdm_recipients.clear (); for (auto i: f.node_children("DKDMRecipient")) { - _dkdm_recipients.push_back (shared_ptr(new DKDMRecipient(i))); + _dkdm_recipients.push_back (make_shared(i)); } } @@ -1387,13 +1432,8 @@ Config::copy_and_link (boost::filesystem::path new_file) const bool Config::have_write_permission () const { - auto f = fopen_boost (config_write_file(), "r+"); - if (!f) { - return false; - } - - fclose (f); - return true; + dcp::File f(config_write_file(), "r+"); + return static_cast(f); } /** @param output_channels Number of output channels in use.