From 31f491c0f13d23506fd810f61982976a9a60e44d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 22 Apr 2016 14:29:08 +0100 Subject: [PATCH] Select active channels on opening audio analysis (#802). --- ChangeLog | 2 ++ src/lib/film.cc | 69 +++++++++++++++++++++--------------------- src/lib/film.h | 2 ++ src/wx/audio_dialog.cc | 26 +++++++++++++--- src/wx/audio_dialog.h | 3 +- 5 files changed, 63 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index b867e7943..f279abba4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2016-04-22 c.hetherington + * Select active channels on opening audio analysis (#802). + * Disallow KDM until times from being before from times (#821). * Warn when loading certificates from files that have diff --git a/src/lib/film.cc b/src/lib/film.cc index 1775f7c7f..b80962ead 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -493,6 +493,32 @@ Film::file (boost::filesystem::path f) const return p; } +list +Film::mapped_audio_channels () const +{ + list mapped; + + if (audio_processor ()) { + /* Processors are mapped 1:1 to DCP outputs so we can work out mappings from there */ + for (int i = 0; i < audio_processor()->out_channels(); ++i) { + mapped.push_back (i); + } + } else { + BOOST_FOREACH (shared_ptr i, content ()) { + shared_ptr ac = dynamic_pointer_cast (i); + if (ac) { + list c = ac->audio_mapping().mapped_output_channels (); + copy (c.begin(), c.end(), back_inserter (mapped)); + } + } + + mapped.sort (); + mapped.unique (); + } + + return mapped; +} + /** @return a ISDCF-compliant name for a DCP of this film */ string Film::isdcf_name (bool if_created_now) const @@ -646,46 +672,21 @@ Film::isdcf_name (bool if_created_now) const } } - /* Find all mapped channels */ + /* Count mapped audio channels */ int non_lfe = 0; int lfe = 0; - if (audio_processor ()) { - /* Processors are mapped 1:1 to DCP outputs so we can guess the number of LFE/ - non-LFE from the channel counts. - */ - non_lfe = audio_processor()->out_channels (); - if (non_lfe >= 4) { - --non_lfe; - ++lfe; - } - } else { - list mapped; - BOOST_FOREACH (shared_ptr i, content ()) { - shared_ptr ac = dynamic_pointer_cast (i); - if (ac) { - list c = ac->audio_mapping().mapped_output_channels (); - copy (c.begin(), c.end(), back_inserter (mapped)); - } + BOOST_FOREACH (int i, mapped_audio_channels ()) { + if (i >= audio_channels()) { + /* This channel is mapped but is not included in the DCP */ + continue; } - mapped.sort (); - mapped.unique (); - - /* Count them */ - - for (list::const_iterator i = mapped.begin(); i != mapped.end(); ++i) { - if (*i >= audio_channels()) { - /* This channel is mapped but is not included in the DCP */ - continue; - } - - if (static_cast (*i) == dcp::LFE) { - ++lfe; - } else { - ++non_lfe; - } + if (static_cast (i) == dcp::LFE) { + ++lfe; + } else { + ++non_lfe; } } diff --git a/src/lib/film.h b/src/lib/film.h index b8e31a420..4ad905758 100644 --- a/src/lib/film.h +++ b/src/lib/film.h @@ -154,6 +154,8 @@ public: std::list reels () const; + std::list mapped_audio_channels () const; + /** Identifiers for the parts of our state; used for signalling changes. */ diff --git a/src/wx/audio_dialog.cc b/src/wx/audio_dialog.cc index 2117963f6..20185bf8f 100644 --- a/src/wx/audio_dialog.cc +++ b/src/wx/audio_dialog.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2015 Carl Hetherington + Copyright (C) 2013-2016 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,9 +27,11 @@ #include "lib/job_manager.h" #include #include +#include #include using std::cout; +using std::list; using boost::shared_ptr; using boost::bind; using boost::optional; @@ -40,6 +42,7 @@ using boost::dynamic_pointer_cast; AudioDialog::AudioDialog (wxWindow* parent, shared_ptr film, shared_ptr content) : wxDialog (parent, wxID_ANY, _("Audio"), wxDefaultPosition, wxSize (640, 512), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxFULL_REPAINT_ON_RESIZE) , _film (film) + , _content (content) , _channels (film->audio_channels ()) , _plot (0) { @@ -168,9 +171,24 @@ AudioDialog::try_to_load_analysis () ++i; } - if (i == _channels && _channel_checkbox[0]) { - _channel_checkbox[0]->SetValue (true); - _plot->set_channel_visible (0, true); + if (i == _channels) { + /* Nothing checked; check mapped ones */ + + list mapped; + shared_ptr content = _content.lock (); + + if (content) { + mapped = content->audio_mapping().mapped_output_channels (); + } else { + mapped = film->mapped_audio_channels (); + } + + BOOST_FOREACH (int i, mapped) { + if (_channel_checkbox[i]) { + _channel_checkbox[i]->SetValue (true); + _plot->set_channel_visible (i, true); + } + } } i = 0; diff --git a/src/wx/audio_dialog.h b/src/wx/audio_dialog.h index 0f791dc16..8320171ce 100644 --- a/src/wx/audio_dialog.h +++ b/src/wx/audio_dialog.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2015 Carl Hetherington + Copyright (C) 2013-2016 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,6 +45,7 @@ private: boost::shared_ptr _analysis; boost::weak_ptr _film; + boost::weak_ptr _content; int _channels; boost::shared_ptr _playlist; AudioPlot* _plot; -- 2.30.2