+string
+AudioContent::processing_description (shared_ptr<const Film> film) const
+{
+ if (streams().empty ()) {
+ return "";
+ }
+
+ /* Possible answers are:
+ 1. all audio will be resampled from x to y.
+ 2. all audio will be resampled to y (from a variety of rates)
+ 3. some audio will be resampled to y (from a variety of rates)
+ 4. nothing will be resampled.
+ */
+
+ bool not_resampled = false;
+ bool resampled = false;
+ bool same = true;
+
+ optional<int> common_frame_rate;
+ BOOST_FOREACH (AudioStreamPtr i, streams()) {
+ if (i->frame_rate() != resampled_frame_rate(film)) {
+ resampled = true;
+ } else {
+ not_resampled = true;
+ }
+
+ if (common_frame_rate && common_frame_rate != i->frame_rate ()) {
+ same = false;
+ }
+ common_frame_rate = i->frame_rate ();
+ }
+
+ if (not_resampled && !resampled) {
+ return _("Audio will not be resampled");
+ }
+
+ if (not_resampled && resampled) {
+ return String::compose (_("Some audio will be resampled to %1Hz"), resampled_frame_rate(film));
+ }
+
+ if (!not_resampled && resampled) {
+ if (same) {
+ return String::compose (_("Audio will be resampled from %1Hz to %2Hz"), common_frame_rate.get(), resampled_frame_rate(film));
+ } else {
+ return String::compose (_("Audio will be resampled to %1Hz"), resampled_frame_rate(film));
+ }
+ }
+
+ return "";
+}
+
+/** @return true if any stream in this content has a sampling rate of more than 48kHz */
+bool
+AudioContent::has_rate_above_48k () const
+{
+ BOOST_FOREACH (AudioStreamPtr i, streams ()) {
+ if (i->frame_rate() > 48000) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/** @return User-visible names of each of our audio channels */
+vector<string>
+AudioContent::channel_names () const
+{
+ vector<string> n;
+
+ int t = 1;
+ BOOST_FOREACH (AudioStreamPtr i, streams ()) {
+ for (int j = 0; j < i->channels(); ++j) {
+ n.push_back (String::compose ("%1:%2", t, j + 1));
+ }
+ ++t;
+ }
+
+ return n;
+}
+
+void
+AudioContent::add_properties (shared_ptr<const Film> film, list<UserProperty>& p) const