X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fsndfile_decoder.cc;h=e10f4f568430d08dd86d1d5db38d2116606fbbbb;hb=7908592de8bda34f18bd9527975f05c795d93a28;hp=dd9e654c77de7984a4672a7a577fb8d91f340f44;hpb=9bb87e91c0930f16cf615cfc374089912440e5e0;p=dcpomatic.git diff --git a/src/lib/sndfile_decoder.cc b/src/lib/sndfile_decoder.cc index dd9e654c7..e10f4f568 100644 --- a/src/lib/sndfile_decoder.cc +++ b/src/lib/sndfile_decoder.cc @@ -23,6 +23,7 @@ #include "sndfile_decoder.h" #include "film.h" #include "exceptions.h" +#include "audio_buffers.h" #include "i18n.h" @@ -34,11 +35,12 @@ using boost::shared_ptr; SndfileDecoder::SndfileDecoder (shared_ptr f, shared_ptr c) : Decoder (f) - , AudioDecoder (f) + , AudioDecoder (f, c) , _sndfile_content (c) , _deinterleave_buffer (0) { - _sndfile = sf_open (_sndfile_content->file().string().c_str(), SFM_READ, &_info); + _info.format = 0; + _sndfile = sf_open (_sndfile_content->path(0).string().c_str(), SFM_READ, &_info); if (!_sndfile) { throw DecodeError (_("could not open audio file for reading")); } @@ -53,22 +55,22 @@ SndfileDecoder::~SndfileDecoder () delete[] _deinterleave_buffer; } -bool +void SndfileDecoder::pass () { /* 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 = _sndfile_content->audio_frame_rate() / 2; + sf_count_t const block = _sndfile_content->content_audio_frame_rate() / 2; sf_count_t const this_time = min (block, _remaining); int const channels = _sndfile_content->audio_channels (); - shared_ptr audio (new AudioBuffers (channels, this_time)); + shared_ptr data (new AudioBuffers (channels, this_time)); if (_sndfile_content->audio_channels() == 1) { /* No de-interleaving required */ - sf_read_float (_sndfile, audio->data(0), this_time); + sf_read_float (_sndfile, data->data(0), this_time); } else { /* Deinterleave */ if (!_deinterleave_buffer) { @@ -77,7 +79,7 @@ SndfileDecoder::pass () sf_readf_float (_sndfile, _deinterleave_buffer, this_time); vector out_ptr (channels); for (int i = 0; i < channels; ++i) { - out_ptr[i] = audio->data(i); + out_ptr[i] = data->data(i); } float* in_ptr = _deinterleave_buffer; for (int i = 0; i < this_time; ++i) { @@ -87,12 +89,10 @@ SndfileDecoder::pass () } } - audio->set_frames (this_time); - Audio (audio, double(_done) / audio_frame_rate()); + data->set_frames (this_time); + audio (data, _done); _done += this_time; _remaining -= this_time; - - return (_remaining == 0); } int @@ -101,7 +101,7 @@ SndfileDecoder::audio_channels () const return _info.channels; } -ContentAudioFrame +AudioContent::Frame SndfileDecoder::audio_length () const { return _info.frames; @@ -112,3 +112,9 @@ SndfileDecoder::audio_frame_rate () const { return _info.samplerate; } + +bool +SndfileDecoder::done () const +{ + return _audio_position >= _sndfile_content->audio_length (); +}