X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fwx%2Faudio_panel.cc;h=bf73798dac5779f4000346b819133afc97b721de;hb=dd9be86db6cde0afa5da0d1d1ac43b42e05dca26;hp=5523d25393088196d88655581121b43f740c6522;hpb=5d7ba3c7717288b13cb8b286474382580f3bdba9;p=dcpomatic.git diff --git a/src/wx/audio_panel.cc b/src/wx/audio_panel.cc index 5523d2539..bf73798da 100644 --- a/src/wx/audio_panel.cc +++ b/src/wx/audio_panel.cc @@ -43,9 +43,12 @@ using std::cout; using std::string; using std::list; using std::pair; -using boost::dynamic_pointer_cast; -using boost::shared_ptr; +using std::dynamic_pointer_cast; +using std::shared_ptr; using boost::optional; +#if BOOST_VERSION >= 106100 +using namespace boost::placeholders; +#endif AudioPanel::AudioPanel (ContentPanel* p) : ContentSubPanel (p, _("Audio")) @@ -118,20 +121,13 @@ AudioPanel::AudioPanel (ContentPanel* p) void AudioPanel::add_to_grid () { - bool const full = Config::instance()->interface_complexity() == Config::INTERFACE_FULL; - int r = 0; - _reference->Show (full); - _reference_note->Show (full); - - if (full) { - wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL); - reference_sizer->Add (_reference, 0); - reference_sizer->Add (_reference_note, 0); - _grid->Add (reference_sizer, wxGBPosition(r, 0), wxGBSpan(1, 4)); - ++r; - } + wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL); + reference_sizer->Add (_reference, 0); + reference_sizer->Add (_reference_note, 0); + _grid->Add (reference_sizer, wxGBPosition(r, 0), wxGBSpan(1, 4)); + ++r; _grid->Add (_show, wxGBPosition (r, 0), wxGBSpan (1, 2)); _grid->Add (_peak, wxGBPosition (r, 2), wxGBSpan (1, 2), wxALIGN_CENTER_VERTICAL); @@ -145,25 +141,15 @@ AudioPanel::add_to_grid () _grid->Add (s, wxGBPosition(r, 1)); } - _gain_calculate_button->Show (full); - - if (full) { - _grid->Add (_gain_calculate_button, wxGBPosition(r, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); - ++r; - } - - _delay_label->Show (full); - _delay->show (full); - _delay_ms_label->Show (full); + _grid->Add (_gain_calculate_button, wxGBPosition(r, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + ++r; - if (full) { - add_label_to_sizer (_grid, _delay_label, true, wxGBPosition(r, 0)); - wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); - s->Add (_delay->wrapped(), 1, wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM | wxRIGHT, 6); - s->Add (_delay_ms_label, 0, wxALIGN_CENTER_VERTICAL); - _grid->Add (s, wxGBPosition(r, 1)); - ++r; - } + add_label_to_sizer (_grid, _delay_label, true, wxGBPosition(r, 0)); + wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL); + s->Add (_delay->wrapped(), 1, wxALIGN_CENTER_VERTICAL | wxTOP | wxBOTTOM | wxRIGHT, 6); + s->Add (_delay_ms_label, 0, wxALIGN_CENTER_VERTICAL); + _grid->Add (s, wxGBPosition(r, 1)); + ++r; } AudioPanel::~AudioPanel () @@ -258,13 +244,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 (); } @@ -356,26 +351,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")); } }