Move make_default into AudioMapping.
authorCarl Hetherington <cth@carlh.net>
Fri, 23 Nov 2018 00:24:09 +0000 (00:24 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 23 Nov 2018 00:24:09 +0000 (00:24 +0000)
src/lib/audio_mapping.cc
src/lib/audio_mapping.h
src/lib/dcp_content.cc
src/lib/ffmpeg_content.cc
src/lib/film.cc
src/lib/film.h

index bf454b5e5e43cddbdfa48695e5e9fc01eacc863d..86add09f4cb4330cdcc039fb9d8477f83e8f4465 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2018 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 #include "audio_mapping.h"
 #include "util.h"
 #include "digester.h"
+#include "audio_processor.h"
 #include <dcp/raw_convert.h>
 #include <libcxml/cxml.h>
 #include <libxml++/libxml++.h>
+#include <boost/regex.hpp>
 #include <iostream>
 
 using std::list;
@@ -36,6 +38,7 @@ using std::vector;
 using std::abs;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
+using boost::optional;
 using dcp::raw_convert;
 
 AudioMapping::AudioMapping ()
@@ -78,6 +81,51 @@ AudioMapping::make_zero ()
        }
 }
 
+void
+AudioMapping::make_default (AudioProcessor const * processor, optional<boost::filesystem::path> filename)
+{
+       static string const regex[] = {
+               ".*[\\._-]L[\\._-].*",
+               ".*[\\._-]R[\\._-].*",
+               ".*[\\._-]C[\\._-].*",
+               ".*[\\._-]Lfe[\\._-].*",
+               ".*[\\._-]Ls[\\._-].*",
+               ".*[\\._-]Rs[\\._-].*"
+       };
+
+       static int const regexes = sizeof(regex) / sizeof(*regex);
+
+       if (processor) {
+               processor->make_audio_mapping_default (*this);
+       } else {
+               make_zero ();
+               if (input_channels() == 1) {
+                       bool guessed = false;
+
+                       /* See if we can guess where this stream should go */
+                       if (filename) {
+                               for (int i = 0; i < regexes; ++i) {
+                                       boost::regex e (regex[i], boost::regex::icase);
+                                       if (boost::regex_match(filename->string(), e) && i < output_channels()) {
+                                               set (0, i, 1);
+                                               guessed = true;
+                                       }
+                               }
+                       }
+
+                       if (!guessed) {
+                               /* If we have no idea, just put it on centre */
+                               set (0, static_cast<int>(dcp::CENTRE), 1);
+                       }
+               } else {
+                       /* 1:1 mapping */
+                       for (int i = 0; i < min (input_channels(), output_channels()); ++i) {
+                               set (i, i, 1);
+                       }
+               }
+       }
+}
+
 AudioMapping::AudioMapping (cxml::ConstNodePtr node, int state_version)
 {
        if (state_version < 32) {
index 1a3c16ef9a2da957581e650de7b4f06c7c947ab8..8add0ec8350ee3179d7c053881fcda927276c999 100644 (file)
@@ -32,6 +32,8 @@ namespace xmlpp {
        class Node;
 }
 
+class AudioProcessor;
+
 /** @class AudioMapping.
  *  @brief A many-to-many mapping of audio channels.
  */
@@ -47,6 +49,7 @@ public:
        void as_xml (xmlpp::Node *) const;
 
        void make_zero ();
+       void make_default (AudioProcessor const * processor, boost::optional<boost::filesystem::path> filename = boost::optional<boost::filesystem::path>());
 
        void set (int input_channel, int output_channel, float);
        float get (int input_channel, int output_channel) const;
index b455e7f7f63b7e4018fbc39600a1b9e78cd8de67..c89eadc3c97d89a49f6b133ea28462b3777c16e1 100644 (file)
@@ -212,7 +212,7 @@ DCPContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
                AudioStreamPtr as (new AudioStream (examiner->audio_frame_rate(), examiner->audio_length(), examiner->audio_channels()));
                audio->set_stream (as);
                AudioMapping m = as->mapping ();
-               film->make_audio_mapping_default (m);
+               m.make_default (film->audio_processor());
                as->set_mapping (m);
        }
 
index 34a6e144432f2d3d467e3a925eb8441cd7678dc9..9192006796aefeda43d64a7a763f7beece3e98dc 100644 (file)
@@ -307,7 +307,7 @@ FFmpegContent::examine (shared_ptr<const Film> film, shared_ptr<Job> job)
 
                        AudioStreamPtr as = audio->streams().front();
                        AudioMapping m = as->mapping ();
-                       film->make_audio_mapping_default (m, first_path);
+                       m.make_default (film->audio_processor(), first_path);
                        as->set_mapping (m);
                }
 
index 60b80d052689de056619a2dc8b967fba4f46f66b..d27b15a65e9af124ee7db2d23f8e864197abe7b2 100644 (file)
@@ -1438,55 +1438,6 @@ Film::subtitle_language () const
        return all;
 }
 
-/** Change the gains of the supplied AudioMapping to make it a default
- *  for this film.  The defaults are guessed based on what processor (if any)
- *  is in use, the number of input channels and any filename supplied.
- */
-void
-Film::make_audio_mapping_default (AudioMapping& mapping, optional<boost::filesystem::path> filename) const
-{
-       static string const regex[] = {
-               ".*[\\._-]L[\\._-].*",
-               ".*[\\._-]R[\\._-].*",
-               ".*[\\._-]C[\\._-].*",
-               ".*[\\._-]Lfe[\\._-].*",
-               ".*[\\._-]Ls[\\._-].*",
-               ".*[\\._-]Rs[\\._-].*"
-       };
-
-       static int const regexes = sizeof(regex) / sizeof(*regex);
-
-       if (audio_processor ()) {
-               audio_processor()->make_audio_mapping_default (mapping);
-       } else {
-               mapping.make_zero ();
-               if (mapping.input_channels() == 1) {
-                       bool guessed = false;
-
-                       /* See if we can guess where this stream should go */
-                       if (filename) {
-                               for (int i = 0; i < regexes; ++i) {
-                                       boost::regex e (regex[i], boost::regex::icase);
-                                       if (boost::regex_match (filename->string(), e) && i < mapping.output_channels()) {
-                                               mapping.set (0, i, 1);
-                                               guessed = true;
-                                       }
-                               }
-                       }
-
-                       if (!guessed) {
-                               /* If we have no idea, just put it on centre */
-                               mapping.set (0, static_cast<int> (dcp::CENTRE), 1);
-                       }
-               } else {
-                       /* 1:1 mapping */
-                       for (int i = 0; i < min (mapping.input_channels(), mapping.output_channels()); ++i) {
-                               mapping.set (i, i, 1);
-                       }
-               }
-       }
-}
-
 /** @return The names of the channels that audio contents' outputs are passed into;
  *  this is either the DCP or a AudioProcessor.
  */
index 4656da9de81f08c04385a97f23fbbfff7f6db931..3fb24af934e5c999f84b4d49d55e1427b85c9808 100644 (file)
@@ -155,11 +155,6 @@ public:
 
        std::string subtitle_language () const;
 
-       void make_audio_mapping_default (
-               AudioMapping & mapping,
-               boost::optional<boost::filesystem::path> filename = boost::optional<boost::filesystem::path> ()
-               ) const;
-
        std::vector<std::string> audio_output_names () const;
 
        void repeat_content (ContentList, int);