Emit no audio from DCPs if none is mapped
[dcpomatic.git] / src / lib / content_factory.cc
index e912589fcb9e89e51603dde5ec666423cfbcf407..dfa1ba55e4d4795ebdc66e23408390ec7c1b7814 100644 (file)
@@ -40,6 +40,7 @@
 #include "log.h"
 #include "compose.hpp"
 #include <libcxml/cxml.h>
+#include <dcp/filesystem.h>
 #include <dcp/smpte_subtitle_asset.h>
 #include <boost/algorithm/string.hpp>
 
@@ -50,7 +51,7 @@ using std::list;
 using std::make_shared;
 using std::shared_ptr;
 using std::string;
-using boost::optional;
+using std::vector;
 
 
 /** Create a Content object from an XML node.
@@ -67,37 +68,35 @@ content_factory (cxml::ConstNodePtr node, int version, list<string>& notes)
        std::shared_ptr<Content> content;
 
        if (type == "FFmpeg") {
-               /* SndfileContent is now handled by the FFmpeg code rather than by
-                  separate libsndfile-based code.
-               */
-               content.reset (new FFmpegContent(node, version, notes));
+               content = make_shared<FFmpegContent>(node, version, notes);
        } else if (type == "Image") {
-               content.reset (new ImageContent(node, version));
+               content = make_shared<ImageContent>(node, version);
        } else if (type == "Sndfile") {
                /* SndfileContent is now handled by the FFmpeg code rather than by
                   separate libsndfile-based code.
                */
-               content.reset (new FFmpegContent(node, version, notes));
+               content = make_shared<FFmpegContent>(node, version, notes);
 
                content->audio->set_stream (
                        make_shared<FFmpegAudioStream>(
                                "Stream", 0,
                                node->number_child<int> ("AudioFrameRate"),
                                node->number_child<Frame> ("AudioLength"),
-                               AudioMapping (node->node_child ("AudioMapping"), version)
+                               AudioMapping(node->node_child("AudioMapping"), version),
+                               16
                                )
                        );
 
        } else if (type == "SubRip" || type == "TextSubtitle") {
-               content.reset (new StringTextFileContent(node, version));
+               content = make_shared<StringTextFileContent>(node, version, notes);
        } else if (type == "DCP") {
-               content.reset (new DCPContent(node, version));
+               content = make_shared<DCPContent>(node, version);
        } else if (type == "DCPSubtitle") {
-               content.reset (new DCPSubtitleContent(node, version));
+               content = make_shared<DCPSubtitleContent>(node, version);
        } else if (type == "VideoMXF") {
-               content.reset (new VideoMXFContent(node, version));
+               content = make_shared<VideoMXFContent>(node, version);
        } else if (type == "AtmosMXF") {
-               content.reset (new AtmosMXFContent(node, version));
+               content = make_shared<AtmosMXFContent>(node, version);
        }
 
        return content;
@@ -108,16 +107,16 @@ content_factory (cxml::ConstNodePtr node, int version, list<string>& notes)
  *  @param path File or directory.
  *  @return Content objects.
  */
-list<shared_ptr<Content>>
+vector<shared_ptr<Content>>
 content_factory (boost::filesystem::path path)
 {
-       list<shared_ptr<Content>> content;
+       vector<shared_ptr<Content>> content;
 
-       if (boost::filesystem::is_directory (path)) {
+       if (dcp::filesystem::is_directory(path)) {
 
                LOG_GENERAL ("Look in directory %1", path);
 
-               if (boost::filesystem::is_empty (path)) {
+               if (dcp::filesystem::is_empty(path)) {
                        return content;
                }
 
@@ -126,17 +125,17 @@ content_factory (boost::filesystem::path path)
                int image_files = 0;
                int sound_files = 0;
                int read = 0;
-               for (boost::filesystem::directory_iterator i(path); i != boost::filesystem::directory_iterator() && read < 10; ++i) {
+               for (dcp::filesystem::directory_iterator i(path); i != dcp::filesystem::directory_iterator() && read < 10; ++i) {
 
                        LOG_GENERAL ("Checking file %1", i->path());
 
-                       if (boost::starts_with (i->path().leaf().string(), ".")) {
+                       if (boost::starts_with(i->path().filename().string(), ".")) {
                                /* We ignore hidden files */
                                LOG_GENERAL ("Ignored %1 (starts with .)", i->path());
                                continue;
                        }
 
-                       if (!boost::filesystem::is_regular_file(i->path())) {
+                       if (!dcp::filesystem::is_regular_file(i->path())) {
                                /* Ignore things which aren't files (probably directories) */
                                LOG_GENERAL ("Ignored %1 (not a regular file)", i->path());
                                continue;
@@ -156,7 +155,7 @@ content_factory (boost::filesystem::path path)
                if (image_files > 0 && sound_files == 0)  {
                        content.push_back (make_shared<ImageContent>(path));
                } else if (image_files == 0 && sound_files > 0) {
-                       for (auto i: boost::filesystem::directory_iterator(path)) {
+                       for (auto i: dcp::filesystem::directory_iterator(path)) {
                                content.push_back (make_shared<FFmpegContent>(i.path()));
                        }
                }
@@ -169,26 +168,26 @@ content_factory (boost::filesystem::path path)
                transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
 
                if (valid_image_file (path)) {
-                       single.reset (new ImageContent(path));
-               } else if (ext == ".srt" || ext == ".ssa" || ext == ".ass" || ext == ".stl") {
-                       single.reset (new StringTextFileContent(path));
+                       single = make_shared<ImageContent>(path);
+               } else if (ext == ".srt" || ext == ".ssa" || ext == ".ass" || ext == ".stl" || ext == ".vtt") {
+                       single = make_shared<StringTextFileContent>(path);
                } else if (ext == ".xml") {
                        cxml::Document doc;
-                       doc.read_file (path);
+                       doc.read_file(dcp::filesystem::fix_long_path(path));
                        if (doc.root_name() == "DCinemaSecurityMessage") {
                                throw KDMAsContentError ();
                        }
-                       single.reset (new DCPSubtitleContent(path));
+                       single = make_shared<DCPSubtitleContent>(path);
                } else if (ext == ".mxf" && dcp::SMPTESubtitleAsset::valid_mxf(path)) {
-                       single.reset (new DCPSubtitleContent(path));
+                       single = make_shared<DCPSubtitleContent>(path);
                } else if (ext == ".mxf" && VideoMXFContent::valid_mxf(path)) {
-                       single.reset (new VideoMXFContent(path));
+                       single = make_shared<VideoMXFContent>(path);
                } else if (ext == ".mxf" && AtmosMXFContent::valid_mxf(path)) {
-                       single.reset (new AtmosMXFContent(path));
+                       single = make_shared<AtmosMXFContent>(path);
                }
 
                if (!single) {
-                       single.reset (new FFmpegContent(path));
+                       single = make_shared<FFmpegContent>(path);
                }
 
                content.push_back (single);