/*
- 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;
using std::abs;
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
+using boost::optional;
using dcp::raw_convert;
AudioMapping::AudioMapping ()
}
}
+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) {
class Node;
}
+class AudioProcessor;
+
/** @class AudioMapping.
* @brief A many-to-many mapping of audio channels.
*/
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;
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);
}
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);
}
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.
*/
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);