7fd73c0cf1f723896826c77fec3720c5c404d4e8 from master; tidy audio analysis dialogue...
[dcpomatic.git] / src / lib / analyse_audio_job.cc
index 60b10e7b6e05ba69dc418894fa10b4ca8ef7781e..cdf6238767e21bc7ba0931a04edaf52d75de1277 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
 
     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
@@ -39,6 +39,8 @@ AnalyseAudioJob::AnalyseAudioJob (shared_ptr<const Film> f, shared_ptr<AudioCont
        , _content (c)
        , _done (0)
        , _samples_per_point (1)
+       , _overall_peak (0)
+       , _overall_peak_frame (0)
 {
 
 }
@@ -49,6 +51,12 @@ AnalyseAudioJob::name () const
        return _("Analyse audio");
 }
 
+string
+AnalyseAudioJob::json_name () const
+{
+       return N_("analyse_audio");
+}
+
 void
 AnalyseAudioJob::run ()
 {
@@ -60,6 +68,7 @@ AnalyseAudioJob::run ()
        shared_ptr<Playlist> playlist (new Playlist);
        playlist->add (content);
        shared_ptr<Player> player (new Player (_film, playlist));
+       player->set_ignore_video ();
        
        int64_t const len = _film->length().frames (_film->audio_frame_rate());
        _samples_per_point = max (int64_t (1), len / _num_points);
@@ -74,6 +83,7 @@ AnalyseAudioJob::run ()
                set_progress (t.seconds() / _film->length().seconds());
        }
 
+       _analysis->set_peak (_overall_peak, DCPTime::from_frames (_overall_peak_frame, _film->audio_frame_rate ()));
        _analysis->write (content->audio_analysis_path ());
        
        set_progress (1);
@@ -94,6 +104,15 @@ AnalyseAudioJob::analyse (shared_ptr<const AudioBuffers> b)
                        _current[j][AudioPoint::RMS] += pow (s, 2);
                        _current[j][AudioPoint::PEAK] = max (_current[j][AudioPoint::PEAK], fabsf (s));
 
+                       float const as = fabs (s);
+
+                       _current[j][AudioPoint::PEAK] = max (_current[j][AudioPoint::PEAK], as);
+
+                       if (as > _overall_peak) {
+                               _overall_peak = as;
+                               _overall_peak_frame = _done + i;
+                       }
+
                        if ((_done % _samples_per_point) == 0) {
                                _current[j][AudioPoint::RMS] = sqrt (_current[j][AudioPoint::RMS] / _samples_per_point);
                                _analysis->add_point (j, _current[j]);