From: Carl Hetherington Date: Sun, 28 Apr 2013 17:16:05 +0000 (+0100) Subject: Merge master. X-Git-Tag: v2.0.48~1337^2~409^2~2 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=9525e7726e4d488f193957d4fcf1cc1725581ae8 Merge master. --- 9525e7726e4d488f193957d4fcf1cc1725581ae8 diff --cc src/lib/sndfile_decoder.cc index 4db45f1d4,fdaf2eeaa..9ba972e56 --- a/src/lib/sndfile_decoder.cc +++ b/src/lib/sndfile_decoder.cc @@@ -31,26 -30,67 +31,24 @@@ using std::string using std::min; using std::cout; using boost::shared_ptr; -using boost::optional; -SndfileDecoder::SndfileDecoder (shared_ptr f, DecodeOptions o) - : Decoder (f, o) - , AudioDecoder (f, o) - , _done (0) - , _frames (0) +SndfileDecoder::SndfileDecoder (shared_ptr f, shared_ptr c) + : Decoder (f) + , AudioDecoder (f) + , _sndfile_content (c) { - _done = 0; - _frames = 0; - - vector const files = _film->external_audio (); - - int N = 0; - for (size_t i = 0; i < files.size(); ++i) { - if (!files[i].empty()) { - N = i + 1; - } - } - - if (N == 0) { - return; + _sndfile = sf_open (_sndfile_content->file().string().c_str(), SFM_READ, &_info); + if (!_sndfile) { + throw DecodeError (_("could not open audio file for reading")); } - bool first = true; - - for (size_t i = 0; i < (size_t) N; ++i) { - if (files[i].empty ()) { - _sndfiles.push_back (0); - } else { - SF_INFO info; - SNDFILE* s = sf_open (files[i].c_str(), SFM_READ, &info); - if (!s) { - throw DecodeError (_("could not open external audio file for reading")); - } - - if (info.channels != 1) { - throw DecodeError (_("external audio files must be mono")); - } - - _sndfiles.push_back (s); + _done = 0; + _remaining = _info.frames; +} - if (first) { - shared_ptr st ( - new SndfileStream ( - info.samplerate, av_get_default_channel_layout (N) - ) - ); - - _audio_streams.push_back (st); - _audio_stream = st; - _frames = info.frames; - first = false; - } else { - if (info.frames != _frames) { - throw DecodeError (_("external audio files have differing lengths")); - } - } - } - } +SndfileDecoder::~SndfileDecoder () +{ - if (_sndfile) { - sf_close (_sndfile); - } ++ sf_close (_sndfile); } bool diff --cc src/lib/sndfile_decoder.h index b999a66d1,9489cb5ec..1d212cc9b --- a/src/lib/sndfile_decoder.h +++ b/src/lib/sndfile_decoder.h @@@ -31,17 -49,8 +31,14 @@@ public bool pass (); + int audio_channels () const; + ContentAudioFrame audio_length () const; + int audio_frame_rate () const; + private: - SNDFILE* open_file (sf_count_t &); - void close_file (SNDFILE*); - - std::vector _sndfiles; - sf_count_t _done; - sf_count_t _frames; + boost::shared_ptr _sndfile_content; + SNDFILE* _sndfile; + SF_INFO _info; + ContentAudioFrame _done; + ContentAudioFrame _remaining; };