/*
- Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
This file is part of DCP-o-matic.
#include "dcpomatic_button.h"
#include "audio_mapping_view.h"
#include <dcp/raw_convert.h>
-#include <iostream>
-using std::string;
-using std::vector;
-using std::pair;
+
+using std::function;
using std::make_pair;
+using std::make_shared;
using std::map;
+using std::pair;
+using std::shared_ptr;
+using std::string;
+using std::vector;
using boost::bind;
using boost::optional;
-using boost::shared_ptr;
-using boost::function;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
+
static
bool
Page::create_window (wxWindow* parent)
{
_panel = new wxPanel (parent, wxID_ANY, wxDefaultPosition, _panel_size);
- wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
+ auto s = new wxBoxSizer (wxVERTICAL);
_panel->SetSizer (s);
setup ();
_set_language = new CheckBox (_panel, _("Set language"));
table->Add (_set_language, wxGBPosition (r, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
_language = new wxChoice (_panel, wxID_ANY);
- vector<pair<string, string> > languages;
- languages.push_back (make_pair ("Čeština", "cs_CZ"));
- languages.push_back (make_pair ("汉语/漢語", "zh_CN"));
- languages.push_back (make_pair ("Dansk", "da_DK"));
- languages.push_back (make_pair ("Deutsch", "de_DE"));
- languages.push_back (make_pair ("English", "en_GB"));
- languages.push_back (make_pair ("Español", "es_ES"));
- languages.push_back (make_pair ("Français", "fr_FR"));
- languages.push_back (make_pair ("Italiano", "it_IT"));
- languages.push_back (make_pair ("Nederlands", "nl_NL"));
- languages.push_back (make_pair ("Русский", "ru_RU"));
- languages.push_back (make_pair ("Polski", "pl_PL"));
- languages.push_back (make_pair ("Português europeu", "pt_PT"));
- languages.push_back (make_pair ("Português do Brasil", "pt_BR"));
- languages.push_back (make_pair ("Svenska", "sv_SE"));
- languages.push_back (make_pair ("Slovenský jazyk", "sk_SK"));
- languages.push_back (make_pair ("Türkçe", "tr_TR"));
- languages.push_back (make_pair ("українська мова", "uk_UA"));
+ vector<pair<string, string>> languages;
+ languages.push_back (make_pair("Čeština", "cs_CZ"));
+ languages.push_back (make_pair("汉语/漢語", "zh_CN"));
+ languages.push_back (make_pair("Dansk", "da_DK"));
+ languages.push_back (make_pair("Deutsch", "de_DE"));
+ languages.push_back (make_pair("English", "en_GB"));
+ languages.push_back (make_pair("Español", "es_ES"));
+ languages.push_back (make_pair("Français", "fr_FR"));
+ languages.push_back (make_pair("Italiano", "it_IT"));
+ languages.push_back (make_pair("Nederlands", "nl_NL"));
+ languages.push_back (make_pair("Русский", "ru_RU"));
+ languages.push_back (make_pair("Polski", "pl_PL"));
+ languages.push_back (make_pair("Português europeu", "pt_PT"));
+ languages.push_back (make_pair("Português do Brasil", "pt_BR"));
+ languages.push_back (make_pair("Svenska", "sv_SE"));
+ languages.push_back (make_pair("Slovenský jazyk", "sk_SK"));
+ // languages.push_back (make_pair("Türkçe", "tr_TR"));
+ languages.push_back (make_pair("українська мова", "uk_UA"));
checked_set (_language, languages);
table->Add (_language, wxGBPosition (r, 1));
++r;
- wxStaticText* restart = add_label_to_sizer (
+ auto restart = add_label_to_sizer (
table, _panel, _("(restart DCP-o-matic to see language changes)"), false, wxGBPosition (r, 0), wxGBSpan (1, 2)
);
wxFont font = restart->GetFont();
void
GeneralPage::config_changed ()
{
- Config* config = Config::instance ();
+ auto config = Config::instance ();
checked_set (_set_language, static_cast<bool>(config->language()));
compat_map["cs"] = "cs_CZ";
compat_map["uk"] = "uk_UA";
- string lang = config->language().get_value_or ("en_GB");
- if (compat_map.find (lang) != compat_map.end ()) {
+ auto lang = config->language().get_value_or("en_GB");
+ if (compat_map.find(lang) != compat_map.end ()) {
lang = compat_map[lang];
}
{
_sizer = new wxBoxSizer (wxVERTICAL);
- wxBoxSizer* certificates_sizer = new wxBoxSizer (wxHORIZONTAL);
+ auto certificates_sizer = new wxBoxSizer (wxHORIZONTAL);
_sizer->Add (certificates_sizer, 0, wxALL, border);
_certificates = new wxListCtrl (this, wxID_ANY, wxDefaultPosition, wxSize (440, 150), wxLC_REPORT | wxLC_SINGLE_SEL);
certificates_sizer->Add (_certificates, 1, wxEXPAND);
{
- wxSizer* s = new wxBoxSizer (wxVERTICAL);
+ auto s = new wxBoxSizer (wxVERTICAL);
_add_certificate = new Button (this, _("Add..."));
s->Add (_add_certificate, 1, wxTOP | wxBOTTOM | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
_remove_certificate = new Button (this, _("Remove"));
certificates_sizer->Add (s, 0, wxLEFT, DCPOMATIC_SIZER_X_GAP);
}
- wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ auto table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
_sizer->Add (table, 1, wxALL | wxEXPAND, border);
int r = 0;
_import_private_key->Bind (wxEVT_BUTTON, bind (&CertificateChainEditor::import_private_key, this));
_export_private_key->Bind (wxEVT_BUTTON, bind (&CertificateChainEditor::export_private_key, this));
- wxSizer* buttons = CreateSeparatedButtonSizer (wxCLOSE);
+ auto buttons = CreateSeparatedButtonSizer (wxCLOSE);
if (buttons) {
_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
}
void
CertificateChainEditor::add_certificate ()
{
- wxFileDialog* d = new wxFileDialog (this, _("Select Certificate File"));
+ auto d = new wxFileDialog (this, _("Select Certificate File"));
if (d->ShowModal() == wxID_OK) {
try {
"Only the first certificate will be used.")
);
}
- shared_ptr<dcp::CertificateChain> chain(new dcp::CertificateChain(*_get().get()));
+ auto chain = make_shared<dcp::CertificateChain>(*_get().get());
chain->add (c);
if (!chain->chain_valid ()) {
error_dialog (
}
_certificates->DeleteItem (i);
- shared_ptr<dcp::CertificateChain> chain(new dcp::CertificateChain(*_get().get()));
+ auto chain = make_shared<dcp::CertificateChain>(*_get().get());
chain->remove (i);
_set (chain);
return;
}
- wxFileDialog* d = new wxFileDialog (
- this, _("Select Certificate File"), wxEmptyString, wxEmptyString, wxT ("PEM files (*.pem)|*.pem"),
+ auto all = _get()->root_to_leaf();
+
+ wxString default_name;
+ if (i == 0) {
+ default_name = "root.pem";
+ } else if (i == static_cast<int>(all.size() - 1)) {
+ default_name = "leaf.pem";
+ } else {
+ default_name = "intermediate.pem";
+ }
+
+ auto d = new wxFileDialog(
+ this, _("Select Certificate File"), wxEmptyString, default_name, wxT ("PEM files (*.pem)|*.pem"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
- dcp::CertificateChain::List all = _get()->root_to_leaf ();
- dcp::CertificateChain::List::iterator j = all.begin ();
+ auto j = all.begin ();
for (int k = 0; k < i; ++k) {
++j;
}
if (d->ShowModal () == wxID_OK) {
boost::filesystem::path path (wx_to_std(d->GetPath()));
- FILE* f = fopen_boost (path, "w");
+ if (path.extension() != ".pem") {
+ path += ".pem";
+ }
+ auto f = fopen_boost (path, "w");
if (!f) {
throw OpenFileError (path, errno, OpenFileError::WRITE);
}
void
CertificateChainEditor::export_chain ()
{
- wxFileDialog* d = new wxFileDialog (
- this, _("Select Chain File"), wxEmptyString, wxEmptyString, wxT("PEM files (*.pem)|*.pem"),
+ auto d = new wxFileDialog (
+ this, _("Select Chain File"), wxEmptyString, wxT("certificate_chain.pem"), wxT("PEM files (*.pem)|*.pem"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
if (d->ShowModal () == wxID_OK) {
boost::filesystem::path path (wx_to_std(d->GetPath()));
- FILE* f = fopen_boost (path, "w");
+ if (path.extension() != ".pem") {
+ path += ".pem";
+ }
+ auto f = fopen_boost (path, "w");
if (!f) {
throw OpenFileError (path, errno, OpenFileError::WRITE);
}
- string const s = _get()->chain();
+ auto const s = _get()->chain();
checked_fwrite (s.c_str(), s.length(), f, path);
fclose (f);
}
{
_certificates->DeleteAllItems ();
size_t n = 0;
- dcp::CertificateChain::List certs = _get()->root_to_leaf ();
- BOOST_FOREACH (dcp::Certificate const & i, certs) {
+ auto certs = _get()->root_to_leaf();
+ for (auto const& i: certs) {
wxListItem item;
item.SetId (n);
_certificates->InsertItem (item);
void
CertificateChainEditor::remake_certificates ()
{
- shared_ptr<const dcp::CertificateChain> chain = _get();
-
- string subject_organization_name;
- string subject_organizational_unit_name;
- string root_common_name;
- string intermediate_common_name;
- string leaf_common_name;
-
- dcp::CertificateChain::List all = chain->root_to_leaf ();
-
- if (all.size() >= 1) {
- /* Have a root */
- subject_organization_name = chain->root().subject_organization_name ();
- subject_organizational_unit_name = chain->root().subject_organizational_unit_name ();
- root_common_name = chain->root().subject_common_name ();
- }
-
- if (all.size() >= 2) {
- /* Have a leaf */
- leaf_common_name = chain->leaf().subject_common_name ();
- }
-
- if (all.size() >= 3) {
- /* Have an intermediate */
- dcp::CertificateChain::List::iterator i = all.begin ();
- ++i;
- intermediate_common_name = i->subject_common_name ();
- }
-
if (_nag_alter()) {
/* Cancel was clicked */
return;
}
- MakeChainDialog* d = new MakeChainDialog (
- this,
- subject_organization_name,
- subject_organizational_unit_name,
- root_common_name,
- intermediate_common_name,
- leaf_common_name
- );
+ auto d = new MakeChainDialog (this, _get());
if (d->ShowModal () == wxID_OK) {
- _set (
- shared_ptr<dcp::CertificateChain> (
- new dcp::CertificateChain (
- openssl_path (),
- d->organisation (),
- d->organisational_unit (),
- d->root_common_name (),
- d->intermediate_common_name (),
- d->leaf_common_name ()
- )
- )
- );
-
+ _set (d->get());
update_certificate_list ();
update_private_key ();
}
CertificateChainEditor::update_sensitivity ()
{
/* We can only remove the leaf certificate */
- _remove_certificate->Enable (_certificates->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) == (_certificates->GetItemCount() - 1));
- _export_certificate->Enable (_certificates->GetNextItem (-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) != -1);
+ _remove_certificate->Enable (_certificates->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) == (_certificates->GetItemCount() - 1));
+ _export_certificate->Enable (_certificates->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) != -1);
}
void
void
CertificateChainEditor::import_private_key ()
{
- wxFileDialog* d = new wxFileDialog (this, _("Select Key File"));
+ auto d = new wxFileDialog (this, _("Select Key File"));
if (d->ShowModal() == wxID_OK) {
try {
return;
}
- shared_ptr<dcp::CertificateChain> chain(new dcp::CertificateChain(*_get().get()));
+ auto chain = make_shared<dcp::CertificateChain>(*_get().get());
chain->set_key (dcp::file_to_string (p));
_set (chain);
update_private_key ();
- } catch (dcp::MiscError& e) {
+ } catch (std::exception& e) {
error_dialog (this, _("Could not read certificate file."), std_to_wx(e.what()));
}
}
void
CertificateChainEditor::export_private_key ()
{
- optional<string> key = _get()->key();
+ auto key = _get()->key();
if (!key) {
return;
}
- wxFileDialog* d = new wxFileDialog (
- this, _("Select Key File"), wxEmptyString, wxEmptyString, wxT ("PEM files (*.pem)|*.pem"),
+ auto d = new wxFileDialog (
+ this, _("Select Key File"), wxEmptyString, wxT("private_key.pem"), wxT("PEM files (*.pem)|*.pem"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
if (d->ShowModal () == wxID_OK) {
boost::filesystem::path path (wx_to_std(d->GetPath()));
- FILE* f = fopen_boost (path, "w");
+ if (path.extension() != ".pem") {
+ path += ".pem";
+ }
+ auto f = fopen_boost (path, "w");
if (!f) {
throw OpenFileError (path, errno, OpenFileError::WRITE);
}
- string const s = _get()->key().get ();
+ auto const s = _get()->key().get ();
checked_fwrite (s.c_str(), s.length(), f, path);
fclose (f);
}
wxFont subheading_font (*wxNORMAL_FONT);
subheading_font.SetWeight (wxFONTWEIGHT_BOLD);
- wxSizer* sizer = _panel->GetSizer();
+ auto sizer = _panel->GetSizer();
{
- wxStaticText* m = new StaticText (_panel, _("Decrypting KDMs"));
+ auto m = new StaticText (_panel, _("Decrypting KDMs"));
m->SetFont (subheading_font);
- sizer->Add (m, 0, wxALL, _border);
+ sizer->Add (m, 0, wxALL | wxEXPAND, _border);
}
- wxSizer* buttons = new wxBoxSizer (wxVERTICAL);
+ auto kdm_buttons = new wxBoxSizer (wxVERTICAL);
- wxButton* export_decryption_certificate = new Button (_panel, _("Export KDM decryption certificate..."));
- buttons->Add (export_decryption_certificate, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
- wxButton* export_settings = new Button (_panel, _("Export all KDM decryption settings..."));
- buttons->Add (export_settings, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
- wxButton* import_settings = new Button (_panel, _("Import all KDM decryption settings..."));
- buttons->Add (import_settings, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
- wxButton* decryption_advanced = new Button (_panel, _("Advanced..."));
- buttons->Add (decryption_advanced, 0);
+ auto export_decryption_certificate = new Button (_panel, _("Export KDM decryption leaf certificate..."));
+ kdm_buttons->Add (export_decryption_certificate, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
+ auto export_settings = new Button (_panel, _("Export all KDM decryption settings..."));
+ kdm_buttons->Add (export_settings, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
+ auto import_settings = new Button (_panel, _("Import all KDM decryption settings..."));
+ kdm_buttons->Add (import_settings, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
+ auto decryption_advanced = new Button (_panel, _("Advanced..."));
+ kdm_buttons->Add (decryption_advanced, 0);
- sizer->Add (buttons, 0, wxLEFT, _border);
+ sizer->Add (kdm_buttons, 0, wxLEFT, _border);
export_decryption_certificate->Bind (wxEVT_BUTTON, bind (&KeysPage::export_decryption_certificate, this));
export_settings->Bind (wxEVT_BUTTON, bind (&KeysPage::export_decryption_chain_and_key, this));
decryption_advanced->Bind (wxEVT_BUTTON, bind (&KeysPage::decryption_advanced, this));
{
- wxStaticText* m = new StaticText (_panel, _("Signing DCPs and KDMs"));
+ auto m = new StaticText (_panel, _("Signing DCPs and KDMs"));
m->SetFont (subheading_font);
- sizer->Add (m, 0, wxALL, _border);
+ sizer->Add (m, 0, wxALL | wxEXPAND, _border);
}
- wxButton* signing_advanced = new Button (_panel, _("Advanced..."));
- sizer->Add (signing_advanced, 0, wxLEFT | wxBOTTOM, _border);
+ auto signing_buttons = new wxBoxSizer (wxVERTICAL);
+
+ auto signing_advanced = new Button (_panel, _("Advanced..."));
+ signing_buttons->Add (signing_advanced, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
+ auto remake_signing = new Button (_panel, _("Re-make certificates and key..."));
+ signing_buttons->Add (remake_signing, 0, wxBOTTOM, DCPOMATIC_BUTTON_STACK_GAP);
+
+ sizer->Add (signing_buttons, 0, wxLEFT, _border);
+
signing_advanced->Bind (wxEVT_BUTTON, bind (&KeysPage::signing_advanced, this));
+ remake_signing->Bind (wxEVT_BUTTON, bind(&KeysPage::remake_signing, this));
}
+
+void
+KeysPage::remake_signing ()
+{
+ auto d = new MakeChainDialog (_panel, Config::instance()->signer_chain());
+
+ if (d->ShowModal () == wxID_OK) {
+ Config::instance()->set_signer_chain(d->get());
+ }
+}
+
+
void
KeysPage::decryption_advanced ()
{
- CertificateChainEditor* c = new CertificateChainEditor (
+ auto c = new CertificateChainEditor (
_panel, _("Decrypting KDMs"), _border,
- bind (&Config::set_decryption_chain, Config::instance (), _1),
- bind (&Config::decryption_chain, Config::instance ()),
- bind (&KeysPage::nag_alter_decryption_chain, this)
+ bind(&Config::set_decryption_chain, Config::instance(), _1),
+ bind(&Config::decryption_chain, Config::instance()),
+ bind(&KeysPage::nag_alter_decryption_chain, this)
);
c->ShowModal();
void
KeysPage::signing_advanced ()
{
- CertificateChainEditor* c = new CertificateChainEditor (
+ auto c = new CertificateChainEditor (
_panel, _("Signing DCPs and KDMs"), _border,
- bind (&Config::set_signer_chain, Config::instance (), _1),
- bind (&Config::signer_chain, Config::instance ()),
- bind (&do_nothing)
+ bind(&Config::set_signer_chain, Config::instance(), _1),
+ bind(&Config::signer_chain, Config::instance()),
+ bind(&do_nothing)
);
c->ShowModal();
void
KeysPage::export_decryption_chain_and_key ()
{
- wxFileDialog* d = new wxFileDialog (
+ auto d = new wxFileDialog (
_panel, _("Select Export File"), wxEmptyString, wxEmptyString, wxT ("DOM files (*.dom)|*.dom"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
if (d->ShowModal () == wxID_OK) {
boost::filesystem::path path (wx_to_std(d->GetPath()));
- FILE* f = fopen_boost (path, "w");
+ auto f = fopen_boost (path, "w");
if (!f) {
throw OpenFileError (path, errno, OpenFileError::WRITE);
}
- string const chain = Config::instance()->decryption_chain()->chain();
+ auto const chain = Config::instance()->decryption_chain()->chain();
checked_fwrite (chain.c_str(), chain.length(), f, path);
optional<string> const key = Config::instance()->decryption_chain()->key();
DCPOMATIC_ASSERT (key);
return;
}
- wxFileDialog* d = new wxFileDialog (
+ auto d = new wxFileDialog (
_panel, _("Select File To Import"), wxEmptyString, wxEmptyString, wxT ("DOM files (*.dom)|*.dom")
);
if (d->ShowModal () == wxID_OK) {
- shared_ptr<dcp::CertificateChain> new_chain(new dcp::CertificateChain());
+ auto new_chain = make_shared<dcp::CertificateChain>();
FILE* f = fopen_boost (wx_to_std (d->GetPath ()), "r");
if (!f) {
void
KeysPage::export_decryption_certificate ()
{
- wxFileDialog* d = new wxFileDialog (
- _panel, _("Select Certificate File"), wxEmptyString, _("dcpomatic_kdm_decryption_cert.pem"), wxT ("PEM files (*.pem)|*.pem"),
+ auto config = Config::instance();
+ wxString default_name = "dcpomatic";
+ if (!config->dcp_creator().empty()) {
+ default_name += "_" + std_to_wx(careful_string_filter(config->dcp_creator()));
+ }
+ if (!config->dcp_issuer().empty()) {
+ default_name += "_" + std_to_wx(careful_string_filter(config->dcp_issuer()));
+ }
+ default_name += wxT("_kdm_decryption_cert.pem");
+
+ auto d = new wxFileDialog (
+ _panel, _("Select Certificate File"), wxEmptyString, default_name, wxT("PEM files (*.pem)|*.pem"),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
if (d->ShowModal () == wxID_OK) {
boost::filesystem::path path (wx_to_std(d->GetPath()));
- FILE* f = fopen_boost (path, "w");
+ if (path.extension() != ".pem") {
+ path += ".pem";
+ }
+ auto f = fopen_boost (path, "w");
if (!f) {
throw OpenFileError (path, errno, OpenFileError::WRITE);
}
- string const s = Config::instance()->decryption_chain()->leaf().certificate (true);
+ auto const s = Config::instance()->decryption_chain()->leaf().certificate (true);
checked_fwrite (s.c_str(), s.length(), f, path);
fclose (f);
}
void
SoundPage::setup ()
{
- wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ auto table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
_panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
int r = 0;
add_label_to_sizer (table, _panel, _("Mapping"), true, wxGBPosition(r, 0));
_map = new AudioMappingView (_panel, _("DCP"), _("DCP"), _("Output"), _("output"));
- _map->SetSize (-1, 600);
+ _map->SetSize (-1, 400);
table->Add (_map, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND);
++r;
RtAudio audio (DCPOMATIC_RTAUDIO_API);
for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) {
- RtAudio::DeviceInfo dev = audio.getDeviceInfo (i);
- if (dev.probed && dev.outputChannels > 0) {
- _sound_output->Append (std_to_wx (dev.name));
+ try {
+ auto dev = audio.getDeviceInfo (i);
+ if (dev.probed && dev.outputChannels > 0) {
+ _sound_output->Append (std_to_wx (dev.name));
+ }
+ } catch (RtAudioError&) {
+ /* Something went wrong so let's just ignore that device */
}
}
SoundPage::sound_output_changed ()
{
RtAudio audio (DCPOMATIC_RTAUDIO_API);
- optional<string> const so = get_sound_output();
- if (!so || *so == audio.getDeviceInfo(audio.getDefaultOutputDevice()).name) {
+ auto const so = get_sound_output();
+ string default_device;
+ try {
+ default_device = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
+ } catch (RtAudioError&) {
+ /* Never mind */
+ }
+ if (!so || *so == default_device) {
Config::instance()->unset_sound_output ();
} else {
Config::instance()->set_sound_output (*so);
void
SoundPage::config_changed ()
{
- Config* config = Config::instance ();
+ auto config = Config::instance ();
checked_set (_sound, config->sound ());
- optional<string> const current_so = get_sound_output ();
+ auto const current_so = get_sound_output ();
optional<string> configured_so;
if (config->sound_output()) {
RtAudio audio (DCPOMATIC_RTAUDIO_API);
try {
configured_so = audio.getDeviceInfo(audio.getDefaultOutputDevice()).name;
- } catch (RtAudioError& e) {
+ } catch (RtAudioError&) {
/* Probably no audio devices at all */
}
}
int channels = 0;
if (configured_so) {
for (unsigned int i = 0; i < audio.getDeviceCount(); ++i) {
- RtAudio::DeviceInfo info = audio.getDeviceInfo(i);
- if (info.name == *configured_so && info.outputChannels > 0) {
- channels = info.outputChannels;
+ try {
+ auto info = audio.getDeviceInfo(i);
+ if (info.name == *configured_so && info.outputChannels > 0) {
+ channels = info.outputChannels;
+ }
+ } catch (RtAudioError&) {
+ /* Never mind */
}
}
}
_map->set (Config::instance()->audio_mapping(channels));
- vector<string> input;
+ vector<NamedChannel> input;
for (int i = 0; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
- input.push_back (short_audio_channel_name(i));
+ input.push_back (NamedChannel(short_audio_channel_name(i), i));
}
_map->set_input_channels (input);
- vector<string> output;
+ vector<NamedChannel> output;
for (int i = 0; i < channels; ++i) {
- output.push_back (dcp::raw_convert<string>(i));
+ output.push_back (NamedChannel(dcp::raw_convert<string>(i), i));
}
_map->set_output_channels (output);
wxBitmap
LocationsPage::GetLargeIcon () const
{
- return wxBitmap ("locations", wxBITMAP_TYPE_PNG_RESOURCE);
+ return wxBitmap(bitmap_path("locations"), wxBITMAP_TYPE_PNG);
}
#endif
{
int r = 0;
- wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+ auto table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
_panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
add_label_to_sizer (table, _panel, _("Content directory"), true, wxGBPosition (r, 0));
table->Add (_kdm_directory, wxGBPosition (r, 1));
++r;
-#ifdef DCPOMATIC_VARIANT_SWAROOP
- add_label_to_sizer (table, _panel, _("Background image"), true, wxGBPosition (r, 0));
- _background_image = new FilePickerCtrl (_panel, _("Select image file"), "*.png;*.jpg;*.jpeg;*.tif;*.tiff", true, false);
- table->Add (_background_image, wxGBPosition (r, 1));
- ++r;
-#endif
-
_content_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::content_directory_changed, this));
_playlist_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::playlist_directory_changed, this));
_kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::kdm_directory_changed, this));
-#ifdef DCPOMATIC_VARIANT_SWAROOP
- _background_image->Bind (wxEVT_FILEPICKER_CHANGED, bind(&LocationsPage::background_image_changed, this));
-#endif
}
void
LocationsPage::config_changed ()
{
- Config* config = Config::instance ();
+ auto config = Config::instance ();
if (config->player_content_directory()) {
checked_set (_content_directory, *config->player_content_directory());
if (config->player_kdm_directory()) {
checked_set (_kdm_directory, *config->player_kdm_directory());
}
-#ifdef DCPOMATIC_VARIANT_SWAROOP
- if (config->player_background_image()) {
- checked_set (_background_image, *config->player_background_image());
- }
-#endif
}
void
{
Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
}
-
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-void
-LocationsPage::background_image_changed ()
-{
- boost::filesystem::path const f = wx_to_std(_background_image->GetPath());
- if (!boost::filesystem::is_regular_file(f) || !wxImage::CanRead(std_to_wx(f.string()))) {
- error_dialog (0, _("Could not load image file."));
- if (Config::instance()->player_background_image()) {
- checked_set (_background_image, *Config::instance()->player_background_image());
- }
- return;
- }
-
- Config::instance()->set_player_background_image(f);
-}
-#endif