+ if (_sample_peak) {
+ root->add_child("SamplePeak")->add_child_text (raw_convert<string> (_sample_peak.get ()));
+ root->add_child("SamplePeakTime")->add_child_text (raw_convert<string> (_sample_peak_time.get().get ()));
+ }
+
+ if (_true_peak) {
+ root->add_child("TruePeak")->add_child_text (raw_convert<string> (_true_peak.get ()));
+ }
+
+ if (_integrated_loudness) {
+ root->add_child("IntegratedLoudness")->add_child_text (raw_convert<string> (_integrated_loudness.get ()));
+ }
+
+ if (_loudness_range) {
+ root->add_child("LoudnessRange")->add_child_text (raw_convert<string> (_loudness_range.get ()));
+ }
+
+ if (_analysis_gain) {
+ root->add_child("AnalysisGain")->add_child_text (raw_convert<string> (_analysis_gain.get ()));
+ }
+
+ doc->write_to_file_formatted (filename.string ());
+}
+
+float
+AudioAnalysis::gain_correction (shared_ptr<const Playlist> playlist)
+{
+ if (playlist->content().size() == 1 && analysis_gain ()) {
+ /* In this case we know that the analysis was of a single piece of content and
+ we know that content's gain when the analysis was run. Hence we can work out
+ what correction is now needed to make it look `right'.
+ */
+ DCPOMATIC_ASSERT (playlist->content().front()->audio);
+ return playlist->content().front()->audio->gain() - analysis_gain().get ();
+ }
+
+ return 0.0f;