#include "format.h"
#include "job.h"
#include "filter.h"
-#include "transcoder.h"
#include "util.h"
#include "job_manager.h"
#include "ab_transcode_job.h"
#include "config.h"
#include "version.h"
#include "ui_signaller.h"
-#include "video_decoder.h"
-#include "audio_decoder.h"
-#include "sndfile_decoder.h"
#include "analyse_audio_job.h"
#include "playlist.h"
#include "player.h"
#include "ffmpeg_content.h"
#include "imagemagick_content.h"
#include "sndfile_content.h"
+#include "dcp_content_type.h"
#include "i18n.h"
using std::min;
using std::make_pair;
using std::endl;
+using std::cout;
using std::list;
using boost::shared_ptr;
using boost::lexical_cast;
, _dirty (false)
{
set_dci_date_today ();
+
+ _playlist->ContentChanged.connect (bind (&Film::content_changed, this, _1, _2));
/* Make state.directory a complete path without ..s (where possible)
(Code swiped from Adam Bowen on stackoverflow)
_content.push_back ((*i)->clone ());
}
+ _playlist->ContentChanged.connect (bind (&Film::content_changed, this, _1, _2));
+
_playlist->setup (_content);
}
_dci_metadata.as_xml (root->add_child ("DCIMetadata"));
root->add_child("DCPFrameRate")->add_child_text (boost::lexical_cast<string> (_dcp_frame_rate));
root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
+ _audio_mapping.as_xml (root->add_child("AudioMapping"));
for (ContentList::iterator i = the_content.begin(); i != the_content.end(); ++i) {
(*i)->as_xml (root->add_child ("Content"));
for (list<shared_ptr<cxml::Node> >::iterator i = c.begin(); i != c.end(); ++i) {
string const type = (*i)->string_child ("Type");
+ boost::shared_ptr<Content> c;
if (type == "FFmpeg") {
- _content.push_back (shared_ptr<Content> (new FFmpegContent (*i)));
+ c.reset (new FFmpegContent (*i));
} else if (type == "ImageMagick") {
- _content.push_back (shared_ptr<Content> (new ImageMagickContent (*i)));
+ c.reset (new ImageMagickContent (*i));
} else if (type == "Sndfile") {
- _content.push_back (shared_ptr<Content> (new SndfileContent (*i)));
+ c.reset (new SndfileContent (*i));
}
+
+ _content.push_back (c);
}
+ /* This must come after we've loaded the content, as we're looking things up in _content */
+ _audio_mapping.set_from_xml (_content, f.node_child ("AudioMapping"));
+
_dirty = false;
_playlist->setup (_content);
case Film::CONTENT:
_playlist->setup (content ());
set_dcp_frame_rate (best_dcp_frame_rate (video_frame_rate ()));
+ set_audio_mapping (_playlist->default_audio_mapping ());
break;
default:
break;
{
boost::mutex::scoped_lock lm (_state_mutex);
_content.push_back (c);
- _content_connections.push_back (c->Changed.connect (bind (&Film::content_changed, this, _1)));
}
signal_changed (CONTENT);
if (i != _content.end ()) {
_content.erase (i);
}
-
- for (list<boost::signals2::connection>::iterator i = _content_connections.begin(); i != _content_connections.end(); ++i) {
- i->disconnect ();
- }
-
- for (ContentList::iterator i = _content.begin(); i != _content.end(); ++i) {
- _content_connections.push_back (c->Changed.connect (bind (&Film::content_changed, this, _1)));
- }
}
signal_changed (CONTENT);
--j;
swap (*i, *j);
- _playlist->setup (_content);
}
signal_changed (CONTENT);
}
swap (*i, *j);
- _playlist->setup (_content);
}
signal_changed (CONTENT);
vector<FFmpegSubtitleStream>
Film::ffmpeg_subtitle_streams () const
{
- boost::shared_ptr<FFmpegContent> f = ffmpeg ();
+ shared_ptr<FFmpegContent> f = ffmpeg ();
if (f) {
return f->subtitle_streams ();
}
boost::optional<FFmpegSubtitleStream>
Film::ffmpeg_subtitle_stream () const
{
- boost::shared_ptr<FFmpegContent> f = ffmpeg ();
+ shared_ptr<FFmpegContent> f = ffmpeg ();
if (f) {
return f->subtitle_stream ();
}
vector<FFmpegAudioStream>
Film::ffmpeg_audio_streams () const
{
- boost::shared_ptr<FFmpegContent> f = ffmpeg ();
+ shared_ptr<FFmpegContent> f = ffmpeg ();
if (f) {
return f->audio_streams ();
}
boost::optional<FFmpegAudioStream>
Film::ffmpeg_audio_stream () const
{
- boost::shared_ptr<FFmpegContent> f = ffmpeg ();
+ shared_ptr<FFmpegContent> f = ffmpeg ();
if (f) {
return f->audio_stream ();
}
void
Film::set_ffmpeg_subtitle_stream (FFmpegSubtitleStream s)
{
- boost::shared_ptr<FFmpegContent> f = ffmpeg ();
+ shared_ptr<FFmpegContent> f = ffmpeg ();
if (f) {
f->set_subtitle_stream (s);
}
void
Film::set_ffmpeg_audio_stream (FFmpegAudioStream s)
{
- boost::shared_ptr<FFmpegContent> f = ffmpeg ();
+ shared_ptr<FFmpegContent> f = ffmpeg ();
if (f) {
f->set_audio_stream (s);
}
}
void
-Film::content_changed (int p)
+Film::set_audio_mapping (AudioMapping m)
+{
+ {
+ boost::mutex::scoped_lock lm (_state_mutex);
+ _audio_mapping = m;
+ }
+
+ signal_changed (AUDIO_MAPPING);
+}
+
+void
+Film::content_changed (boost::weak_ptr<Content> c, int p)
{
if (p == VideoContentProperty::VIDEO_FRAME_RATE) {
set_dcp_frame_rate (best_dcp_frame_rate (video_frame_rate ()));
- }
+ } else if (p == AudioContentProperty::AUDIO_CHANNELS) {
+ set_audio_mapping (_playlist->default_audio_mapping ());
+ }
if (ui_signaller) {
- ui_signaller->emit (boost::bind (boost::ref (ContentChanged), p));
+ ui_signaller->emit (boost::bind (boost::ref (ContentChanged), c, p));
}
}