X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Faudio_panel.cc;h=76dcbad67889ebb59377975046151d0ffe1389d5;hb=d5bdc5cf073987043ace62378b02ffee5af818bd;hp=ccdb579079dc166ef79acc1269760de64ae2f0ea;hpb=7d9cb77d1c83345d463a327ea10da921fbcfd956;p=dcpomatic.git diff --git a/src/wx/audio_panel.cc b/src/wx/audio_panel.cc index ccdb57907..76dcbad67 100644 --- a/src/wx/audio_panel.cc +++ b/src/wx/audio_panel.cc @@ -46,6 +46,9 @@ using std::pair; using boost::dynamic_pointer_cast; using boost::shared_ptr; using boost::optional; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif AudioPanel::AudioPanel (ContentPanel* p) : ContentSubPanel (p, _("Audio")) @@ -88,7 +91,7 @@ AudioPanel::AudioPanel (ContentPanel* p) /// TRANSLATORS: this is an abbreviation for milliseconds, the unit of time _delay_ms_label = create_label (this, _("ms"), false); - _mapping = new AudioMappingView (this); + _mapping = new AudioMappingView (this, _("Content"), _("content"), _("DCP"), _("DCP")); _sizer->Add (_mapping, 1, wxEXPAND | wxALL, 6); _description = new StaticText (this, wxT(" \n"), wxDefaultPosition, wxDefaultSize); @@ -251,24 +254,29 @@ AudioPanel::gain_calculate_button_clicked () { GainCalculatorDialog* d = new GainCalculatorDialog (this); int const r = d->ShowModal (); + optional c = d->db_change(); - if (r == wxID_CANCEL || d->wanted_fader() == 0 || d->actual_fader() == 0) { + if (r == wxID_CANCEL || !c) { d->Destroy (); return; } - _gain->wrapped()->SetValue ( - Config::instance()->cinema_sound_processor()->db_for_fader_change ( - d->wanted_fader (), - d->actual_fader () - ) - ); + 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 (); } @@ -320,7 +328,13 @@ AudioPanel::setup_sensitivity () string why_not; bool const can_reference = dcp && dcp->can_reference_audio (_parent->film(), why_not); - setup_refer_button (_reference, _reference_note, dcp, can_reference, why_not); + wxString cannot; + if (why_not.empty()) { + cannot = _("Cannot reference this DCP's audio."); + } else { + cannot = _("Cannot reference this DCP's audio: ") + std_to_wx(why_not); + } + setup_refer_button (_reference, _reference_note, dcp, can_reference, cannot); if (_reference->GetValue ()) { _gain->wrapped()->Enable (false); @@ -354,26 +368,44 @@ AudioPanel::show_clicked () return; } - _audio_dialog = new AudioDialog (this, _parent->film (), ac.front ()); + _audio_dialog = new AudioDialog (this, _parent->film(), _parent->film_viewer(), ac.front()); _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 = linear_to_db(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")); } }