Make sure that MSVC knows which version of 'ceil()' we want
[ardour.git] / libs / ardour / export_graph_builder.cc
index bdcdf2620e21f924ddb087895ea5edf28ef3122a..a15a48a350739f1504eb45fbba13c07ecaaf5117 100644 (file)
@@ -307,8 +307,15 @@ ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &parent, FileSpec const & new_c
        unsigned channels = new_config.channel_config->get_n_chans();
        _analyse = config.format->analyse();
        if (_analyse) {
+               framecnt_t sample_rate = parent.session.nominal_frame_rate();
+               framecnt_t sb = config.format->silence_beginning_at (parent.timespan->get_start(), sample_rate);
+               framecnt_t se = config.format->silence_end_at (parent.timespan->get_end(), sample_rate);
+               framecnt_t duration = parent.timespan->get_length () + sb + se;
+               max_frames = min ((framecnt_t) 8192 * channels, max ((framecnt_t) 4096 * channels, max_frames));
+               chunker.reset (new Chunker<Sample> (max_frames));
                analyser.reset (new Analyser (config.format->sample_rate(), channels, max_frames,
-                                       (framecnt_t) ceil (parent.timespan->get_length () * config.format->sample_rate () / (double) parent.session.nominal_frame_rate ())));
+                                       (framecnt_t) ceil (duration * config.format->sample_rate () / (double) sample_rate)));
+               chunker->add_output (analyser);
                parent.add_analyser (config.filename->get_path (config.format), analyser);
        }
 
@@ -332,11 +339,19 @@ ExportGraphBuilder::SFC::SFC (ExportGraphBuilder &parent, FileSpec const & new_c
        }
 }
 
+void
+ExportGraphBuilder::SFC::set_peak (float gain)
+{
+       if (_analyse) {
+               analyser->set_normalization_gain (gain);
+       }
+}
+
 ExportGraphBuilder::FloatSinkPtr
 ExportGraphBuilder::SFC::sink ()
 {
        if (_analyse) {
-               return analyser;
+               return chunker;
        } else if (data_width == 8 || data_width == 16) {
                return short_converter;
        } else if (data_width == 24 || data_width == 32) {
@@ -476,7 +491,10 @@ ExportGraphBuilder::Normalizer::process()
 void
 ExportGraphBuilder::Normalizer::start_post_processing()
 {
-       normalizer->set_peak (peak_reader->get_peak());
+       const float gain = normalizer->set_peak (peak_reader->get_peak());
+       for (boost::ptr_list<SFC>::iterator i = children.begin(); i != children.end(); ++i) {
+               (*i).set_peak (gain);
+       }
        tmp_file->seek (0, SEEK_SET);
        tmp_file->add_output (normalizer);
        parent.normalizers.push_back (this);