From a8d24d35dc999228f804ed425c0d9e90b9ddceaa Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 28 Apr 2013 16:23:35 +0100 Subject: [PATCH] Fix broken external audio support. --- ChangeLog | 4 +++ src/lib/sndfile_decoder.cc | 68 ++++++++++++++------------------------ src/lib/sndfile_decoder.h | 6 ++-- 3 files changed, 33 insertions(+), 45 deletions(-) diff --git a/ChangeLog b/ChangeLog index 129d148e9..64db7a3ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-04-28 Carl Hetherington + + * Fix broken external audio support. + 2013-04-24 Carl Hetherington * Allow use of existing empty directories for new films (without diff --git a/src/lib/sndfile_decoder.cc b/src/lib/sndfile_decoder.cc index af59c049c..fdaf2eeaa 100644 --- a/src/lib/sndfile_decoder.cc +++ b/src/lib/sndfile_decoder.cc @@ -36,15 +36,12 @@ using boost::optional; SndfileDecoder::SndfileDecoder (shared_ptr f, DecodeOptions o) : Decoder (f, o) , AudioDecoder (f, o) + , _done (0) + , _frames (0) { - sf_count_t frames; - vector sf = open_files (frames); - close_files (sf); -} - -vector -SndfileDecoder::open_files (sf_count_t & frames) -{ + _done = 0; + _frames = 0; + vector const files = _film->external_audio (); int N = 0; @@ -55,16 +52,14 @@ SndfileDecoder::open_files (sf_count_t & frames) } if (N == 0) { - return vector (); + return; } bool first = true; - frames = 0; - vector sndfiles; for (size_t i = 0; i < (size_t) N; ++i) { if (files[i].empty ()) { - sndfiles.push_back (0); + _sndfiles.push_back (0); } else { SF_INFO info; SNDFILE* s = sf_open (files[i].c_str(), SFM_READ, &info); @@ -76,7 +71,7 @@ SndfileDecoder::open_files (sf_count_t & frames) throw DecodeError (_("external audio files must be mono")); } - sndfiles.push_back (s); + _sndfiles.push_back (s); if (first) { shared_ptr st ( @@ -87,60 +82,47 @@ SndfileDecoder::open_files (sf_count_t & frames) _audio_streams.push_back (st); _audio_stream = st; - frames = info.frames; + _frames = info.frames; first = false; } else { - if (info.frames != frames) { + if (info.frames != _frames) { throw DecodeError (_("external audio files have differing lengths")); } } } } - - return sndfiles; } bool SndfileDecoder::pass () { - sf_count_t frames; - vector sndfiles = open_files (frames); - if (sndfiles.empty()) { - return true; - } - /* Do things in half second blocks as I think there may be limits to what FFmpeg (and in particular the resampler) can cope with. */ sf_count_t const block = _audio_stream->sample_rate() / 2; shared_ptr audio (new AudioBuffers (_audio_stream->channels(), block)); - sf_count_t done = 0; - while (frames > 0) { - sf_count_t const this_time = min (block, frames); - for (size_t i = 0; i < sndfiles.size(); ++i) { - if (!sndfiles[i]) { - audio->make_silent (i); - } else { - sf_read_float (sndfiles[i], audio->data(i), block); - } + sf_count_t const this_time = min (block, _frames - _done); + for (size_t i = 0; i < _sndfiles.size(); ++i) { + if (!_sndfiles[i]) { + audio->make_silent (i); + } else { + sf_read_float (_sndfiles[i], audio->data(i), this_time); } - - audio->set_frames (this_time); - Audio (audio, double(done) / _audio_stream->sample_rate()); - done += this_time; - frames -= this_time; } - close_files (sndfiles); + audio->set_frames (this_time); + Audio (audio, double(_done) / _audio_stream->sample_rate()); + _done += this_time; - return true; + return (_done == _frames); } -void -SndfileDecoder::close_files (vector const & sndfiles) +SndfileDecoder::~SndfileDecoder () { - for (size_t i = 0; i < sndfiles.size(); ++i) { - sf_close (sndfiles[i]); + for (size_t i = 0; i < _sndfiles.size(); ++i) { + if (_sndfiles[i]) { + sf_close (_sndfiles[i]); + } } } diff --git a/src/lib/sndfile_decoder.h b/src/lib/sndfile_decoder.h index e16eab673..9489cb5ec 100644 --- a/src/lib/sndfile_decoder.h +++ b/src/lib/sndfile_decoder.h @@ -45,10 +45,12 @@ class SndfileDecoder : public AudioDecoder { public: SndfileDecoder (boost::shared_ptr, DecodeOptions); + ~SndfileDecoder (); bool pass (); private: - std::vector open_files (sf_count_t &); - void close_files (std::vector const &); + std::vector _sndfiles; + sf_count_t _done; + sf_count_t _frames; }; -- 2.30.2