/*
Copyright (C) 2013-2016 Carl Hetherington <cth@carlh.net>
- This program is free software; you can redistribute it and/or modify
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
- This program is distributed in the hope that it will be useful,
+ DCP-o-matic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
*/
using std::cout;
using std::list;
+using std::vector;
+using std::pair;
using boost::shared_ptr;
using boost::bind;
using boost::optional;
using boost::const_pointer_cast;
using boost::dynamic_pointer_cast;
-/** @param content Content to analyse, or 0 to analyse all of the film's audio */
+/** @param parent Parent window.
+ * @param film Film we are using.
+ * @param content Content to analyse, or 0 to analyse all of the film's audio.
+ */
AudioDialog::AudioDialog (wxWindow* parent, shared_ptr<Film> film, shared_ptr<Content> content)
- : wxDialog (parent, wxID_ANY, _("Audio"), wxDefaultPosition, wxSize (640, 512), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxFULL_REPAINT_ON_RESIZE)
+ : wxDialog (
+ parent,
+ wxID_ANY,
+ _("Audio"),
+ wxDefaultPosition,
+ wxSize (640, 512),
+#ifdef DCPOMATIC_OSX
+ /* I can't get wxFRAME_FLOAT_ON_PARENT to work on OS X, and although wxSTAY_ON_TOP keeps
+ the window above all others (and not just our own) it's better than nothing for now.
+ */
+ wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxFULL_REPAINT_ON_RESIZE | wxSTAY_ON_TOP
+#else
+ wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxFULL_REPAINT_ON_RESIZE | wxFRAME_FLOAT_ON_PARENT
+#endif
+ )
, _film (film)
, _content (content)
, _channels (film->audio_channels ())
for (int i = 0; i < _channels; ++i) {
_channel_checkbox[i] = new wxCheckBox (this, wxID_ANY, std_to_wx (audio_channel_name (i)));
+ _channel_checkbox[i]->SetForegroundColour(wxColour(_plot->colour(i)));
right->Add (_channel_checkbox[i], 0, wxEXPAND | wxALL, 3);
- _channel_checkbox[i]->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AudioDialog::channel_clicked, this, _1));
+ _channel_checkbox[i]->Bind (wxEVT_CHECKBOX, boost::bind (&AudioDialog::channel_clicked, this, _1));
+ }
+
+ for (int i = _channels; i < MAX_DCP_AUDIO_CHANNELS; ++i) {
+ _channel_checkbox[i] = 0;
}
{
for (int i = 0; i < AudioPoint::COUNT; ++i) {
_type_checkbox[i] = new wxCheckBox (this, wxID_ANY, types[i]);
right->Add (_type_checkbox[i], 0, wxEXPAND | wxALL, 3);
- _type_checkbox[i]->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&AudioDialog::type_clicked, this, _1));
+ _type_checkbox[i]->Bind (wxEVT_CHECKBOX, boost::bind (&AudioDialog::type_clicked, this, _1));
}
{
try {
_analysis.reset (new AudioAnalysis (path));
+ } catch (OldFormatError& e) {
+ /* An old analysis file: recreate it */
+ JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this));
+ return;
} catch (xmlpp::exception& e) {
- /* Probably an old-style analysis file: recreate it */
+ /* Probably a (very) old-style analysis file: recreate it */
JobManager::instance()->analyse_audio (film, _playlist, _analysis_finished_connection, bind (&AudioDialog::analysis_finished, this));
return;
}
/* Nothing checked; check mapped ones */
list<int> mapped;
- shared_ptr<AudioContent> content = _content.lock ();
+ shared_ptr<Content> content = _content.lock ();
if (content) {
- mapped = content->audio_mapping().mapped_output_channels ();
+ mapped = content->audio->mapping().mapped_output_channels ();
} else {
mapped = film->mapped_audio_channels ();
}
AudioDialog::analysis_finished ()
{
shared_ptr<const Film> film = _film.lock ();
- DCPOMATIC_ASSERT (film);
+ if (!film) {
+ /* This should not happen, but if it does we should just give up quietly */
+ return;
+ }
if (!boost::filesystem::exists (film->audio_analysis_path (_playlist))) {
/* We analysed and still nothing showed up, so maybe it was cancelled or it failed.
return;
}
- if (static_cast<bool>(_analysis->sample_peak ())) {
-
- float const peak_dB = 20 * log10 (_analysis->sample_peak().get()) + _analysis->gain_correction (_playlist);
-
- _sample_peak->SetLabel (
- wxString::Format (
- _("Sample peak is %.2fdB at %s"),
- peak_dB,
- time_to_timecode (_analysis->sample_peak_time().get(), film->video_frame_rate ()).data ()
- )
- );
-
- if (peak_dB > -3) {
- _sample_peak->SetForegroundColour (wxColour (255, 0, 0));
- } else {
- _sample_peak->SetForegroundColour (wxColour (0, 0, 0));
- }
+ pair<AudioAnalysis::PeakTime, int> const peak = _analysis->overall_sample_peak ();
+ float const peak_dB = 20 * log10 (peak.first.peak) + _analysis->gain_correction (_playlist);
+ _sample_peak->SetLabel (
+ wxString::Format (
+ _("Sample peak is %.2fdB at %s on %s"),
+ peak_dB,
+ time_to_timecode (peak.first.time, film->video_frame_rate ()).data (),
+ std_to_wx (short_audio_channel_name (peak.second)).data ()
+ )
+ );
+
+ if (peak_dB > -3) {
+ _sample_peak->SetForegroundColour (wxColour (255, 0, 0));
+ } else {
+ _sample_peak->SetForegroundColour (wxColour (0, 0, 0));
}
- if (static_cast<bool>(_analysis->true_peak ())) {
- float const peak_dB = 20 * log10 (_analysis->true_peak().get()) + _analysis->gain_correction (_playlist);
+ if (_analysis->overall_true_peak()) {
+ float const peak = _analysis->overall_true_peak().get();
+ float const peak_dB = 20 * log10 (peak) + _analysis->gain_correction (_playlist);
_true_peak->SetLabel (wxString::Format (_("True peak is %.2fdB"), peak_dB));