+ 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'.
+ */
+ shared_ptr<const AudioContent> ac = dynamic_pointer_cast<const AudioContent> (playlist->content().front ());
+ DCPOMATIC_ASSERT (ac);
+ return ac->audio_gain() - analysis_gain().get ();
+ }
+
+ return 0.0f;