From 0cb46375414f69947d393c8e00cd66a00bd8f5bb Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 19 Jun 2013 10:03:24 +0100 Subject: Various build system adjustments. --- src/tools/wscript | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/tools') diff --git a/src/tools/wscript b/src/tools/wscript index ee4e7edef..13c5d7590 100644 --- a/src/tools/wscript +++ b/src/tools/wscript @@ -6,7 +6,7 @@ import i18n def build(bld): for t in ['makedcp', 'servomatic_cli', 'servomatictest']: obj = bld(features = 'cxx cxxprogram') - obj.uselib = 'BOOST_THREAD OPENJPEG DCP AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC' + obj.uselib = 'BOOST_THREAD OPENJPEG DCP AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML' obj.includes = ['..'] obj.use = ['libdvdomatic'] obj.source = '%s.cc' % t @@ -15,7 +15,7 @@ def build(bld): if not bld.env.DISABLE_GUI: for t in ['dvdomatic', 'dvdomatic_batch', 'servomatic_gui']: obj = bld(features = 'cxx cxxprogram') - obj.uselib = 'DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC' + obj.uselib = 'DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML' obj.includes = ['..'] obj.use = ['libdvdomatic', 'libdvdomatic-wx'] obj.source = '%s.cc' % t -- cgit v1.2.3 From 382b4cc62204a3a627a30e467c3beda81006cec6 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 25 Jun 2013 12:22:52 +0000 Subject: We may be statically linking to wxWidgets. --- src/tools/wscript | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/tools') diff --git a/src/tools/wscript b/src/tools/wscript index 13c5d7590..386aa452e 100644 --- a/src/tools/wscript +++ b/src/tools/wscript @@ -6,7 +6,7 @@ import i18n def build(bld): for t in ['makedcp', 'servomatic_cli', 'servomatictest']: obj = bld(features = 'cxx cxxprogram') - obj.uselib = 'BOOST_THREAD OPENJPEG DCP AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML' + obj.uselib = 'BOOST_THREAD OPENJPEG DCP AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML WXWIDGETS' obj.includes = ['..'] obj.use = ['libdvdomatic'] obj.source = '%s.cc' % t @@ -15,7 +15,7 @@ def build(bld): if not bld.env.DISABLE_GUI: for t in ['dvdomatic', 'dvdomatic_batch', 'servomatic_gui']: obj = bld(features = 'cxx cxxprogram') - obj.uselib = 'DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML' + obj.uselib = 'DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML WXWIDGETS' obj.includes = ['..'] obj.use = ['libdvdomatic', 'libdvdomatic-wx'] obj.source = '%s.cc' % t -- cgit v1.2.3 From b544cbb8dc45aa2bb878a99da16132264bebbae7 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 1 Jul 2013 13:35:00 +0000 Subject: Explicitly link with GTK when doing Linux static builds. --- src/tools/wscript | 2 ++ wscript | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'src/tools') diff --git a/src/tools/wscript b/src/tools/wscript index 386aa452e..20a92cad2 100644 --- a/src/tools/wscript +++ b/src/tools/wscript @@ -16,6 +16,8 @@ def build(bld): for t in ['dvdomatic', 'dvdomatic_batch', 'servomatic_gui']: obj = bld(features = 'cxx cxxprogram') obj.uselib = 'DCP OPENJPEG AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC CXML WXWIDGETS' + if bld.env.STATIC: + obj.uselib += ' GTK' obj.includes = ['..'] obj.use = ['libdvdomatic', 'libdvdomatic-wx'] obj.source = '%s.cc' % t diff --git a/wscript b/wscript index e8f6240d3..a98d60894 100644 --- a/wscript +++ b/wscript @@ -112,8 +112,11 @@ def configure(conf): if conf.env.TARGET_LINUX: conf.check_cfg(package='liblzma', args='--cflags --libs', uselib_store='LZMA', mandatory=True) - # On Linux we need to be able to include to check GTK's version - conf.check_cfg(package='gtk+-2.0', args='--cflags', uselib_store='GTK', mandatory=True) + if conf.env.STATIC: + conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='GTK', mandatory=True) + else: + # On Linux we need to be able to include to check GTK's version + conf.check_cfg(package='gtk+-2.0', args='--cflags', uselib_store='GTK', mandatory=True) conf.check_cfg(package = '', path = conf.options.magickpp_config, args = '--cppflags --cxxflags --libs', uselib_store = 'MAGICK', mandatory = True) -- cgit v1.2.3 From b68591911bd8116df0ad987627244b9bdf87de89 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 3 Jul 2013 16:33:28 +0100 Subject: Make C++ flags available from makedcp. --- src/lib/version.h | 1 + src/tools/makedcp.cc | 9 +++++++-- wscript | 11 +++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) (limited to 'src/tools') diff --git a/src/lib/version.h b/src/lib/version.h index 71639e3bc..e1ec9067c 100644 --- a/src/lib/version.h +++ b/src/lib/version.h @@ -1,3 +1,4 @@ extern char const * dvdomatic_version; extern char const * dvdomatic_git_commit; +extern char const * dvdomatic_cxx_flags; diff --git a/src/tools/makedcp.cc b/src/tools/makedcp.cc index e73930d3c..1cd5145ed 100644 --- a/src/tools/makedcp.cc +++ b/src/tools/makedcp.cc @@ -48,7 +48,8 @@ help (string n) cerr << "Syntax: " << n << " [OPTION] \n" << " -v, --version show DVD-o-matic version\n" << " -h, --help show this help\n" - << " -d, --deps list DVD-o-matic dependency details and quit\n" + << " -d, --deps list DVD-o-matic dependency details\n" + << " -f, --flags show flags passed to C++ compiler on build\n" << " -n, --no-progress do not print progress to stdout\n" << " -r, --no-remote do not use any remote servers\n" << "\n" @@ -69,13 +70,14 @@ main (int argc, char* argv[]) { "version", no_argument, 0, 'v'}, { "help", no_argument, 0, 'h'}, { "deps", no_argument, 0, 'd'}, + { "flags", no_argument, 0, 'f'}, { "no-progress", no_argument, 0, 'n'}, { "no-remote", no_argument, 0, 'r'}, { "log-level", required_argument, 0, 'l' }, { 0, 0, 0, 0 } }; - int c = getopt_long (argc, argv, "vhdnrl:", long_options, &option_index); + int c = getopt_long (argc, argv, "vhdfnrl:", long_options, &option_index); if (c == -1) { break; @@ -91,6 +93,9 @@ main (int argc, char* argv[]) case 'd': cout << dependency_version_summary () << "\n"; exit (EXIT_SUCCESS); + case 'f': + cout << dvdomatic_cxx_flags << "\n"; + exit (EXIT_SUCCESS); case 'n': progress = false; break; diff --git a/wscript b/wscript index b87191f42..0008d198f 100644 --- a/wscript +++ b/wscript @@ -206,7 +206,7 @@ def configure(conf): conf.recurse('test') def build(bld): - create_version_cc(VERSION) + create_version_cc(VERSION, bld.env.CXXFLAGS) bld.recurse('src') bld.recurse('test') @@ -232,7 +232,7 @@ def dist(ctx): GRSYMS GRTAGS GSYMS GTAGS """ -def create_version_cc(version): +def create_version_cc(version, cxx_flags): if os.path.exists('.git'): cmd = "LANG= git log --abbrev HEAD^..HEAD ." output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines() @@ -245,6 +245,13 @@ def create_version_cc(version): text = '#include "version.h"\n' text += 'char const * dvdomatic_git_commit = \"%s\";\n' % commit text += 'char const * dvdomatic_version = \"%s\";\n' % version + + t = '' + for f in cxx_flags: + f = f.replace('"', '\\"') + t += f + ' ' + text += 'char const * dvdomatic_cxx_flags = \"%s\";\n' % t[:-1] + print('Writing version information to src/lib/version.cc') o = open('src/lib/version.cc', 'w') o.write(text) -- cgit v1.2.3 From aabf54736d7401437af7f066c51fee91be64e809 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 4 Jul 2013 22:29:47 +0100 Subject: Pad silence for things that already have at least some audio. --- src/lib/encoder.cc | 4 ++-- src/lib/film.cc | 15 ++++++++++++++ src/lib/film.h | 10 ++++++++- src/lib/transcoder.cc | 2 +- src/lib/util.cc | 20 +++++++++++++++--- src/lib/util.h | 6 +++++- src/lib/writer.cc | 2 +- src/tools/dvdomatic.cc | 2 +- src/wx/audio_dialog.cc | 6 +++--- src/wx/film_editor.cc | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/wx/film_editor.h | 5 +++++ 11 files changed, 114 insertions(+), 13 deletions(-) (limited to 'src/tools') diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc index 2c989452d..6a99132fd 100644 --- a/src/lib/encoder.cc +++ b/src/lib/encoder.cc @@ -433,10 +433,10 @@ Encoder::encoder_thread (ServerDescription* server) void Encoder::write_audio (shared_ptr data) { - AudioMapping m (_film->audio_channels ()); + AudioMapping m (_film); if (m.dcp_channels() != _film->audio_channels()) { - /* Remap (currently just for mono -> 5.1) */ + /* Remap and pad with silence */ shared_ptr b (new AudioBuffers (m.dcp_channels(), data->frames ())); for (int i = 0; i < m.dcp_channels(); ++i) { diff --git a/src/lib/film.cc b/src/lib/film.cc index d92d7a977..ce555ac8b 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -108,6 +108,7 @@ Film::Film (string d, bool must_exist) , _j2k_bandwidth (200000000) , _dci_metadata (Config::instance()->default_dci_metadata ()) , _dcp_frame_rate (0) + , _minimum_audio_channels (0) , _source_frame_rate (0) , _dirty (false) { @@ -185,6 +186,7 @@ Film::Film (Film const & o) , _dci_metadata (o._dci_metadata) , _dci_date (o._dci_date) , _dcp_frame_rate (o._dcp_frame_rate) + , _minimum_audio_channels (o._minimum_audio_channels) , _size (o._size) , _length (o._length) , _content_digest (o._content_digest) @@ -506,6 +508,7 @@ Film::write_metadata () const _dci_metadata.write (f); f << "dci_date " << boost::gregorian::to_iso_string (_dci_date) << endl; f << "dcp_frame_rate " << _dcp_frame_rate << endl; + f << "minimum_audio_channels " << _minimum_audio_channels << endl; f << "width " << _size.width << endl; f << "height " << _size.height << endl; f << "length " << _length.get_value_or(0) << endl; @@ -642,6 +645,8 @@ Film::read_metadata () _dci_date = boost::gregorian::from_undelimited_string (v); } else if (k == "dcp_frame_rate") { _dcp_frame_rate = atoi (v.c_str ()); + } else if (k == "minimum_audio_channels") { + _minimum_audio_channels = atoi (v.c_str ()); } _dci_metadata.read (k, v); @@ -1323,6 +1328,16 @@ Film::set_dcp_frame_rate (int f) signal_changed (DCP_FRAME_RATE); } +void +Film::set_minimum_audio_channels (int c) +{ + { + boost::mutex::scoped_lock lm (_state_mutex); + _minimum_audio_channels = c; + } + signal_changed (MINIMUM_AUDIO_CHANNELS); +} + void Film::set_size (libdcp::Size s) { diff --git a/src/lib/film.h b/src/lib/film.h index dd0a83d94..ca9bd57f4 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -153,7 +153,8 @@ public: CONTENT_AUDIO_STREAMS, SUBTITLE_STREAMS, SOURCE_FRAME_RATE, - DCP_FRAME_RATE + DCP_FRAME_RATE, + MINIMUM_AUDIO_CHANNELS }; @@ -335,6 +336,11 @@ public: return _source_frame_rate; } + int minimum_audio_channels () const { + boost::mutex::scoped_lock lm (_state_mutex); + return _minimum_audio_channels; + } + boost::shared_ptr audio_stream () const; bool has_audio () const; @@ -379,6 +385,7 @@ public: void set_content_audio_streams (std::vector >); void set_subtitle_streams (std::vector >); void set_source_frame_rate (float); + void set_minimum_audio_channels (int); /** Emitted when some property has changed */ mutable boost::signals2::signal Changed; @@ -481,6 +488,7 @@ private: boost::gregorian::date _dci_date; /** Frames per second to run our DCP at */ int _dcp_frame_rate; + int _minimum_audio_channels; /* Data which are cached to speed things up */ diff --git a/src/lib/transcoder.cc b/src/lib/transcoder.cc index 48cf402d7..a202d440c 100644 --- a/src/lib/transcoder.cc +++ b/src/lib/transcoder.cc @@ -73,7 +73,7 @@ Transcoder::Transcoder (shared_ptr f, DecodeOptions o, Job* j, shared_ptr< /* Set up the decoder to use the film's set streams */ _decoders.video->set_subtitle_stream (f->subtitle_stream ()); if (f->audio_stream ()) { - _decoders.audio->set_audio_stream (f->audio_stream ()); + _decoders.audio->set_audio_stream (f->audio_stream ()); } _decoders.video->connect_video (_delay_line); diff --git a/src/lib/util.cc b/src/lib/util.cc index 4cf57368a..83980f828 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -61,6 +61,7 @@ extern "C" { #include "filter.h" #include "sound_processor.h" #include "config.h" +#include "film.h" #ifdef DVDOMATIC_WINDOWS #include "stack.hpp" #endif @@ -962,8 +963,9 @@ audio_channel_name (int c) return channels[c]; } -AudioMapping::AudioMapping (int c) - : _source_channels (c) +AudioMapping::AudioMapping (shared_ptr f) + : _source_channels (f->audio_stream() ? f->audio_stream()->channels() : 0) + , _minimum_channels (f->minimum_audio_channels ()) { } @@ -1001,8 +1003,11 @@ AudioMapping::dcp_to_source (libdcp::Channel c) const return static_cast (c); } +/** @return minimum number of DCP channels that we can allow in this + DCP, given the nature of the source. +*/ int -AudioMapping::dcp_channels () const +AudioMapping::minimum_dcp_channels () const { if (_source_channels == 1) { /* The source is mono, so to put the mono channel into @@ -1014,6 +1019,15 @@ AudioMapping::dcp_channels () const return _source_channels; } +/** @return number of channels that there should be in the DCP, including + * any silent padded ones. + */ +int +AudioMapping::dcp_channels () const +{ + return max (_source_channels, _minimum_channels); +} + FrameRateConversion::FrameRateConversion (float source, int dcp) : skip (false) , repeat (false) diff --git a/src/lib/util.h b/src/lib/util.h index 0d745e50c..c9e5bef16 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -50,6 +50,7 @@ extern "C" { #define MAX_AUDIO_CHANNELS 6 class Scaler; +class Film; extern std::string seconds_to_hms (int); extern std::string seconds_to_approximate_hms (int); @@ -287,14 +288,17 @@ private: class AudioMapping { public: - AudioMapping (int); + AudioMapping (boost::shared_ptr); boost::optional source_to_dcp (int c) const; boost::optional dcp_to_source (libdcp::Channel c) const; + + int minimum_dcp_channels () const; int dcp_channels () const; private: int _source_channels; + int _minimum_channels; }; extern int64_t video_frames_to_audio_frames (SourceFrame v, float audio_sample_rate, float frames_per_second); diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 1a6daa1db..cff0b5be2 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -77,7 +77,7 @@ Writer::Writer (shared_ptr f) _picture_asset_writer = _picture_asset->start_write (_first_nonexistant_frame > 0); - AudioMapping m (_film->audio_channels ()); + AudioMapping m (_film); if (m.dcp_channels() > 0) { _sound_asset.reset ( diff --git a/src/tools/dvdomatic.cc b/src/tools/dvdomatic.cc index de94d0a2f..e0629bb98 100644 --- a/src/tools/dvdomatic.cc +++ b/src/tools/dvdomatic.cc @@ -166,7 +166,7 @@ setup_menu (wxMenuBar* m) add_item (file, _("&Properties..."), ID_file_properties, NEEDS_FILM); #ifndef __WXOSX__ file->AppendSeparator (); -#endif +#endif add_item (file, _("&Exit"), wxID_EXIT, ALWAYS); #ifdef __WXOSX__ diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc index d12b5516f..21e4e5940 100644 --- a/src/wx/audio_dialog.cc +++ b/src/wx/audio_dialog.cc @@ -108,7 +108,7 @@ AudioDialog::setup_channels () return; } - AudioMapping m (_film->audio_stream()->channels ()); + AudioMapping m (_film); for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) { if (m.dcp_to_source(static_cast(i))) { @@ -134,7 +134,7 @@ AudioDialog::try_to_load_analysis () _plot->set_analysis (a); - AudioMapping m (_film->audio_stream()->channels ()); + AudioMapping m (_film); optional c = m.source_to_dcp (0); if (c) { _channel_checkbox[c.get()]->SetValue (true); @@ -157,7 +157,7 @@ AudioDialog::channel_clicked (wxCommandEvent& ev) assert (c < MAX_AUDIO_CHANNELS); - AudioMapping m (_film->audio_stream()->channels ()); + AudioMapping m (_film); optional s = m.dcp_to_source (static_cast (c)); if (s) { _plot->set_channel_visible (s.get(), _channel_checkbox[c]->GetValue ()); diff --git a/src/wx/film_editor.cc b/src/wx/film_editor.cc index dd952e22a..13bef5a24 100644 --- a/src/wx/film_editor.cc +++ b/src/wx/film_editor.cc @@ -232,6 +232,8 @@ FilmEditor::connect_to_widgets () _dcp_content_type->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_content_type_changed), 0, this); _dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler (FilmEditor::dcp_frame_rate_changed), 0, this); _best_dcp_frame_rate->Connect (wxID_ANY, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (FilmEditor::best_dcp_frame_rate_clicked), 0, this); + _pad_with_silence->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::pad_with_silence_toggled), 0, this); + _minimum_audio_channels->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::minimum_audio_channels_changed), 0, this); _dcp_ab->Connect (wxID_ANY, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler (FilmEditor::dcp_ab_toggled), 0, this); _still_duration->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::still_duration_changed), 0, this); _trim_start->Connect (wxID_ANY, wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEventHandler (FilmEditor::trim_start_changed), 0, this); @@ -392,6 +394,16 @@ FilmEditor::make_audio_panel () grid->Add (s); } + { + _pad_with_silence = new wxCheckBox (_audio_panel, wxID_ANY, _("Pad with silence to")); + grid->Add (_pad_with_silence); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + _minimum_audio_channels = new wxSpinCtrl (_audio_panel); + s->Add (_minimum_audio_channels, 1); + add_label_to_sizer (s, _audio_panel, _("channels")); + grid->Add (s); + } + { _use_content_audio = new wxRadioButton (_audio_panel, wxID_ANY, _("Use content's audio"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); grid->Add (video_control (_use_content_audio)); @@ -415,6 +427,7 @@ FilmEditor::make_audio_panel () _audio_gain->SetRange (-60, 60); _audio_delay->SetRange (-1000, 1000); + _minimum_audio_channels->SetRange (0, MAX_AUDIO_CHANNELS); } void @@ -628,6 +641,7 @@ FilmEditor::film_changed (Film::Property p) setup_streams (); setup_show_audio_sensitivity (); setup_frame_rate_description (); + setup_minimum_audio_channels (); break; case Film::TRUST_CONTENT_HEADER: checked_set (_trust_content_header, _film->trust_content_header ()); @@ -640,6 +654,7 @@ FilmEditor::film_changed (Film::Property p) setup_streams (); setup_show_audio_sensitivity (); setup_frame_rate_description (); + setup_minimum_audio_channels (); break; case Film::FORMAT: { @@ -764,6 +779,7 @@ FilmEditor::film_changed (Film::Property p) setup_audio_control_sensitivity (); setup_show_audio_sensitivity (); setup_frame_rate_description (); + setup_minimum_audio_channels (); break; case Film::USE_CONTENT_AUDIO: _film->log()->log (String::compose ("Film::USE_CONTENT_AUDIO changed; setting GUI using %1", _film->use_content_audio ())); @@ -774,6 +790,7 @@ FilmEditor::film_changed (Film::Property p) setup_audio_control_sensitivity (); setup_show_audio_sensitivity (); setup_frame_rate_description (); + setup_minimum_audio_channels (); break; case Film::SUBTITLE_STREAM: if (_film->subtitle_stream()) { @@ -789,6 +806,7 @@ FilmEditor::film_changed (Film::Property p) setup_audio_details (); setup_show_audio_sensitivity (); setup_frame_rate_description (); + setup_minimum_audio_channels (); break; } case Film::DCP_FRAME_RATE: @@ -808,6 +826,10 @@ FilmEditor::film_changed (Film::Property p) } setup_frame_rate_description (); + case Film::MINIMUM_AUDIO_CHANNELS: + checked_set (_minimum_audio_channels, _film->minimum_audio_channels ()); + setup_minimum_audio_channels (); + break; } } @@ -1185,6 +1207,9 @@ FilmEditor::setup_audio_control_sensitivity () for (int i = 0; i < MAX_AUDIO_CHANNELS; ++i) { _external_audio[i]->Enable (external); } + + _pad_with_silence->Enable (_generally_sensitive && _film && _film->audio_stream() && _film->audio_stream()->channels() < MAX_AUDIO_CHANNELS); + _minimum_audio_channels->Enable (_generally_sensitive && _pad_with_silence->GetValue ()); } void @@ -1411,3 +1436,33 @@ FilmEditor::trim_type_changed (wxCommandEvent &) { _film->set_trim_type (_trim_type->GetSelection () == 0 ? Film::CPL : Film::ENCODE); } + +void +FilmEditor::setup_minimum_audio_channels () +{ + if (!_film || !_film->audio_stream ()) { + _pad_with_silence->SetValue (false); + return; + } + + _pad_with_silence->SetValue (_film->audio_stream()->channels() < _film->minimum_audio_channels()); + + AudioMapping m (_film); + _minimum_audio_channels->SetRange (m.minimum_dcp_channels(), MAX_AUDIO_CHANNELS); +} + +void +FilmEditor::pad_with_silence_toggled (wxCommandEvent &) +{ + setup_audio_control_sensitivity (); +} + +void +FilmEditor::minimum_audio_channels_changed (wxCommandEvent &) +{ + if (!_film) { + return; + } + + _film->set_minimum_audio_channels (_minimum_audio_channels->GetValue ()); +} diff --git a/src/wx/film_editor.h b/src/wx/film_editor.h index e2a4d5836..c2d064ca2 100644 --- a/src/wx/film_editor.h +++ b/src/wx/film_editor.h @@ -85,6 +85,8 @@ private: void external_audio_changed (wxCommandEvent &); void dcp_frame_rate_changed (wxCommandEvent &); void best_dcp_frame_rate_clicked (wxCommandEvent &); + void pad_with_silence_toggled (wxCommandEvent &); + void minimum_audio_channels_changed (wxCommandEvent &); /* Handle changes to the model */ void film_changed (Film::Property); @@ -103,6 +105,7 @@ private: void setup_scaling_description (); void setup_notebook_size (); void setup_frame_rate_description (); + void setup_minimum_audio_channels (); wxControl* video_control (wxControl *); wxControl* still_control (wxControl *); @@ -169,6 +172,8 @@ private: wxStaticText* _source_frame_rate; wxChoice* _dcp_frame_rate; wxButton* _best_dcp_frame_rate; + wxCheckBox* _pad_with_silence; + wxSpinCtrl* _minimum_audio_channels; wxStaticText* _frame_rate_description; /** The Film's length */ wxStaticText* _length; -- cgit v1.2.3