From: Carl Hetherington Date: Sat, 25 Jan 2020 22:59:24 +0000 (+0100) Subject: Warn if doing a gain calculation might cause clipping. X-Git-Tag: v2.15.42~2 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=f0fd3981314db5b8596260aeb53564893a526b99 Warn if doing a gain calculation might cause clipping. --- diff --git a/src/wx/audio_panel.cc b/src/wx/audio_panel.cc index 5523d2539..d6137ad9f 100644 --- a/src/wx/audio_panel.cc +++ b/src/wx/audio_panel.cc @@ -258,13 +258,22 @@ AudioPanel::gain_calculate_button_clicked () return; } - _gain->wrapped()->SetValue(_gain->wrapped()->GetValue() + *c); + optional old_peak_dB = peak (); + double old_value = _gain->wrapped()->GetValue(); + _gain->wrapped()->SetValue(old_value + *c); /* This appears to be necessary, as the change is not signalled, I think. */ _gain->view_changed (); + optional peak_dB = peak (); + if (old_peak_dB && *old_peak_dB < -0.5 && peak_dB && *peak_dB > -0.5) { + error_dialog (this, _("It is not possible to adjust the content's gain for this fader change as it would cause the DCP's audio to clip. The gain has not been changed.")); + _gain->wrapped()->SetValue (old_value); + _gain->view_changed (); + } + d->Destroy (); } @@ -360,22 +369,40 @@ AudioPanel::show_clicked () _audio_dialog->Show (); } -void -AudioPanel::setup_peak () +/** @return If there is one selected piece of audio content, return its peak value in dB (if known) */ +optional +AudioPanel::peak () const { - ContentList sel = _parent->selected_audio (); optional peak_dB; - if (sel.size() != 1) { - _peak->SetLabel (wxT ("")); - } else { + ContentList sel = _parent->selected_audio (); + if (sel.size() == 1) { shared_ptr playlist (new Playlist); playlist->add (_parent->film(), sel.front()); try { - shared_ptr analysis (new AudioAnalysis (_parent->film()->audio_analysis_path (playlist))); - peak_dB = 20 * log10 (analysis->overall_sample_peak().first.peak) + analysis->gain_correction (playlist); - _peak->SetLabel (wxString::Format (_("Peak: %.2fdB"), *peak_dB)); + shared_ptr analysis (new AudioAnalysis(_parent->film()->audio_analysis_path(playlist))); + peak_dB = 20 * log10 (analysis->overall_sample_peak().first.peak) + analysis->gain_correction(playlist); } catch (...) { + + } + } + + return peak_dB; +} + +void +AudioPanel::setup_peak () +{ + ContentList sel = _parent->selected_audio (); + + optional peak_dB = peak (); + if (sel.size() != 1) { + _peak->SetLabel (wxT("")); + } else { + peak_dB = peak (); + if (peak_dB) { + _peak->SetLabel (wxString::Format(_("Peak: %.2fdB"), *peak_dB)); + } else { _peak->SetLabel (_("Peak: unknown")); } } diff --git a/src/wx/audio_panel.h b/src/wx/audio_panel.h index 09aae0552..f7161f10a 100644 --- a/src/wx/audio_panel.h +++ b/src/wx/audio_panel.h @@ -50,6 +50,7 @@ private: void setup_sensitivity (); void reference_clicked (); void add_to_grid (); + boost::optional peak () const; wxCheckBox* _reference; wxStaticText* _reference_note;