using std::vector;
using std::max;
using std::pair;
-using boost::shared_ptr;
+using std::shared_ptr;
using boost::optional;
using dcp::raw_convert;
using dcp::locale_convert;
+using namespace dcpomatic;
int const ContentProperty::PATH = 400;
int const ContentProperty::POSITION = 401;
: _change_signals_frequent (false)
{
list<cxml::NodePtr> path_children = node->node_children ("Path");
- BOOST_FOREACH (cxml::NodePtr i, path_children) {
+ for (auto i: path_children) {
_paths.push_back (i->content());
optional<time_t> const mod = i->optional_number_attribute<time_t>("mtime");
if (mod) {
_digest = d;
_last_write_times.clear ();
- BOOST_FOREACH (boost::filesystem::path i, _paths) {
+ for (auto i: _paths) {
_last_write_times.push_back (boost::filesystem::last_write_time(i));
}
}
} else {
emit (boost::bind (boost::ref(Change), c, shared_from_this(), p, _change_signals_frequent));
}
- } catch (boost::bad_weak_ptr &) {
+ } catch (std::bad_weak_ptr &) {
/* This must be during construction; never mind */
}
}
void
-Content::set_position (shared_ptr<const Film> film, DCPTime p)
+Content::set_position (shared_ptr<const Film> film, DCPTime p, bool force_emit)
{
/* video and audio content can modify its position */
video->modify_position (film, p);
}
- if (audio) {
+ /* Only allow the audio to modify if we have no video;
+ sometimes p can't be on an integer video AND audio frame,
+ and in these cases we want the video constraint to be
+ satisfied since (I think) the audio code is better able to
+ cope.
+ */
+ if (!video && audio) {
audio->modify_position (film, p);
}
{
boost::mutex::scoped_lock lm (_mutex);
- if (p == _position) {
+ if (p == _position && !force_emit) {
cc.abort ();
return;
}
video->modify_trim_start (t);
}
- if (audio) {
+ /* See note in ::set_position */
+ if (!video && audio) {
audio->modify_trim_start (t);
}
DCPTime
Content::length_after_trim (shared_ptr<const Film> film) const
{
- return max (DCPTime(), full_length(film) - DCPTime(trim_start() + trim_end(), film->active_frame_rate_change(position())));
+ DCPTime length = max(DCPTime(), full_length(film) - DCPTime(trim_start() + trim_end(), film->active_frame_rate_change(position())));
+ if (video) {
+ length = length.round(film->video_frame_rate());
+ }
+ return length;
}
/** @return string which changes when something about this content changes which affects
bool
Content::paths_valid () const
{
- BOOST_FOREACH (boost::filesystem::path i, _paths) {
+ for (auto i: _paths) {
if (!boost::filesystem::exists (i)) {
return false;
}
boost::mutex::scoped_lock lm (_mutex);
_paths = paths;
_last_write_times.clear ();
- BOOST_FOREACH (boost::filesystem::path i, _paths) {
+ for (auto i: _paths) {
_last_write_times.push_back (boost::filesystem::last_write_time(i));
}
}
shared_ptr<TextContent>
Content::text_of_original_type (TextType type) const
{
- BOOST_FOREACH (shared_ptr<TextContent> i, text) {
+ for (auto i: text) {
if (i->original_type() == type) {
return i;
}