Merge branch 'master' of ssh://git.carlh.net/home/carl/git/dcpomatic
[dcpomatic.git] / src / lib / analyse_audio_job.cc
index 164c57b14ab9eef984e71f59886d560e12f962ff..525ac6c911d9940fb0eb09ece3c2a344cda3d7b0 100644 (file)
@@ -26,6 +26,7 @@
 #include "player.h"
 #include "playlist.h"
 #include <boost/foreach.hpp>
+#include <iostream>
 
 #include "i18n.h"
 
@@ -72,8 +73,13 @@ AnalyseAudioJob::run ()
 {
        shared_ptr<Player> player (new Player (_film, _playlist));
        player->set_ignore_video ();
+       player->set_fast ();
+       player->set_play_referenced ();
 
-       int64_t const len = _playlist->length().frames_round (_film->audio_frame_rate());
+       DCPTime const start = _playlist->start().get_value_or (DCPTime ());
+       DCPTime const length = _playlist->length ();
+
+       Frame const len = DCPTime (length - start).frames_round (_film->audio_frame_rate());
        _samples_per_point = max (int64_t (1), len / _num_points);
 
        delete[] _current;
@@ -90,9 +96,9 @@ AnalyseAudioJob::run ()
        if (has_any_audio) {
                _done = 0;
                DCPTime const block = DCPTime::from_seconds (1.0 / 8);
-               for (DCPTime t; t < _film->length(); t += block) {
+               for (DCPTime t = start; t < length; t += block) {
                        analyse (player->get_audio (t, block, false));
-                       set_progress (t.seconds() / _film->length().seconds());
+                       set_progress ((t.seconds() - start.seconds()) / (length.seconds() - start.seconds()));
                }
        }
 
@@ -119,9 +125,10 @@ AnalyseAudioJob::analyse (shared_ptr<const AudioBuffers> b)
        int const frames = b->frames ();
        int const channels = b->channels ();
 
-       for (int i = 0; i < frames; ++i) {
-               for (int j = 0; j < channels; ++j) {
-                       float s = b->data(j)[i];
+       for (int j = 0; j < channels; ++j) {
+               float* data = b->data(j);
+               for (int i = 0; i < frames; ++i) {
+                       float s = data[i];
                        float as = fabsf (s);
                        if (as < 10e-7) {
                                /* SafeStringStream can't serialise and recover inf or -inf, so prevent such
@@ -136,13 +143,13 @@ AnalyseAudioJob::analyse (shared_ptr<const AudioBuffers> b)
                                _overall_peak_frame = _done + i;
                        }
 
-                       if ((_done % _samples_per_point) == 0) {
+                       if (((_done + i) % _samples_per_point) == 0) {
                                _current[j][AudioPoint::RMS] = sqrt (_current[j][AudioPoint::RMS] / _samples_per_point);
                                _analysis->add_point (j, _current[j]);
                                _current[j] = AudioPoint ();
                        }
                }
-
-               ++_done;
        }
+
+       _done += frames;
 }