X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Faudio_content.cc;h=bd857b313d418da8fcc674ee25f8abd3ed8f3221;hp=e363cfebde553a6dc0826cffd9624dcd7c19ba98;hb=a60668a37f05a125954ac5e03db0530995ac5769;hpb=aaf6845e130ac208cee524536b67c54bd1ce8ed9 diff --git a/src/lib/audio_content.cc b/src/lib/audio_content.cc index e363cfebd..bd857b313 100644 --- a/src/lib/audio_content.cc +++ b/src/lib/audio_content.cc @@ -22,6 +22,7 @@ #include "audio_content.h" #include "compose.hpp" #include "config.h" +#include "constants.h" #include "exceptions.h" #include "film.h" #include "frame_rate_change.h" @@ -312,7 +313,10 @@ AudioContent::add_properties (shared_ptr film, list& p if (stream) { p.push_back (UserProperty(UserProperty::AUDIO, _("Channels"), stream->channels())); - p.push_back (UserProperty(UserProperty::AUDIO, _("Content audio sample rate"), stream->frame_rate(), _("Hz"))); + p.push_back (UserProperty(UserProperty::AUDIO, _("Content sample rate"), stream->frame_rate(), _("Hz"))); + if (auto bits = stream->bit_depth()) { + p.push_back(UserProperty(UserProperty::AUDIO, _("Content bit depth"), *bits, _("bits"))); + } } FrameRateChange const frc (_parent->active_video_frame_rate(film), film->video_frame_rate()); @@ -401,13 +405,12 @@ AudioContent::take_settings_from (shared_ptr c) set_fade_in (c->fade_in()); set_fade_out (c->fade_out()); - size_t i = 0; - size_t j = 0; + auto const streams_to_take = std::min(_streams.size(), c->_streams.size()); - while (i < _streams.size() && j < c->_streams.size()) { - _streams[i]->set_mapping (c->_streams[j]->mapping()); - ++i; - ++j; + for (auto i = 0U; i < streams_to_take; ++i) { + auto mapping = _streams[i]->mapping(); + mapping.take_from(c->_streams[i]->mapping()); + _streams[i]->set_mapping(mapping); } } @@ -420,11 +423,13 @@ AudioContent::modify_position (shared_ptr film, DCPTime& pos) const void -AudioContent::modify_trim_start (ContentTime& trim) const +AudioContent::modify_trim_start(shared_ptr film, ContentTime& trim) const { - DCPOMATIC_ASSERT (!_streams.empty()); - /* XXX: we're in trouble if streams have different rates */ - trim = trim.round (_streams.front()->frame_rate()); + /* When this trim is used it the audio will have been resampled, and using the + * DCP rate here reduces the chance of rounding errors causing audio glitches + * due to errors in placement of audio frames (#2373). + */ + trim = trim.round(film ? film->audio_frame_rate() : 48000); }